More SILC Toolkit 1.1 porting work.
[silc.git] / apps / silcd / server_util.c
index 2f96514fecc6b1718a3c8b85f6ffe5f337f9d583..084628cb7affdd65cc50889d0aa982a153ffa0d9 100644 (file)
@@ -162,15 +162,17 @@ SilcBool silc_server_remove_clients_by_server(SilcServer server,
 
   if (server_signoff) {
     idp = silc_id_payload_encode(entry->id, SILC_ID_SERVER);
-    argv = silc_realloc(argv, sizeof(*argv) * (argc + 1));
-    argv_lens = silc_realloc(argv_lens,  sizeof(*argv_lens) * (argc + 1));
-    argv_types = silc_realloc(argv_types, sizeof(*argv_types) * (argc + 1));
-    argv[argc] = silc_calloc(silc_buffer_len(idp), sizeof(*argv[0]));
-    memcpy(argv[argc], idp->data, silc_buffer_len(idp));
-    argv_lens[argc] = silc_buffer_len(idp);
-    argv_types[argc] = argc + 1;
-    argc++;
-    silc_buffer_free(idp);
+    if (idp) {
+      argv = silc_realloc(argv, sizeof(*argv) * (argc + 1));
+      argv_lens = silc_realloc(argv_lens,  sizeof(*argv_lens) * (argc + 1));
+      argv_types = silc_realloc(argv_types, sizeof(*argv_types) * (argc + 1));
+      argv[argc] = silc_calloc(silc_buffer_len(idp), sizeof(*argv[0]));
+      memcpy(argv[argc], idp->data, silc_buffer_len(idp));
+      argv_lens[argc] = silc_buffer_len(idp);
+      argv_types[argc] = argc + 1;
+      argc++;
+      silc_buffer_free(idp);
+    }
   }
 
   if (silc_idcache_get_all(server->local_list->clients, &list)) {
@@ -189,17 +191,19 @@ SilcBool silc_server_remove_clients_by_server(SilcServer server,
 
       if (server_signoff) {
        idp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
-       argv = silc_realloc(argv, sizeof(*argv) * (argc + 1));
-       argv_lens = silc_realloc(argv_lens, sizeof(*argv_lens) *
-                                (argc + 1));
-       argv_types = silc_realloc(argv_types, sizeof(*argv_types) *
-                                 (argc + 1));
-       argv[argc] = silc_calloc(silc_buffer_len(idp), sizeof(*argv[0]));
-       memcpy(argv[argc], idp->data, silc_buffer_len(idp));
-       argv_lens[argc] = silc_buffer_len(idp);
-       argv_types[argc] = argc + 1;
-       argc++;
-       silc_buffer_free(idp);
+       if (idp) {
+         argv = silc_realloc(argv, sizeof(*argv) * (argc + 1));
+         argv_lens = silc_realloc(argv_lens, sizeof(*argv_lens) *
+                                  (argc + 1));
+         argv_types = silc_realloc(argv_types, sizeof(*argv_types) *
+                                   (argc + 1));
+         argv[argc] = silc_calloc(silc_buffer_len(idp), sizeof(*argv[0]));
+         memcpy(argv[argc], idp->data, silc_buffer_len(idp));
+         argv_lens[argc] = silc_buffer_len(idp);
+         argv_types[argc] = argc + 1;
+         argc++;
+         silc_buffer_free(idp);
+       }
       }
 
       /* Update statistics */
@@ -1052,9 +1056,12 @@ silc_server_find_socket_by_host(SilcServer server,
 SilcUInt32 silc_server_num_sockets_by_remote(SilcServer server,
                                             const char *ip,
                                             const char *hostname,
-                                            SilcUInt16 port)
+                                            SilcUInt16 port,
+                                            SilcConnectionType type)
 {
   SilcServerConnection conn;
+  SilcIDListData idata;
+  SilcConnectionType t = SILC_CONN_UNKNOWN;
   int count = 0;
 
   if (!ip && !hostname)
@@ -1062,9 +1069,14 @@ SilcUInt32 silc_server_num_sockets_by_remote(SilcServer server,
 
   silc_dlist_start(server->conns);
   while ((conn = silc_dlist_get(server->conns))) {
+    if (conn->sock) {
+      idata = silc_packet_get_context(conn->sock);
+      if (idata)
+       t = idata->conn_type;
+    }
     if (((ip && !strcmp(conn->remote_host, ip)) ||
         (hostname && !strcmp(conn->remote_host, hostname))) &&
-       conn->remote_port == port)
+       conn->remote_port == port && t == type)
       count++;
   }
 
@@ -1357,8 +1369,8 @@ SilcBool silc_server_check_cmode_rights(SilcServer server,
    FALSE if setting some mode is not allowed. */
 
 SilcBool silc_server_check_umode_rights(SilcServer server,
-                                   SilcClientEntry client,
-                                   SilcUInt32 mode)
+                                       SilcClientEntry client,
+                                       SilcUInt32 mode)
 {
   SilcBool server_op = FALSE, router_op = FALSE;