Merged from silc_1_0_branch (second merge).
[silc.git] / apps / silcd / server_util.c
index 790979cdf208808b9f5ec6706291010420d357c4..839599d2cfde0b1f166e504c4c4c5d3014319a6e 100644 (file)
@@ -42,7 +42,9 @@ silc_server_remove_clients_channels(SilcServer server,
   if (!client)
     return;
 
-  SILC_LOG_DEBUG(("Remove client from all channels"));
+  SILC_LOG_DEBUG(("Remove client %s from all channels",   
+                client->nickname ? client->nickname :
+                 (unsigned char *)""));
 
   if (silc_hash_table_find(clients, client, NULL, NULL))
     silc_hash_table_del(clients, client);
@@ -1513,7 +1515,7 @@ void silc_server_kill_client(SilcServer server,
   /* Remove the client from all channels. This generates new keys to the
      channels as well. */
   silc_server_remove_from_channels(server, NULL, remote_client, FALSE, 
-                                  NULL, TRUE);
+                                  NULL, TRUE, TRUE);
 
   /* Remove the client entry, If it is locally connected then we will also
      disconnect the client here */
@@ -1723,7 +1725,7 @@ bool silc_server_inviteban_match(SilcServer server, SilcHashTable list,
   unsigned char *tmp = NULL;
   SilcUInt32 len = 0, t;
   SilcHashTableList htl;
-  SilcBuffer entry;
+  SilcBuffer entry, idp = NULL;
   bool ret = FALSE;
 
   if (type < 1 || type > 3 || !check)
@@ -1740,10 +1742,11 @@ bool silc_server_inviteban_match(SilcServer server, SilcHashTable list,
       return FALSE;
   }
   if (type == 3) {
-    tmp = silc_id_id2str(check, SILC_ID_CLIENT);
-    if (!tmp)
+    idp = silc_id_payload_encode(check, SILC_ID_CLIENT);
+    if (!idp)
       return FALSE;
-    len = silc_id_get_len(check, SILC_ID_CLIENT);
+    tmp = idp->data;
+    len = idp->len;
   }
 
   /* Compare the list */
@@ -1751,7 +1754,7 @@ bool silc_server_inviteban_match(SilcServer server, SilcHashTable list,
   while (silc_hash_table_get(&htl, (void **)&t, (void **)&entry)) {
     if (type == t) {
       if (type == 1) {
-       if (silc_string_match((char *)entry, tmp)) {
+       if (silc_string_match(entry->data, tmp)) {
          ret = TRUE;
          break;
        }
@@ -1763,7 +1766,9 @@ bool silc_server_inviteban_match(SilcServer server, SilcHashTable list,
   }
   silc_hash_table_list_reset(&htl);
 
-  silc_free(tmp);
+  if (!idp)
+    silc_free(tmp);
+  silc_buffer_free(idp);
   return ret;
 }
 
@@ -1789,23 +1794,16 @@ void silc_server_inviteban_process(SilcServer server, SilcHashTable list,
       if (type == 1) {
        /* Invite string.  Get the old invite string from hash table
           and append this at the end of the existing one. */
-       char *string = NULL;
-       silc_hash_table_find(list, (void *)1,
-                            NULL, (void **)&string);
-       silc_hash_table_del(list, (void *)1);
-       if (!string)
-         string = silc_calloc(len + 2, sizeof(*string));
-       else
-         string = silc_realloc(string, sizeof(*string) *
-                               (strlen(string) + len + 2));
-       memset(string + strlen(string), 0, len + 2);
+       if (!silc_hash_table_find(list, (void *)1, NULL, (void **)&tmp2)) {
+         tmp2 = silc_calloc(1, sizeof(*tmp2));
+         silc_hash_table_add(list, (void *)1, tmp2);
+       }
        if (tmp[len - 1] == ',')
          tmp[len - 1] = '\0';
-       strncat(string, tmp, len);
-       strncat(string, ",", 1);
-
-       /* Add new invite string to invite list */
-       silc_hash_table_add(list, (void *)1, string);
+       if (len) {
+         silc_buffer_strformat(tmp2, tmp, SILC_STR_END);
+         silc_buffer_strformat(tmp2, ",", SILC_STR_END);
+       }
 
       } else if (type == 2) {
        /* Public key.  Check first if the public key is already on the
@@ -1854,7 +1852,7 @@ void silc_server_inviteban_process(SilcServer server, SilcHashTable list,
   }
 
   /* Delete information to invite list */
-  if (action && list) {
+  if (action == 0x01 && list) {
     /* Now delete the arguments from invite list */
     tmp = silc_argument_get_first_arg(args, &type, &len);
     while (tmp) {
@@ -1863,27 +1861,23 @@ void silc_server_inviteban_process(SilcServer server, SilcHashTable list,
           the requested string. */
        char *string = NULL, *start, *end, *n;
 
-       if (silc_hash_table_find(list, (void *)1, NULL, (void **)&string)) {
-         silc_hash_table_del(list, (void *)1);
-
-         if (!strncmp(string, tmp, strlen(string) - 1)) {
-           silc_free(string);
-           string = NULL;
-         } else {
+       if (silc_hash_table_find(list, (void *)1, NULL, (void **)&tmp2)) {
+         string = tmp2->head;
+         if (tmp2->truelen && !strncmp(string, tmp, tmp2->truelen - 1)) {
+           /* Delete entire string */
+           silc_hash_table_del(list, (void *)1);
+         } else if (tmp2->truelen) {
+           /* Delete part of the string */
            start = strstr(string, tmp);
            if (start && strlen(start) >= len) {
              end = start + len;
              n = silc_calloc(strlen(string) - len, sizeof(*n));
              strncat(n, string, start - string);
              strncat(n, end + 1, ((string + strlen(string)) - end) - 1);
-             silc_free(string);
-             string = n;
+             silc_free(tmp2->head);
+             silc_buffer_set(tmp2, n, strlen(n));
            }
          }
-
-         /* Add new invite string to invite list */
-         if (string)
-           silc_hash_table_add(list, (void *)1, string);
        }
 
       } else if (type == 2) {
@@ -1894,7 +1888,6 @@ void silc_server_inviteban_process(SilcServer server, SilcHashTable list,
        while (silc_hash_table_get(&htl, (void **)&type, (void **)&tmp2)) {
          if (type == 2 && !memcmp(tmp2->data, tmp, len)) {
            silc_hash_table_del_by_context(list, (void *)2, tmp2);
-           silc_buffer_free(tmp2);
            break;
          }
        }
@@ -1906,9 +1899,8 @@ void silc_server_inviteban_process(SilcServer server, SilcHashTable list,
        /* Delete from the invite list */
        silc_hash_table_list(list, &htl);
        while (silc_hash_table_get(&htl, (void **)&type, (void **)&tmp2)) {
-         if (type == 2 && !memcmp(tmp2->data, tmp, len)) {
-           silc_hash_table_del_by_context(list, (void *)2, tmp2);
-           silc_buffer_free(tmp2);
+         if (type == 3 && !memcmp(tmp2->data, tmp, len)) {
+           silc_hash_table_del_by_context(list, (void *)3, tmp2);
            break;
          }
        }
@@ -1919,3 +1911,22 @@ void silc_server_inviteban_process(SilcServer server, SilcHashTable list,
     }
   }
 }
+
+/* Destructor for invite and ban list entrys */
+
+void silc_server_inviteban_destruct(void *key, void *context,
+                                   void *user_context)
+{
+  silc_buffer_free(context);
+}
+
+/* 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);
+}