Merged from silc_1_0_branch (second merge).
[silc.git] / apps / silcd / server_util.c
index dead873a6d250037bff3b3c9a91a585e9a4acc0a..839599d2cfde0b1f166e504c4c4c5d3014319a6e 100644 (file)
@@ -1754,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;
        }
@@ -1772,12 +1772,6 @@ bool silc_server_inviteban_match(SilcServer server, SilcHashTable list,
   return ret;
 }
 
-static void silc_server_inviteban_dummy_dest(void *key, void *context,
-                                            void *user_context)
-{
-  /* Nothing */
-}
-
 /* Process invite or ban information */
 
 void silc_server_inviteban_process(SilcServer server, SilcHashTable list,
@@ -1800,24 +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_ext(list, (void *)1, NULL, NULL, NULL, NULL,
-                               silc_server_inviteban_dummy_dest, NULL);
-       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
@@ -1875,25 +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)) {
-         if (!strncmp(string, tmp, strlen(string) - 1)) {
+       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);
-           string = NULL;
-         } else {
+         } 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_hash_table_del(list, (void *)1);
-             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) {
@@ -1928,22 +1912,21 @@ void silc_server_inviteban_process(SilcServer server, SilcHashTable list,
   }
 }
 
-/* Destructor for invite or ban list entrys */
+/* Destructor for invite and ban list entrys */
 
 void silc_server_inviteban_destruct(void *key, void *context,
                                    void *user_context)
 {
-  switch ((SilcUInt32)key) {
-  case 1:
-    /* Invite string */
-    silc_free(context);
-    break;
-  case 2:
-  case 3:
-    /* Public key/Channel ID SilcBuffer */
-    silc_buffer_free(context);
-    break;
-  default:
-    break;
-  }
+  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);
 }