Send DISCONNECT in close command.
authorPekka Riikonen <priikone@silcnet.org>
Tue, 21 Jan 2003 18:12:49 +0000 (18:12 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Tue, 21 Jan 2003 18:12:49 +0000 (18:12 +0000)
Better check whether we are connecting to remote router before
reconnecting.

CHANGES
apps/silcd/command.c
apps/silcd/packet_receive.c
apps/silcd/server.c
apps/silcd/server_backup.c
apps/silcd/server_util.c
apps/silcd/server_util.h

diff --git a/CHANGES b/CHANGES
index 1389e250a7621a5fab8d5c4d9b1c4703ea984706..46d392bfa2bafc569d9e4d0a1176947e436c611c 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,12 @@
+Tue Jan 21 17:18:04 EET 2003  Pekka Riikonen <priikone@silcnet.org>
+
+       * Send DISCONNECT in close admin command in server.  Affected
+         file silcd/command.c.
+
+       * Check whether we are already connecting to a remote router
+         (in addition of checking whether we are already connected)
+         before creating new connection.  Affected file silcd/server.c.
+
 Thu Jan 16 18:47:00 EET 2003  Pekka Riikonen <priikone@silcnet.org>
 
        * Added better compiler and compiler flags checking in
index 6861d1365638260f8c919ca57c5d45343bb4ed54..1afc43446c2318f19f095ae87afc32e2155cc83a 100644 (file)
@@ -4772,17 +4772,19 @@ SILC_SERVER_CMD_FUNC(close)
   /* Close the connection to the server */
   sock = (SilcSocketConnection)server_entry->connection;
 
-  /* If we shutdown primary router connection manually then don't trigger
-     any reconnect or backup router connections, by setting the router
-     to NULL here. */
+  server->backup_noswitch = TRUE;
   if (server->router == server_entry) {
     server->id_entry->router = NULL;
     server->router = NULL;
     server->standalone = TRUE;
   }
-  silc_server_free_sock_user_data(server, sock, NULL);
-  silc_server_close_connection(server, sock);
-  
+  silc_server_disconnect_remote(server, sock,
+                               SILC_STATUS_ERR_BANNED_FROM_SERVER,
+                               "Closed by administrator");
+  if (sock->user_data)
+    silc_server_free_sock_user_data(server, sock, NULL);
+  server->backup_noswitch = FALSE;
+
  out:
   silc_server_command_free(cmd);
 }
index e49fafb59e7fb9a6d34595eff5748831a191b5a3..ee45290f0b1b779625c1142f201f2f8bc126f9e7 100644 (file)
@@ -2164,6 +2164,16 @@ SilcClientEntry silc_server_new_client(SilcServer server,
     return NULL;
   }
 
+  /* Make sure this client hasn't registered already */
+  if (idata->status & SILC_IDLIST_STATUS_REGISTERED) {
+    silc_server_disconnect_remote(server, sock, 
+                                 SILC_STATUS_ERR_OPERATION_ALLOWED,
+                                 "Too many registrations");
+    if (sock->user_data)
+      silc_server_free_sock_user_data(server, sock, NULL);
+    return NULL;
+  }
+
   /* Parse incoming packet */
   ret = silc_buffer_unformat(buffer,
                             SILC_STR_UI16_NSTRING_ALLOC(&username, 
@@ -2413,6 +2423,16 @@ SilcServerEntry silc_server_new_server(SilcServer server,
     local = FALSE;
   }
 
+  /* Make sure this server hasn't registered already */
+  if (idata->status & SILC_IDLIST_STATUS_REGISTERED) {
+    silc_server_disconnect_remote(server, sock, 
+                                 SILC_STATUS_ERR_OPERATION_ALLOWED,
+                                 "Too many registrations");
+    if (sock->user_data)
+      silc_server_free_sock_user_data(server, sock, NULL);
+    return NULL;
+  }
+
   /* Parse the incoming packet */
   ret = silc_buffer_unformat(buffer,
                             SILC_STR_UI16_NSTRING_ALLOC(&id_string, &id_len),
@@ -2474,19 +2494,38 @@ SilcServerEntry silc_server_new_server(SilcServer server,
   server_entry = silc_idlist_find_server_by_id(server->local_list, 
                                               server_id, TRUE, NULL);
   if (server_entry) {
-    silc_idcache_del_by_context(server->local_list->servers, server_entry);
+    if (SILC_IS_LOCAL(server_entry)) {
+      silc_server_disconnect_remote(server, server_entry->connection, 
+                                   SILC_STATUS_ERR_OPERATION_ALLOWED,
+                                   "Too many registrations");
+      if (((SilcSocketConnection)server_entry->connection)->user_data)
+       silc_server_free_sock_user_data(server, sock, NULL);
+    } else {
+      silc_idcache_del_by_context(server->local_list->servers, server_entry);
+    }
   } else {
     server_entry = silc_idlist_find_server_by_id(server->global_list, 
                                                 server_id, TRUE, NULL);
-    if (server_entry) 
-      silc_idcache_del_by_context(server->global_list->servers, server_entry);
+    if (server_entry) {
+      if (SILC_IS_LOCAL(server_entry)) {
+       silc_server_disconnect_remote(server, server_entry->connection, 
+                                     SILC_STATUS_ERR_OPERATION_ALLOWED,
+                                     "Too many registrations");
+       if (((SilcSocketConnection)server_entry->connection)->user_data)
+         silc_server_free_sock_user_data(server, server_entry->connection,
+                                         NULL);
+      } else {
+       silc_idcache_del_by_context(server->global_list->servers,
+                                   server_entry);
+      }
+    }
   }
 
   /* Update server entry */
   idata->status |= SILC_IDLIST_STATUS_REGISTERED;
   new_server->server_name = server_name;
   new_server->id = server_id;
-  
+
   SILC_LOG_DEBUG(("New server id(%s)",
                  silc_id_render(server_id, SILC_ID_SERVER)));
 
index f1f93da0d916d6b8158cae7ed7cca58a859bc523..59e6c4395a9b8de11b64f58b6d27722e59a2fca2 100644 (file)
@@ -430,11 +430,7 @@ bool silc_server_init(SilcServer server)
      timeout. It expires as soon as the caller calls silc_server_run. This
      task performs authentication protocol and key exchange with our
      primary router. */
-  silc_schedule_task_add(server->schedule, 0,
-                        silc_server_connect_to_router,
-                        (void *)server, 0, 1,
-                        SILC_TASK_TIMEOUT,
-                        SILC_TASK_PRI_NORMAL);
+  silc_server_create_connections(server);
 
   /* Add listener task to the scheduler. This task receives new connections
      to the server. This task remains on the queue until the end of the
@@ -695,12 +691,8 @@ bool silc_server_rehash(SilcServer server)
     }
   }
 
-  /* Go through all configured routers after rehash */
-  silc_schedule_task_add(server->schedule, 0,
-                        silc_server_connect_to_router,
-                        (void *)server, 0, 1,
-                        SILC_TASK_TIMEOUT,
-                        SILC_TASK_PRI_NORMAL);
+  /* Create connections after rehash */
+  silc_server_create_connections(server);
 
   /* Check whether our router status has changed */
   if (newconfig->servers) {
@@ -1047,7 +1039,7 @@ SILC_TASK_CALLBACK_GLOBAL(silc_server_connect_to_router)
       server->wait_backup = TRUE;
 
     if (ptr->initiator) {
-      /* Check whether we are connected to this host already */
+      /* Check whether we are connecting or connected to this host already */
       if (silc_server_num_sockets_by_remote(server, 
                                            silc_net_is_ip(ptr->host) ?
                                            ptr->host : NULL,
@@ -1057,6 +1049,15 @@ SILC_TASK_CALLBACK_GLOBAL(silc_server_connect_to_router)
        SILC_LOG_DEBUG(("We are already connected to this router"));
        continue;
       }
+      if (silc_server_num_sockets_by_remote(server, 
+                                           silc_net_is_ip(ptr->host) ?
+                                           ptr->host : NULL,
+                                           silc_net_is_ip(ptr->host) ?
+                                           NULL : ptr->host, ptr->port,
+                                           SILC_SOCKET_TYPE_UNKNOWN)) {
+       SILC_LOG_DEBUG(("We are already connecting to this router"));
+       continue;
+      }
 
       /* Allocate connection object for hold connection specific stuff. */
       sconn = silc_calloc(1, sizeof(*sconn));
@@ -2239,12 +2240,9 @@ SILC_TASK_CALLBACK(silc_server_packet_process)
       else
        silc_server_free_sock_user_data(server, sock, NULL);
     } else if (server->router_conn && server->router_conn->sock == sock &&
-              !server->router && server->standalone)
-      silc_schedule_task_add(server->schedule, 0,
-                            silc_server_connect_to_router,
-                            server, 1, 0,
-                            SILC_TASK_TIMEOUT,
-                            SILC_TASK_PRI_NORMAL);
+              !server->router && server->standalone) {
+      silc_server_create_connections(server);
+    }
 
     silc_server_close_connection(server, sock);
     return;
@@ -2503,11 +2501,15 @@ void silc_server_packet_parse_type(SilcServer server,
                     message ? message : ""));
       silc_free(message);
 
+      /* Do not switch to backup in case of error */
+      server->backup_noswitch = (status == SILC_STATUS_OK ? FALSE : TRUE);
+
       /* Handle the disconnection from our end too */
       SILC_SET_DISCONNECTING(sock);
       if (sock->user_data && SILC_IS_LOCAL(sock->user_data))
        silc_server_free_sock_user_data(server, sock, NULL);
       silc_server_close_connection(server, sock);
+      server->backup_noswitch = FALSE;
     }
     break;
 
@@ -3162,12 +3164,7 @@ void silc_server_free_sock_user_data(SilcServer server,
       if (server->router == user_data) {
        /* Check whether we have a backup router connection */
        if (!backup_router || backup_router == user_data) {
-         silc_schedule_task_add(server->schedule, 0,
-                                silc_server_connect_to_router,
-                                server, 1, 0,
-                                SILC_TASK_TIMEOUT,
-                                SILC_TASK_PRI_NORMAL);
-
+         silc_server_create_connections(server);
          server->id_entry->router = NULL;
          server->router = NULL;
          server->standalone = TRUE;
@@ -3215,15 +3212,12 @@ void silc_server_free_sock_user_data(SilcServer server,
       } else if (server->server_type == SILC_SERVER &&
                 sock->type == SILC_SOCKET_TYPE_ROUTER) {
        /* Reconnect to the router (backup) */
-       silc_schedule_task_add(server->schedule, 0,
-                              silc_server_connect_to_router,
-                              server, 1, 0,
-                              SILC_TASK_TIMEOUT,
-                              SILC_TASK_PRI_NORMAL);
+       silc_server_create_connections(server);
       }
 
-      SILC_SERVER_SEND_OPERS(server, FALSE, TRUE, SILC_NOTIFY_TYPE_NONE,
-                            ("Server %s signoff", user_data->server_name));
+      if (user_data->server_name)
+       SILC_SERVER_SEND_OPERS(server, FALSE, TRUE, SILC_NOTIFY_TYPE_NONE,
+                              ("Server %s signoff", user_data->server_name));
 
       if (!backup_router) {
        /* Remove all servers that are originated from this server, and
@@ -5089,12 +5083,7 @@ SILC_TASK_CALLBACK_GLOBAL(silc_server_rekey_final)
     if (sock->user_data)
       silc_server_free_sock_user_data(server, sock, NULL);
     silc_server_close_connection(server, sock);
-    silc_schedule_task_add(server->schedule, 0,
-                          silc_server_connect_to_router,
-                          server, 1, 0,
-                          SILC_TASK_TIMEOUT,
-                          SILC_TASK_PRI_NORMAL);
-
+    silc_server_create_connections(server);
     return;
   }
 
index 832ecb3a44ba2ab716411f7a345fca4f7cf20743..f91a6d29556ae2b9800d12bd991767332b99503f 100644 (file)
@@ -1054,6 +1054,8 @@ SILC_TASK_CALLBACK_GLOBAL(silc_server_protocol_backup)
 
            SILC_LOG_DEBUG(("Sending RESUMED to %s",
                            server_entry->server_name));
+           SILC_LOG_INFO(("Sending RESUMED to %s",
+                          server_entry->server_name));
 
            server_entry->data.status &= ~SILC_IDLIST_STATUS_DISABLED;
 
@@ -1091,6 +1093,8 @@ SILC_TASK_CALLBACK_GLOBAL(silc_server_protocol_backup)
 
            SILC_LOG_DEBUG(("Sending RESUMED to %s",
                            server_entry->server_name));
+           SILC_LOG_INFO(("Sending RESUMED to %s",
+                          server_entry->server_name));
 
            server_entry->data.status &= ~SILC_IDLIST_STATUS_DISABLED;
 
@@ -1263,12 +1267,7 @@ SILC_TASK_CALLBACK(silc_server_protocol_backup_done)
              if (sock->user_data)
                silc_server_free_sock_user_data(server, sock, NULL);
              silc_server_close_connection(server, sock);
-
-             silc_schedule_task_add(server->schedule, 0,
-                                    silc_server_connect_to_router,
-                                    server, 1, 0,
-                                    SILC_TASK_TIMEOUT,
-                                    SILC_TASK_PRI_NORMAL);
+             silc_server_create_connections(server);
 
              if (!silc_idcache_list_next(list, &id_cache))
                break;
@@ -1308,12 +1307,7 @@ SILC_TASK_CALLBACK(silc_server_protocol_backup_done)
              if (sock->user_data)
                silc_server_free_sock_user_data(server, sock, NULL);
              silc_server_close_connection(server, sock);
-
-             silc_schedule_task_add(server->schedule, 0,
-                                    silc_server_connect_to_router,
-                                    server, 1, 0,
-                                    SILC_TASK_TIMEOUT,
-                                    SILC_TASK_PRI_NORMAL);
+             silc_server_create_connections(server);
 
              if (!silc_idcache_list_next(list, &id_cache))
                break;
index dead873a6d250037bff3b3c9a91a585e9a4acc0a..064975bdc082821e2226cef716ac0e4a774e1d73 100644 (file)
@@ -1947,3 +1947,14 @@ void silc_server_inviteban_destruct(void *key, void *context,
     break;
   }
 }
+
+/* Creates connections accoring to configuration. */
+
+void silc_server_create_connections(SilcServer server)
+{
+  silc_schedule_task_del_by_callback(server->schedule,
+                                    silc_server_connect_to_router);
+  silc_schedule_task_add(server->schedule, 0,
+                        silc_server_connect_to_router, server, 0, 1,
+                        SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
+}
index 393f09003e6f558b70cdfefe8be4c5956104e912..489abf8781633deda10323812360d2bf4b199866 100644 (file)
@@ -207,4 +207,7 @@ void silc_server_inviteban_process(SilcServer server, SilcHashTable list,
 void silc_server_inviteban_destruct(void *key, void *context,
                                    void *user_context);
 
+/* Creates connections accoring to configuration. */
+void silc_server_create_connections(SilcServer server);
+
 #endif /* SERVER_UTIL_H */