X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=apps%2Fsilcd%2Fsilcd.c;h=86d75b553536e0c8aa2cfe215003ec570ac1bfd5;hb=c257b555225193e54d85daf541d29578b3c93882;hp=b0155df1edd9990043a43a63324a18cb3297812b;hpb=fde8aa8c7b1952d14fe9275ae36836fe995ea943;p=silc.git diff --git a/apps/silcd/silcd.c b/apps/silcd/silcd.c index b0155df1..86d75b55 100644 --- a/apps/silcd/silcd.c +++ b/apps/silcd/silcd.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 1997 - 2002 Pekka Riikonen + Copyright (C) 1997 - 2003 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 @@ -302,13 +302,175 @@ SILC_TASK_CALLBACK(dump_stats) STAT_OUTPUT(" Authentication failures : %d", silcd->stat.auth_failures); STAT_OUTPUT(" Packets sent : %d", silcd->stat.packets_sent); STAT_OUTPUT(" Packets received : %d", silcd->stat.packets_received); + STAT_OUTPUT(" Connections : %d", silcd->stat.conn_num); #undef STAT_OUTPUT +#ifdef SILC_DEBUG + /* Dump internal flags */ + fprintf(fdd, "\nDumping internal flags\n"); + fprintf(fdd, " server_type : %d\n", silcd->server_type); + fprintf(fdd, " standalone : %d\n", silcd->standalone); + fprintf(fdd, " listenning : %d\n", silcd->listenning); + fprintf(fdd, " background : %d\n", silcd->background); + fprintf(fdd, " backup_router : %d\n", silcd->backup_router); + fprintf(fdd, " backup_primary : %d\n", silcd->backup_primary); + fprintf(fdd, " backup_noswitch : %d\n", silcd->backup_noswitch); + fprintf(fdd, " backup_closed : %d\n", silcd->backup_closed); + fprintf(fdd, " wait_backup : %d\n", silcd->wait_backup); + if (silcd->router) + fprintf(fdd, " primary router : %s\n", + silcd->router->server_name ? silcd->router->server_name : ""); + + /* Dump socket 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); + } + } + + /* Dump lists */ + { + SilcIDCacheList list = NULL; + SilcIDCacheEntry id_cache = NULL; + SilcServerEntry server_entry; + SilcClientEntry client_entry; + SilcChannelEntry channel_entry; + int c; + + 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) { + 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) { + 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) { + 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, + client_entry->nickname ? client_entry->nickname : + (unsigned char *)"N/A", client_entry->id ? + silc_id_render(client_entry->id, SILC_ID_CLIENT) : "N/A", + 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) { + 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, + client_entry->nickname ? client_entry->nickname : + (unsigned char *)"N/A", client_entry->id ? + silc_id_render(client_entry->id, SILC_ID_CLIENT) : "N/A", + 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) { + 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) { + 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 + fflush(fdd); fclose(fdd); } +#ifdef SILC_DEBUG + typedef struct { int level; const char *string; @@ -388,11 +550,12 @@ static void silc_get_debug_level(int level) break; } } +#endif /* SILC_DEBUG */ -/* This function should not be called directly but thru the wrapper - macro SILC_SERVER_LOG_STDERR() */ +/* This function should not be called directly but through the appropriate + wrapper macro defined in server.h */ -void silc_server_stderr(char *message) +void silc_server_stderr(SilcLogType type, char *message) { if (silcd->background) { char *p, *n = message; @@ -407,7 +570,8 @@ void silc_server_stderr(char *message) } *n = 0; - silc_log_output(SILC_LOG_ERROR, message); + /* the message is freed inside the logging function */ + silc_log_output(type, message); } else { fprintf(stderr, "%s\n", message); @@ -435,7 +599,7 @@ 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 - 2002 Pekka Riikonen " + printf("(c) 1997 - 2005 Pekka Riikonen " "\n"); exit(0); break; @@ -539,7 +703,7 @@ int main(int argc, char **argv) if (ret == FALSE) goto fail; - /* Register default crypto stuff since we are going to need them + /* Register default crypto stuff since we are going to need them in the configuration file parsing phase */ silc_cipher_register_default(); silc_pkcs_register_default(); @@ -565,11 +729,21 @@ int main(int argc, char **argv) if (silc_server_init(silcd) == FALSE) goto fail; - /* Ignore SIGPIPE */ + /* Ignore some signals */ sa.sa_handler = SIG_IGN; sa.sa_flags = 0; sigemptyset(&sa.sa_mask); - sigaction(SIGPIPE, &sa, NULL); +#if defined(SIGPIPE) + sigaction(SIGPIPE, &sa, NULL); /* Ignore broken pipes */ +#endif /* SIGPIPE*/ +#if defined(SIGXFSZ) + sigaction(SIGXFSZ, &sa, NULL); /* Ignore file limit exceeds */ +#endif /* SIGXFSZ */ +#if defined(SIGXCPU) + sigaction(SIGXCPU, &sa, NULL); /* Ignore CPU time limit exceeds */ +#endif /* SIGXCPU */ + + /* Handle specificly some other signals. */ sa.sa_handler = signal_handler; sigaction(SIGHUP, &sa, NULL); sigaction(SIGTERM, &sa, NULL);