silcd: Fixed SIGUSR1 signal handling
[silc.git] / apps / silcd / silcd.c
index d367328c6578fdb15942f922e108a2fc7525e4de..de4ad03a6579fbefb9157ca69caf0eb24e2e4e8b 100644 (file)
@@ -309,7 +309,6 @@ SILC_TASK_CALLBACK(dump_stats)
 
 #undef STAT_OUTPUT
 
-#ifdef SILC_DEBUG
   /* Dump internal flags */
   fprintf(fdd, "\nDumping internal flags\n");
   fprintf(fdd, "  server_type            : %d\n", silcd->server_type);
@@ -340,9 +339,9 @@ SILC_TASK_CALLBACK(dump_stats)
       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",
+      fprintf(fdd, "  %d: host %s ip %s port %d type %d idata %p\n",
              sock, hostname ? hostname : "N/A",
-             ip ? ip : "N/A", port, idata ? idata->conn_type : 0);
+             ip ? ip : "N/A", port, idata ? idata->conn_type : 0, idata);
     }
     silc_dlist_uninit(conns);
   }
@@ -361,64 +360,69 @@ SILC_TASK_CALLBACK(dump_stats)
     if (silc_idcache_get_all(silcd->local_list->servers, &list)) {
       c = 1;
       fprintf(fdd, "\nServers in local-list:\n");
+      silc_list_start(list);
       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,
+         fprintf(fdd, "  %d: name %s id %s status 0x%x idata %p\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);
+                 server_entry->data.status, server_entry);
          c++;
       }
     }
     if (silc_idcache_get_all(silcd->global_list->servers, &list)) {
        fprintf(fdd, "\nServers in global-list:\n");
        c = 1;
+        silc_list_start(list);
         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,
+         fprintf(fdd, "  %d: name %s id %s status 0x%x idata %p\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);
+                 server_entry->data.status, server_entry);
          c++;
         }
     }
     if (silc_idcache_get_all(silcd->local_list->clients, &list)) {
        fprintf(fdd, "\nClients in local-list:\n");
        c = 1;
+        silc_list_start(list);
         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,
+         fprintf(fdd, "  %d: name %s id %s status 0x%x from %s idata %p\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");
+                 "N/A" : "local", client_entry);
          c++;
        }
     }
     if (silc_idcache_get_all(silcd->global_list->clients, &list)) {
        fprintf(fdd, "\nClients in global-list:\n");
        c = 1;
+        silc_list_start(list);
         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,
+         fprintf(fdd, "  %d: name %s id %s status 0x%x from %s idata %p\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");
+                 "N/A" : "local", client_entry);
          c++;
        }
     }
     if (silc_idcache_get_all(silcd->local_list->channels, &list)) {
        fprintf(fdd, "\nChannels in local-list:\n");
        c = 1;
+        silc_list_start(list);
         while ((id_cache = silc_list_get(list))) {
          channel_entry = (SilcChannelEntry)id_cache->context;
          fprintf(fdd, "  %d: name %s id %s\n", c,
@@ -431,6 +435,7 @@ SILC_TASK_CALLBACK(dump_stats)
     if (silc_idcache_get_all(silcd->global_list->channels, &list)) {
        fprintf(fdd, "\nChannels in global-list:\n");
        c = 1;
+        silc_list_start(list);
         while ((id_cache = silc_list_get(list))) {
          channel_entry = (SilcChannelEntry)id_cache->context;
          fprintf(fdd, "  %d: name %s id %s\n", c,
@@ -441,7 +446,6 @@ SILC_TASK_CALLBACK(dump_stats)
        }
     }
   }
-#endif
 
   fflush(fdd);
   fclose(fdd);
@@ -462,49 +466,50 @@ static DebugLevel debug_levels[] = {
   { 7, "silcd\\.c,server\\.c,command\\.c,server_backup\\.c,packet_send\\.c" },
 
   /* All basic stuff from silcd/ */
-  { 10, "silc_server_*" },
+  { 10, "silc_server_*,*silc_id_create_*,*idlist*,*skr*" },
 
   /* All from silcd/ */
-  { 15, "*silcd*,*serverid*,silc_server_*,*idlist*" },
+  { 15, "*silcd*,*serverid*,silc_server_*,*idlist*,*skr*" },
 
   /* All from silcd/ and basic stuff from libs */
-  { 20, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcconauth*,*silcske*" },
+  { 20, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcconauth*,*silcske*,"
+    "*skr*" },
 
   /* All from silcd/ and more stuff from libs */
   { 25, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcconauth*,"
-    "*silcpacket*,*ske*,*silcrng*" },
+    "*silcpacket*,*ske*,*silcrng*,*skr*" },
 
   /* All from silcd/ and even more stuff from libs */
-  { 30, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcconauth*,"
+  { 30, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcconauth*,*skr*"
     "*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*,*silcconauth*,"
+  { 35, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcconauth*,*skr*"
     "*silcpacket*,*ske*,*silcrng*,*command*,*channel*,*private*,*notify*"
     "*silcid*,*argument*" },
 
   /* All from silcd/, all from silccore, silccrypt and silcmath */
-  { 40, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcconauth*,"
+  { 40, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcconauth*,*skr*"
     "*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*,*silcconauth*,"
+  { 45, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcconauth*,*skr*"
     "*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*,*silcconauth*,"
+  { 50, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcconauth*,*skr*"
     "*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*,*silcconauth*,"
+  { 55, "*silcd*,*serverid*,silc_server_*,*idlist*,*silcconauth*,*skr*"
     "*silcpacket*,*ske*,*silcrng*,*command*,*channel*,*private*,*notify*"
     "*silcid*,*argument*,*pkcs*,*hmac*,*hash*,*cipher*,silc_math*,*sim*"
     "*sockconn*,*net*,*log*,*config*" },
@@ -557,6 +562,28 @@ void silc_server_stderr(SilcLogType type, char *message)
   }
 }
 
+#ifdef SILC_DEBUG
+#define NUM_DEBUGS 3000
+static char debugs[NUM_DEBUGS][128];
+static int cur_debug = 0;
+
+SilcBool silc_server_debug_callback(char *file, char *function, int line,
+                                   char *message, void *context)
+{
+  SilcTimeStruct curtime;
+
+  /* Save the message to ring buffer */
+  silc_time_value(0, &curtime);
+  silc_snprintf(debugs[cur_debug % NUM_DEBUGS], sizeof(debugs[0]),
+               "%02d:%02d:%02d %s:%d: %s", curtime.hour,
+               curtime.minute, curtime.second, function, line,
+               message);
+  cur_debug++;
+
+  return FALSE;
+}
+#endif /* SILC_DEBUG */
+
 int main(int argc, char **argv)
 {
   int ret, opt, option_index;
@@ -565,6 +592,10 @@ int main(int argc, char **argv)
   char *silcd_config_file = NULL;
   struct sigaction sa;
 
+#ifdef SILC_DEBUG
+  silc_log_set_debug_callbacks(silc_server_debug_callback, NULL, NULL, NULL);
+#endif /* SILC_DEBUG */
+
   /* Parse command line arguments */
   if (argc > 1) {
 #ifdef HAVE_GETOPT_LONG