+ CHAT_PROTOCOL_REC *rec;
+ SilcClientParams params;
+
+ if (opt_create_keypair == TRUE) {
+ /* Create new key pair and exit */
+ silc_cipher_register_default();
+ silc_pkcs_register_default();
+ silc_hash_register_default();
+ silc_hmac_register_default();
+ silc_client_create_key_pair(opt_pkcs, opt_bits,
+ NULL, NULL, NULL, NULL, NULL);
+ exit(0);
+ }
+
+ if (opt_keyfile) {
+ /* Dump the key */
+ silc_cipher_register_default();
+ silc_pkcs_register_default();
+ silc_hash_register_default();
+ silc_hmac_register_default();
+ silc_client_show_key(opt_keyfile);
+ exit(0);
+ }
+
+ if (opt_list_ciphers) {
+ silc_cipher_register_default();
+ silc_client_list_ciphers();
+ exit(0);
+ }
+
+ if (opt_list_hash) {
+ silc_hash_register_default();
+ silc_client_list_hash_funcs();
+ exit(0);
+ }
+
+ if (opt_list_hmac) {
+ silc_hmac_register_default();
+ silc_client_list_hmacs();
+ exit(0);
+ }
+
+ if (opt_list_pkcs) {
+ silc_pkcs_register_default();
+ silc_client_list_pkcs();
+ exit(0);
+ }
+
+ if (opt_version) {
+ printf("SILC Secure Internet Live Conferencing, version %s\n",
+ silc_version);
+ printf("(c) 1997 - 2001 Pekka Riikonen <priikone@silcnet.org>\n");
+ exit(0);
+ }
+
+ silc_debug = opt_debug;
+ silc_log_set_callbacks(silc_log_info, silc_log_warning,
+ silc_log_error, NULL);
+
+ /* Do some irssi initializing */
+ settings_add_bool("server", "skip_motd", FALSE);
+ settings_add_str("server", "alternate_nick", NULL);
+ silc_init_userinfo();
+
+ /* Initialize client parameters */
+ memset(¶ms, 0, sizeof(params));
+ strcat(params.nickname_format, "%n@%h%a");
+ params.nickname_parse = silc_nickname_format_parse;
+
+ /* Allocate SILC client */
+ silc_client = silc_client_alloc(&ops, ¶ms, NULL, silc_version_string);
+
+ /* Load local config file */
+ silc_config = silc_client_config_alloc(SILC_CLIENT_HOME_CONFIG_FILE);
+
+ /* Get user information */
+ silc_client->username = g_strdup(settings_get_str("user_name"));
+ silc_client->hostname = silc_net_localhost();
+ silc_client->realname = g_strdup(settings_get_str("real_name"));
+
+ /* Register all configured ciphers, PKCS and hash functions. */
+ if (silc_config) {
+ silc_config->client = silc_client;
+ if (!silc_client_config_register_ciphers(silc_config))
+ silc_cipher_register_default();
+ if (!silc_client_config_register_pkcs(silc_config))
+ silc_pkcs_register_default();
+ if (!silc_client_config_register_hashfuncs(silc_config))
+ silc_hash_register_default();
+ if (!silc_client_config_register_hmacs(silc_config))
+ silc_hmac_register_default();
+ } else {
+ /* Register default ciphers, pkcs, hash funtions and hmacs. */
+ silc_cipher_register_default();
+ silc_pkcs_register_default();
+ silc_hash_register_default();
+ silc_hmac_register_default();
+ }
+
+ /* Check ~/.silc directory and public and private keys */
+ if (silc_client_check_silc_dir() == FALSE) {
+ idletag = -1;
+ return;
+ }
+
+ /* Load public and private key */
+ if (silc_client_load_keys(silc_client) == FALSE) {
+ idletag = -1;
+ return;
+ }
+
+ /* Initialize the SILC client */
+ if (!silc_client_init(silc_client)) {
+ idletag = -1;
+ return;
+ }
+
+ /* Register SILC to the irssi */
+ rec = g_new0(CHAT_PROTOCOL_REC, 1);
+ rec->name = "SILC";
+ rec->fullname = "Secure Internet Live Conferencing";
+ rec->chatnet = "silcnet";
+ rec->create_chatnet = create_chatnet;
+ rec->create_server_setup = create_server_setup;
+ rec->create_channel_setup = create_channel_setup;
+ rec->create_server_connect = create_server_connect;
+ rec->server_connect = (SERVER_REC *(*) (SERVER_CONNECT_REC *))
+ silc_server_connect;
+ rec->channel_create = (CHANNEL_REC *(*) (SERVER_REC *, const char *, int))
+ silc_channel_create;
+ rec->query_create = (QUERY_REC *(*) (const char *, const char *, int))
+ silc_query_create;
+
+ chat_protocol_register(rec);
+ g_free(rec);
+
+ silc_server_init();
+ silc_channels_init();
+ silc_queries_init();
+
+ idletag = g_timeout_add(50, (GSourceFunc) my_silc_scheduler, NULL);