X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Fsilcd%2Fsilcd.c;h=d367328c6578fdb15942f922e108a2fc7525e4de;hb=805fddcf6431e784f9f77114782a90c9d12f9cbe;hp=10222098a6d152a058fae57afb43ebda638211b4;hpb=816a5b080c797c0db47b7b274a85646343c3466e;p=silc.git diff --git a/apps/silcd/silcd.c b/apps/silcd/silcd.c index 10222098..d367328c 100644 --- a/apps/silcd/silcd.c +++ b/apps/silcd/silcd.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 1997 - 2005 Pekka Riikonen + Copyright (C) 1997 - 2007 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,6 +33,7 @@ static SilcServer silcd; static void silc_usage(void); +#ifdef HAVE_GETOPT_LONG /* Long command line options */ static struct option long_opts[] = { @@ -53,6 +54,7 @@ static struct option long_opts[] = { NULL, 0, NULL, 0 } }; +#endif /* HAVE_GETOPT_LONG */ /* Command line option variables */ static char *opt_keypath = NULL; @@ -232,12 +234,6 @@ static void silc_server_daemonise(SilcServer server) to stderr are changed to SILC_SERVER_LOG_ERROR() */ } -static void signal_handler(int sig) -{ - /* Mark the signal to be caller after this signal is over. */ - silc_schedule_signal_call(silcd->schedule, sig); -} - SILC_TASK_CALLBACK(got_hup) { /* First, reset all log files (they might have been deleted) */ @@ -249,9 +245,7 @@ SILC_TASK_CALLBACK(got_hup) SILC_TASK_CALLBACK(stop_server) { - /* Stop scheduler, the program will stop eventually after noticing - that the scheduler is down. */ - silc_schedule_stop(silcd->schedule); + silc_server_stop(silcd); } /* Dump server statistics into a file into /tmp directory */ @@ -259,13 +253,21 @@ SILC_TASK_CALLBACK(stop_server) SILC_TASK_CALLBACK(dump_stats) { FILE *fdd; + int fild; char filename[256]; memset(filename, 0, sizeof(filename)); - snprintf(filename, sizeof(filename) - 1, "/tmp/silcd.%d.stats", getpid()); - fdd = fopen(filename, "w+"); - if (!fdd) + snprintf(filename, sizeof(filename) - 1, "/tmp/silcd.%d.stats-XXXXXX", getpid()); + fild = mkstemp(filename); + if (fild == -1) + return; + + fdd = fdopen(fild, "w"); + if (fdd == NULL) { + close(fild); + unlink(filename); return; + } #define STAT_OUTPUT(fmt, stat) fprintf(fdd, fmt "\n", (int)stat); @@ -323,26 +325,31 @@ SILC_TASK_CALLBACK(dump_stats) fprintf(fdd, " primary router : %s\n", silcd->router->server_name ? silcd->router->server_name : ""); - /* Dump socket connections */ + /* Dump connections */ { - int i; - SilcSocketConnection s; - - fprintf(fdd, "\nDumping socket connections\n"); - for (i = 0; i < silcd->config->param.connections_max; i++) { - s = silcd->sockets[i]; - if (!s) - continue; - fprintf(fdd, " %d: host %s ip %s port %d type %d flags 0x%x\n", - s->sock, s->hostname ? s->hostname : "N/A", - s->ip ? s->ip : "N/A", s->port, s->type, - (unsigned int)s->flags); + SilcPacketStream s; + SilcDList conns = silc_packet_engine_get_streams(silcd->packet_engine); + + fprintf(fdd, "\nDumping connections\n"); + silc_dlist_start(conns); + while ((s = silc_dlist_get(conns))) { + const char *hostname, *ip; + SilcUInt16 port; + SilcSocket sock; + SilcIDListData idata = silc_packet_get_context(s); + if (!silc_socket_stream_get_info(silc_packet_stream_get_stream(s), + &sock, &hostname, &ip, &port)) + continue; + fprintf(fdd, " %d: host %s ip %s port %d type %d\n", + sock, hostname ? hostname : "N/A", + ip ? ip : "N/A", port, idata ? idata->conn_type : 0); } + silc_dlist_uninit(conns); } /* Dump lists */ { - SilcIDCacheList list = NULL; + SilcList list; SilcIDCacheEntry id_cache = NULL; SilcServerEntry server_entry; SilcClientEntry client_entry; @@ -352,46 +359,35 @@ SILC_TASK_CALLBACK(dump_stats) fprintf(fdd, "\nDumping databases\n"); if (silc_idcache_get_all(silcd->local_list->servers, &list)) { - if (silc_idcache_list_first(list, &id_cache)) { - fprintf(fdd, "\nServers in local-list:\n"); - c = 1; - while (id_cache) { + c = 1; + fprintf(fdd, "\nServers in local-list:\n"); + while ((id_cache = silc_list_get(list))) { server_entry = (SilcServerEntry)id_cache->context; fprintf(fdd, " %d: name %s id %s status 0x%x\n", c, server_entry->server_name ? server_entry->server_name : "N/A", server_entry->id ? silc_id_render(server_entry->id, SILC_ID_SERVER) : "N/A", server_entry->data.status); - if (!silc_idcache_list_next(list, &id_cache)) - break; c++; - } } - silc_idcache_list_free(list); } if (silc_idcache_get_all(silcd->global_list->servers, &list)) { - if (silc_idcache_list_first(list, &id_cache)) { fprintf(fdd, "\nServers in global-list:\n"); c = 1; - while (id_cache) { + while ((id_cache = silc_list_get(list))) { server_entry = (SilcServerEntry)id_cache->context; fprintf(fdd, " %d: name %s id %s status 0x%x\n", c, server_entry->server_name ? server_entry->server_name : "N/A", server_entry->id ? silc_id_render(server_entry->id, SILC_ID_SERVER) : "N/A", server_entry->data.status); - if (!silc_idcache_list_next(list, &id_cache)) - break; c++; - } - } - silc_idcache_list_free(list); + } } if (silc_idcache_get_all(silcd->local_list->clients, &list)) { - if (silc_idcache_list_first(list, &id_cache)) { fprintf(fdd, "\nClients in local-list:\n"); c = 1; - while (id_cache) { + while ((id_cache = silc_list_get(list))) { client_entry = (SilcClientEntry)id_cache->context; server_entry = client_entry->router; fprintf(fdd, " %d: name %s id %s status 0x%x from %s\n", c, @@ -401,18 +397,13 @@ SILC_TASK_CALLBACK(dump_stats) client_entry->data.status, server_entry ? server_entry->server_name ? server_entry->server_name : "N/A" : "local"); - if (!silc_idcache_list_next(list, &id_cache)) - break; c++; } - } - silc_idcache_list_free(list); } if (silc_idcache_get_all(silcd->global_list->clients, &list)) { - if (silc_idcache_list_first(list, &id_cache)) { fprintf(fdd, "\nClients in global-list:\n"); c = 1; - while (id_cache) { + while ((id_cache = silc_list_get(list))) { client_entry = (SilcClientEntry)id_cache->context; server_entry = client_entry->router; fprintf(fdd, " %d: name %s id %s status 0x%x from %s\n", c, @@ -422,46 +413,32 @@ SILC_TASK_CALLBACK(dump_stats) client_entry->data.status, server_entry ? server_entry->server_name ? server_entry->server_name : "N/A" : "local"); - if (!silc_idcache_list_next(list, &id_cache)) - break; c++; } - } - silc_idcache_list_free(list); } if (silc_idcache_get_all(silcd->local_list->channels, &list)) { - if (silc_idcache_list_first(list, &id_cache)) { fprintf(fdd, "\nChannels in local-list:\n"); c = 1; - while (id_cache) { + while ((id_cache = silc_list_get(list))) { channel_entry = (SilcChannelEntry)id_cache->context; fprintf(fdd, " %d: name %s id %s\n", c, channel_entry->channel_name ? channel_entry->channel_name : "N/A", channel_entry->id ? silc_id_render(channel_entry->id, SILC_ID_CHANNEL) : "N/A"); - if (!silc_idcache_list_next(list, &id_cache)) - break; c++; } - } - silc_idcache_list_free(list); } if (silc_idcache_get_all(silcd->global_list->channels, &list)) { - if (silc_idcache_list_first(list, &id_cache)) { fprintf(fdd, "\nChannels in global-list:\n"); c = 1; - while (id_cache) { + while ((id_cache = silc_list_get(list))) { channel_entry = (SilcChannelEntry)id_cache->context; fprintf(fdd, " %d: name %s id %s\n", c, channel_entry->channel_name ? channel_entry->channel_name : "N/A", channel_entry->id ? silc_id_render(channel_entry->id, SILC_ID_CHANNEL) : "N/A"); - if (!silc_idcache_list_next(list, &id_cache)) - break; c++; } - } - silc_idcache_list_free(list); } } #endif @@ -491,43 +468,43 @@ static DebugLevel debug_levels[] = { { 15, "*silcd*,*serverid*,silc_server_*,*idlist*" }, /* All from silcd/ and basic stuff from libs */ - { 20, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*,*silcske*" }, + { 20, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcconauth*,*silcske*" }, /* All from silcd/ and more stuff from libs */ - { 25, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*," + { 25, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcconauth*," "*silcpacket*,*ske*,*silcrng*" }, /* All from silcd/ and even more stuff from libs */ - { 30, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*," + { 30, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcconauth*," "*silcpacket*,*ske*,*silcrng*,*command*,*channel*,*private*,*notify*" }, /* All from silcd/ and even more stuff from libs + all from silccore */ - { 35, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*," + { 35, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcconauth*," "*silcpacket*,*ske*,*silcrng*,*command*,*channel*,*private*,*notify*" "*silcid*,*argument*" }, /* All from silcd/, all from silccore, silccrypt and silcmath */ - { 40, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*," + { 40, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcconauth*," "*silcpacket*,*ske*,*silcrng*,*command*,*channel*,*private*,*notify*" "*silcid*,*argument*,*pkcs*,*hmac*,*hash*,*cipher*,silc_math*" }, /* All from silcd/, all from silccore, silccrypt and silcmath + stuff from silcutil */ - { 45, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*," + { 45, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcconauth*," "*silcpacket*,*ske*,*silcrng*,*command*,*channel*,*private*,*notify*" "*silcid*,*argument*,*pkcs*,*hmac*,*hash*,*cipher*,silc_math*,*sim*" "*sockconn*" }, /* All from silcd/, all from silccore, silccrypt and silcmath + more stuff from silcutil */ - { 50, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*," + { 50, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcconauth*," "*silcpacket*,*ske*,*silcrng*,*command*,*channel*,*private*,*notify*" "*silcid*,*argument*,*pkcs*,*hmac*,*hash*,*cipher*,silc_math*,*sim*" "*sockconn*,*net*" }, /* All from silcd/, all from silccore, silccrypt and silcmath + more stuff from silcutil */ - { 55, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcauth*," + { 55, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcconauth*," "*silcpacket*,*ske*,*silcrng*,*command*,*channel*,*private*,*notify*" "*silcid*,*argument*,*pkcs*,*hmac*,*hash*,*cipher*,silc_math*,*sim*" "*sockconn*,*net*,*log*,*config*" }, @@ -583,15 +560,19 @@ void silc_server_stderr(SilcLogType type, char *message) int main(int argc, char **argv) { int ret, opt, option_index; - bool foreground = FALSE; - bool opt_create_keypair = FALSE; + SilcBool foreground = FALSE; + SilcBool opt_create_keypair = FALSE; char *silcd_config_file = NULL; struct sigaction sa; /* Parse command line arguments */ if (argc > 1) { +#ifdef HAVE_GETOPT_LONG while ((opt = getopt_long(argc, argv, "f:p:d:D:xhFVC:", long_opts, &option_index)) != EOF) { +#else + while ((opt = getopt(argc, argv, "f:p:d:D:xhFVC:")) != EOF) { +#endif /* HAVE_GETOPT_LONG */ switch(opt) { case 'h': silc_usage(); @@ -600,17 +581,17 @@ int main(int argc, char **argv) printf("SILCd Secure Internet Live Conferencing daemon, " "version %s (base: SILC Toolkit %s)\n", silc_dist_version, silc_version); - printf("(c) 1997 - 2005 Pekka Riikonen " + printf("(c) 1997 - 2007 Pekka Riikonen " "\n"); exit(0); break; case 'd': #ifdef SILC_DEBUG - silc_debug = TRUE; + silc_log_debug(TRUE); + silc_log_quick(TRUE); if (optarg) silc_log_set_debug_string(optarg); foreground = TRUE; /* implied */ - silc_log_quick = TRUE; /* implied */ #else fprintf(stderr, "Run-time debugging is not enabled. To enable it recompile\n" @@ -619,11 +600,11 @@ int main(int argc, char **argv) break; case 'D': #ifdef SILC_DEBUG - silc_debug = TRUE; + silc_log_debug(TRUE); + silc_log_quick(TRUE); if (optarg) silc_get_debug_level(atoi(optarg)); foreground = TRUE; /* implied */ - silc_log_quick = TRUE; /* implied */ #else fprintf(stderr, "Run-time debugging is not enabled. To enable it recompile\n" @@ -632,10 +613,10 @@ int main(int argc, char **argv) break; case 'x': #ifdef SILC_DEBUG - silc_debug_hexdump = TRUE; - silc_debug = TRUE; /* implied */ + silc_log_debug(TRUE); + silc_log_debug_hexdump(TRUE); + silc_log_quick(TRUE); foreground = TRUE; /* implied */ - silc_log_quick = TRUE; /* implied */ #else fprintf(stderr, "Run-time debugging is not enabled. To enable it recompile\n" @@ -690,8 +671,9 @@ int main(int argc, char **argv) silc_pkcs_register_default(); silc_hash_register_default(); silc_hmac_register_default(); - silc_create_key_pair(opt_pkcs, opt_bits, pubfile, prvfile, - opt_identifier, "", NULL, NULL, NULL, FALSE); + if (!silc_create_key_pair(opt_pkcs, opt_bits, pubfile, prvfile, + opt_identifier, "", NULL, NULL, FALSE)) + exit(1); exit(0); } @@ -712,14 +694,15 @@ int main(int argc, char **argv) silc_hmac_register_default(); /* Read configuration files */ - silcd->config = silc_server_config_alloc(silcd_config_file); + silcd->config = silc_server_config_alloc(silcd_config_file, silcd); if (silcd->config == NULL) goto fail; silcd->config_file = silcd_config_file; /* Unregister the default crypto stuff so that configuration takes effect */ silc_cipher_unregister_all(); - silc_pkcs_unregister_all(); + /* silc_pkcs_unregister_all(); MUST NOT do this anymore; SilcPublicKey + parsed from config file references pointers so we cannot unregister */ silc_hash_unregister_all(); silc_hmac_unregister_all(); @@ -745,15 +728,10 @@ int main(int argc, char **argv) #endif /* SIGXCPU */ /* Handle specificly some other signals. */ - sa.sa_handler = signal_handler; - sigaction(SIGHUP, &sa, NULL); - sigaction(SIGTERM, &sa, NULL); - sigaction(SIGINT, &sa, NULL); - sigaction(SIGUSR1, &sa, NULL); - silc_schedule_signal_register(silcd->schedule, SIGHUP, got_hup, NULL); - silc_schedule_signal_register(silcd->schedule, SIGTERM, stop_server, NULL); - silc_schedule_signal_register(silcd->schedule, SIGINT, stop_server, NULL); - silc_schedule_signal_register(silcd->schedule, SIGUSR1, dump_stats, NULL); + silc_schedule_task_add_signal(silcd->schedule, SIGHUP, got_hup, NULL); + silc_schedule_task_add_signal(silcd->schedule, SIGTERM, stop_server, NULL); + silc_schedule_task_add_signal(silcd->schedule, SIGINT, stop_server, NULL); + silc_schedule_task_add_signal(silcd->schedule, SIGUSR1, dump_stats, NULL); if (!foreground) { /* Before running the server, fork to background. */ @@ -766,19 +744,15 @@ int main(int argc, char **argv) snprintf(buf, sizeof(buf) - 1, "%d\n", getpid()); silc_file_writefile(pidfile, buf, strlen(buf)); } - } - /* Drop root if we are not in debug mode, so you don't need to bother about - file writing permissions and so on */ - if (!silc_debug) - silc_server_drop_privs(silcd); + } + silc_server_drop_privs(silcd); /* Run the server. When this returns the server has been stopped and we will exit. */ silc_server_run(silcd); - /* Stop the server and free it. */ - silc_server_stop(silcd); + /* Free server */ silc_server_config_destroy(silcd->config); silc_server_free(silcd);