Do not free packet engine before uninitializing scheduler.
authorPekka Riikonen <priikone@silcnet.org>
Sat, 3 Nov 2007 21:24:13 +0000 (21:24 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Sat, 3 Nov 2007 21:24:13 +0000 (21:24 +0000)
Do not disconnct already disconnected streams.

apps/silcd/server.c
apps/silcd/server_query.c
apps/silcd/silcd.c

index 46fccfc085d68ca3bb47b682dd69c7026be39a14..2680fc7783cf10ec246c923a89134464df4669a0 100644 (file)
@@ -130,7 +130,8 @@ static SilcBool silc_server_packet_receive(SilcPacketEngine engine,
        silc_id_str2id(packet->src_id, packet->src_id_len,
                       packet->src_id_type, &client_id, sizeof(client_id))) {
       if (!SILC_ID_CLIENT_COMPARE(client->id, &client_id)) {
-       SILC_LOG_DEBUG(("Packet source is not same as sender"));
+       SILC_LOG_DEBUG(("Packet source is not same as sender, packet %s",
+                       silc_get_packet_name(packet->type)));
        return FALSE;
       }
     }
@@ -666,6 +667,10 @@ void silc_server_free(SilcServer server)
     }
   }
 
+  silc_schedule_task_del_by_context(server->schedule, server);
+  silc_schedule_uninit(server->schedule);
+  server->schedule = NULL;
+
   silc_idcache_free(server->local_list->clients);
   silc_idcache_free(server->local_list->servers);
   silc_idcache_free(server->local_list->channels);
@@ -683,10 +688,6 @@ void silc_server_free(SilcServer server)
   silc_skr_free(server->repository);
   silc_packet_engine_stop(server->packet_engine);
 
-  silc_schedule_task_del_by_context(server->schedule, server);
-  silc_schedule_uninit(server->schedule);
-  server->schedule = NULL;
-
   silc_free(server->local_list);
   silc_free(server->global_list);
   silc_free(server->server_name);
@@ -915,15 +916,19 @@ SilcBool silc_server_init(SilcServer server)
     }
   }
 
+  if (server->server_type != SILC_ROUTER) {
+    server->stat.servers = 1;
+    server->stat.cell_servers = 1;
+  } else {
+    server->stat.routers = 1;
+  }
+
   /* If we are normal server we'll retrieve network statisticial information
      once in a while from the router. */
   if (server->server_type != SILC_ROUTER)
     silc_schedule_task_add_timeout(server->schedule, silc_server_get_stats,
                                   server, 10, 0);
 
-  if (server->server_type == SILC_ROUTER)
-    server->stat.routers++;
-
   /* Start packet engine */
   server->packet_engine =
     silc_packet_engine_start(server->rng, server->server_type == SILC_ROUTER,
@@ -1202,6 +1207,9 @@ void silc_server_stop(SilcServer server)
     while ((ps = silc_dlist_get(list))) {
       SilcIDListData idata = silc_packet_get_context(ps);
 
+      if (!silc_packet_stream_is_valid(ps))
+       continue;
+
       if (idata)
        idata->status &= ~SILC_IDLIST_STATUS_DISABLED;
 
@@ -1227,6 +1235,8 @@ void silc_server_stop(SilcServer server)
                                     silc_server_connect_router);
   silc_schedule_task_del_by_callback(server->schedule,
                                     silc_server_connect_to_router_retry);
+  silc_schedule_task_del_by_callback(server->schedule,
+                                    silc_server_connect_to_router);
 
   silc_schedule_stop(server->schedule);
 
@@ -1373,6 +1383,12 @@ silc_server_ke_auth_compl(SilcConnAuth connauth, SilcBool success,
       return;
     }
 
+    /* Statistics */
+    server->stat.my_servers++;
+    if (server->server_type == SILC_ROUTER)
+      server->stat.servers++;
+    SILC_LOG_DEBUG(("my_servers %d", server->stat.my_servers));
+
     silc_idlist_add_data(id_entry, (SilcIDListData)entry);
     break;
 
@@ -1443,6 +1459,12 @@ silc_server_ke_auth_compl(SilcConnAuth connauth, SilcBool success,
                      SILC_IDLIST_STATUS_LOCAL);
     idata->sconn = sconn;
 
+    /* Statistics */
+    server->stat.my_routers++;
+    if (server->server_type == SILC_ROUTER)
+      server->stat.routers++;
+    SILC_LOG_DEBUG(("my_routers %d", server->stat.my_routers));
+
     if (!sconn->backup) {
       /* Mark this router our primary router if we're still standalone */
       if (server->standalone) {
@@ -1528,7 +1550,6 @@ silc_server_ke_auth_compl(SilcConnAuth connauth, SilcBool success,
   /* Set the entry as packet stream context */
   silc_packet_set_context(sconn->sock, id_entry);
 
- out:
   /* Call the completion callback to indicate that we've connected to
      the router */
   if (sconn && sconn->callback)
index cd5103a4a28a6033c052f62df79a8bb3dc98a4c7..0725286c68efcca6da53b61b3b4bb1fd396f1b8d 100644 (file)
@@ -397,11 +397,11 @@ void silc_server_query_send_router_reply(void *context, void *reply)
        returned error. */
     if (query->nick_server[0] && !query->dynamic_retry &&
        !silc_server_num_sockets_by_remote(server, query->nick_server,
-                                          query->nick_server, 1334, type)) {
+                                          query->nick_server, 706, type)) {
       SILC_LOG_DEBUG(("Retry query by connecting to %s:%d",
                      query->nick_server, 706));
       silc_server_create_connection(server, FALSE, TRUE, query->nick_server,
-                                   1334, silc_server_query_connected,
+                                   706, silc_server_query_connected,
                                    query);
       query->dynamic_retry = TRUE;
       query->resolved = FALSE;
index 14e3657f968d6fd64e6fdbb4b09caf8f00ea215a..19ba9193c4c14235d7a9aa99759f4f8aef0036f6 100644 (file)
@@ -245,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 */
@@ -754,8 +752,7 @@ int main(int argc, char **argv)
      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);