X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Firssi%2Fsrc%2Fsilc%2Fcore%2Fsilc-core.c;h=8253713d99296961144c5f3f49c68ade0519f3a8;hb=HEAD;hp=0ef483265ff7348e56d35ac264ad1829606225a2;hpb=46544fe1da7325ffa60b9732867acb2c6de6e10c;p=silc.git diff --git a/apps/irssi/src/silc/core/silc-core.c b/apps/irssi/src/silc/core/silc-core.c index 0ef48326..8253713d 100644 --- a/apps/irssi/src/silc/core/silc-core.c +++ b/apps/irssi/src/silc/core/silc-core.c @@ -50,7 +50,7 @@ static int opt_bits = 0; static int init_failed = 0; #endif -static int idletag = -1; +static int running = 0; /* SILC Client */ SilcClient silc_client = NULL; @@ -76,10 +76,62 @@ void silc_lag_deinit(void); void silc_core_deinit(void); #endif -static int my_silc_scheduler(void) +static gboolean my_silc_scheduler(gpointer data) { + SILC_LOG_DEBUG(("Timeout")); silc_client_run_one(silc_client); - return 1; + return FALSE; +} + +static gboolean my_silc_scheduler_fd(GIOChannel *source, + GIOCondition condition, + gpointer data) +{ + SILC_LOG_DEBUG(("I/O event, %d", SILC_PTR_TO_32(data))); + silc_client_run_one(silc_client); + return TRUE; +} + +static void scheduler_notify_cb(SilcSchedule schedule, + SilcBool added, SilcTask task, + SilcBool fd_task, SilcUInt32 fd, + SilcTaskEvent event, + long seconds, long useconds, + void *context) +{ + if (added) { + if (fd_task) { + /* Add fd */ + GIOChannel *ch; + guint e = 0; + + SILC_LOG_DEBUG(("Add fd %d, events %d", fd, event)); + g_source_remove_by_user_data(SILC_32_TO_PTR(fd)); + + if (event & SILC_TASK_READ) + e |= (G_IO_IN | G_IO_PRI | G_IO_HUP | G_IO_ERR); + if (event & SILC_TASK_WRITE) + e |= (G_IO_OUT | G_IO_HUP | G_IO_ERR | G_IO_NVAL); + + if (e) { + ch = g_io_channel_unix_new(fd); + g_io_add_watch(ch, e, my_silc_scheduler_fd, SILC_32_TO_PTR(fd)); + g_io_channel_unref(ch); + } + } else { + /* Add timeout */ + guint t; + + t = (seconds * 1000) + (useconds / 1000); + SILC_LOG_DEBUG(("interval %d msec", t)); + g_timeout_add(t, my_silc_scheduler, NULL); + } + } else { + if (fd_task) { + /* Remove fd */ + g_source_remove_by_user_data(SILC_32_TO_PTR(fd)); + } + } } static CHATNET_REC *create_chatnet(void) @@ -244,15 +296,12 @@ static void silc_register_cipher(SilcClient client, const char *cipher) SILC_LOG_ERROR(("Unknown cipher `%s'", cipher)); #ifdef SILC_PLUGIN init_failed = -1; - returnn; + return; #else exit(1); #endif } } - - /* Register other defaults */ - silc_cipher_register_default(); } static void silc_register_hash(SilcClient client, const char *hash) @@ -270,15 +319,12 @@ static void silc_register_hash(SilcClient client, const char *hash) SILC_LOG_ERROR(("Unknown hash function `%s'", hash)); #ifdef SILC_PLUGIN init_failed = -1; - returnn; + return; #else exit(1); #endif } } - - /* Register other defaults */ - silc_hash_register_default(); } static void silc_register_hmac(SilcClient client, const char *hmac) @@ -296,15 +342,12 @@ static void silc_register_hmac(SilcClient client, const char *hmac) SILC_LOG_ERROR(("Unknown HMAC `%s'", hmac)); #ifdef SILC_PLUGIN init_failed = -1; - returnn; + return; #else exit(1); #endif } } - - /* Register other defaults */ - silc_hmac_register_default(); } /* Finalize init. Init finish signal calls this. */ @@ -356,7 +399,6 @@ void silc_opt_callback(poptContext con, if ((argc == 2) && (strcasecmp(argv[1], "list-ciphers") == 0)) { #else if (strcmp(opt->longName, "list-ciphers") == 0) { - silc_cipher_register_default(); #endif silc_client_list_ciphers(); FUNCTION_EXIT; @@ -366,7 +408,6 @@ void silc_opt_callback(poptContext con, if ((argc == 2) && (strcasecmp(argv[1], "list-hash-funcs") == 0)) { #else if (strcmp(opt->longName, "list-hash-funcs") == 0) { - silc_hash_register_default(); #endif silc_client_list_hash_funcs(); FUNCTION_EXIT; @@ -376,7 +417,6 @@ void silc_opt_callback(poptContext con, if ((argc == 2) && (strcasecmp(argv[1], "list-hmacs") == 0)) { #else if (strcmp(opt->longName, "list-hmacs") == 0) { - silc_hmac_register_default(); #endif silc_client_list_hmacs(); FUNCTION_EXIT; @@ -386,7 +426,6 @@ void silc_opt_callback(poptContext con, if ((argc == 2) && (strcasecmp(argv[1], "list-pkcs") == 0)) { #else if (strcmp(opt->longName, "list-pkcs") == 0) { - silc_pkcs_register_default(); #endif silc_client_list_pkcs(); FUNCTION_EXIT; @@ -482,10 +521,7 @@ void silc_opt_callback(poptContext con, MSGLEVEL_CRAP, SILCTXT_CONFIG_NEXTTIME); goto out; #else - silc_cipher_register_default(); - silc_pkcs_register_default(); - silc_hash_register_default(); - silc_hmac_register_default(); + silc_crypto_init(NULL); silc_create_key_pair(opt_pkcs, opt_bits, NULL, NULL, NULL, NULL, NULL, NULL, TRUE); exit(0); @@ -510,10 +546,7 @@ void silc_opt_callback(poptContext con, ENTRY_REDIRECT_FLAG_HIDDEN, rec); goto out; #else - silc_cipher_register_default(); - silc_pkcs_register_default(); - silc_hash_register_default(); - silc_hmac_register_default(); + silc_crypto_init(NULL); silc_change_private_key_passphrase(arg, NULL, NULL); exit(0); #endif @@ -522,10 +555,7 @@ void silc_opt_callback(poptContext con, #ifndef SILC_PLUGIN if (strcmp(opt->longName, "show-key") == 0) { /* Dump the key */ - silc_cipher_register_default(); - silc_pkcs_register_default(); - silc_hash_register_default(); - silc_hmac_register_default(); + silc_crypto_init(NULL); silc_show_public_key_file((char *)arg); exit(0); } @@ -549,20 +579,11 @@ out: #undef FUNCTION_EXIT /* Called to indicate the client library has stopped. */ - static void silc_stopped(SilcClient client, void *context) { SILC_LOG_DEBUG(("Client library has stopped")); - if (idletag != -1) - g_source_remove(idletag); - signal_emit("chat protocol deinit", 1, - chat_protocol_find("SILC")); -} - -static void sig_gui_quit(SILC_SERVER_REC *server, const char *msg) -{ - silc_client_stop(silc_client, silc_stopped, NULL); + *(int*)context = -1; } /* Called to indicate the client library is running. */ @@ -570,6 +591,7 @@ static void sig_gui_quit(SILC_SERVER_REC *server, const char *msg) static void silc_running(SilcClient client, void *context) { + running = 1; SILC_LOG_DEBUG(("Client library is running")); } @@ -611,6 +633,8 @@ static void sig_init_finished(void) return; } + silc_schedule_set_notify(silc_client->schedule, scheduler_notify_cb, NULL); + silc_log_set_callback(SILC_LOG_INFO, silc_log_misc, NULL); silc_log_set_callback(SILC_LOG_WARNING, silc_log_misc, NULL); silc_log_set_callback(SILC_LOG_ERROR, silc_log_misc, NULL); @@ -618,8 +642,8 @@ static void sig_init_finished(void) silc_hash_alloc("sha1", &sha1hash); - /* register SILC scheduler */ - idletag = g_timeout_add(5, (GSourceFunc) my_silc_scheduler, NULL); + /* Run SILC scheduler */ + my_silc_scheduler(NULL); } /* Init SILC. Called from src/fe-text/silc.c */ @@ -708,7 +732,6 @@ void silc_core_init(void) #ifndef SILC_PLUGIN signal_add("irssi init finished", (SIGNAL_FUNC) sig_init_finished); #endif - signal_add("gui exit", (SIGNAL_FUNC) sig_gui_quit); #if defined (SILC_PLUGIN) && defined (SILC_DEBUG) if (settings_get_bool("debug") == TRUE) @@ -725,6 +748,7 @@ void silc_core_init(void) /* Initialize client parameters */ memset(¶ms, 0, sizeof(params)); strcat(params.nickname_format, settings_get_str("nickname_format")); + params.full_channel_names = TRUE; /* Allocate SILC client */ silc_client = silc_client_alloc(&ops, ¶ms, NULL, silc_version_string); @@ -748,7 +772,6 @@ void silc_core_init(void) if (init_failed) return; #endif - silc_pkcs_register_default(); #ifdef SILC_PLUGIN command_bind("silc", MODULE_NAME, (SIGNAL_FUNC) silc_opt_callback); @@ -798,8 +821,12 @@ void silc_core_init(void) void silc_core_deinit(void) { - if (idletag != -1) - g_source_remove(idletag); + if (running) { + volatile int stopped = 0; + silc_client_stop(silc_client, silc_stopped, (void *)&stopped); + while (!stopped) + silc_client_run_one(silc_client); + } if (opt_hostname) silc_free(opt_hostname); @@ -807,13 +834,14 @@ void silc_core_deinit(void) g_free(opt_nickname); signal_remove("setup changed", (SIGNAL_FUNC) sig_setup_changed); - signal_remove("gui exit", (SIGNAL_FUNC) sig_gui_quit); #ifdef SILC_PLUGIN command_unbind("silc", (SIGNAL_FUNC) silc_opt_callback); #else signal_remove("irssi init finished", (SIGNAL_FUNC) sig_init_finished); #endif + signal_emit("chat protocol deinit", 1, chat_protocol_find("SILC")); + silc_hash_free(sha1hash); silc_queue_deinit(); @@ -826,7 +854,9 @@ void silc_core_deinit(void) chat_protocol_unregister("SILC"); - silc_pkcs_public_key_free(irssi_pubkey); - silc_pkcs_private_key_free(irssi_privkey); + if (irssi_pubkey) + silc_pkcs_public_key_free(irssi_pubkey); + if (irssi_privkey) + silc_pkcs_private_key_free(irssi_privkey); silc_client_free(silc_client); }