0d351bc00df39d9e430f6735042e9ee61870f23e
[silc.git] / apps / silcd / server.c
1 /*
2
3   server.c
4
5   Author: Pekka Riikonen <priikone@poseidon.pspt.fi>
6
7   Copyright (C) 1997 - 2001 Pekka Riikonen
8
9   This program is free software; you can redistribute it and/or modify
10   it under the terms of the GNU General Public License as published by
11   the Free Software Foundation; either version 2 of the License, or
12   (at your option) any later version.
13   
14   This program is distributed in the hope that it will be useful,
15   but WITHOUT ANY WARRANTY; without even the implied warranty of
16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17   GNU General Public License for more details.
18
19 */
20 /*
21  * This is the actual SILC server than handles everything relating to
22  * servicing the SILC connections. This is also a SILC router as a router 
23  * is also normal server.
24  */
25 /* $Id$ */
26
27 #include "serverincludes.h"
28 #include "server_internal.h"
29
30 /* Static prototypes */
31 SILC_TASK_CALLBACK(silc_server_connect_router);
32 SILC_TASK_CALLBACK(silc_server_connect_to_router);
33 SILC_TASK_CALLBACK(silc_server_connect_to_router_second);
34 SILC_TASK_CALLBACK(silc_server_connect_to_router_final);
35 SILC_TASK_CALLBACK(silc_server_accept_new_connection);
36 SILC_TASK_CALLBACK(silc_server_accept_new_connection_second);
37 SILC_TASK_CALLBACK(silc_server_accept_new_connection_final);
38 SILC_TASK_CALLBACK(silc_server_packet_process);
39 SILC_TASK_CALLBACK(silc_server_packet_parse_real);
40 SILC_TASK_CALLBACK(silc_server_timeout_remote);
41
42 /* Allocates a new SILC server object. This has to be done before the server
43    can be used. After allocation one must call silc_server_init to initialize
44    the server. The new allocated server object is returned to the new_server
45    argument. */
46
47 int silc_server_alloc(SilcServer *new_server)
48 {
49   SilcServer server;
50
51   SILC_LOG_DEBUG(("Allocating new server object"));
52
53   server = silc_calloc(1, sizeof(*server));
54   server->server_type = SILC_SERVER;
55   server->standalone = TRUE;
56   server->local_list = silc_calloc(1, sizeof(*server->local_list));
57   server->global_list = silc_calloc(1, sizeof(*server->global_list));
58   server->pending_commands = silc_dlist_init();
59 #ifdef SILC_SIM
60   server->sim = silc_dlist_init();
61 #endif
62
63   *new_server = server;
64
65   return TRUE;
66 }
67
68 /* Free's the SILC server object. This is called at the very end before
69    the program ends. */
70
71 void silc_server_free(SilcServer server)
72 {
73   if (server) {
74 #ifdef SILC_SIM
75     SilcSimContext *sim;
76 #endif
77
78     if (server->local_list)
79       silc_free(server->local_list);
80     if (server->global_list)
81       silc_free(server->global_list);
82     if (server->rng)
83       silc_rng_free(server->rng);
84
85 #ifdef SILC_SIM
86     while ((sim = silc_dlist_get(server->sim)) != SILC_LIST_END) {
87       silc_dlist_del(server->sim, sim);
88       silc_sim_free(sim);
89     }
90     silc_dlist_uninit(server->sim);
91 #endif
92
93     if (server->params)
94       silc_free(server->params);
95
96     if (server->pending_commands)
97       silc_dlist_uninit(server->pending_commands);
98
99     silc_math_primegen_uninit(); /* XXX */
100     silc_free(server);
101   }
102 }
103
104 /* Initializes the entire SILC server. This is called always before running
105    the server. This is called only once at the initialization of the program.
106    This binds the server to its listenning port. After this function returns 
107    one should call silc_server_run to start the server. This returns TRUE 
108    when everything is ok to run the server. Configuration file must be
109    read and parsed before calling this. */
110
111 int silc_server_init(SilcServer server)
112 {
113   int *sock = NULL, sock_count = 0, i;
114   SilcServerID *id;
115   SilcServerEntry id_entry;
116
117   SILC_LOG_DEBUG(("Initializing server"));
118   assert(server);
119   assert(server->config);
120
121   /* XXX After server is made as Silc Server Library this can be given
122      as argument, for now this is hard coded */
123   server->params = silc_calloc(1, sizeof(*server->params));
124   server->params->retry_count = SILC_SERVER_RETRY_COUNT;
125   server->params->retry_interval_min = SILC_SERVER_RETRY_INTERVAL_MIN;
126   server->params->retry_interval_max = SILC_SERVER_RETRY_INTERVAL_MAX;
127   server->params->retry_keep_trying = FALSE;
128   server->params->protocol_timeout = 60;
129   server->params->require_reverse_mapping = FALSE;
130
131   /* Set log files where log message should be saved. */
132   server->config->server = server;
133   silc_config_server_setlogfiles(server->config);
134  
135   /* Register all configured ciphers, PKCS and hash functions. */
136   silc_config_server_register_ciphers(server->config);
137   silc_config_server_register_pkcs(server->config);
138   silc_config_server_register_hashfuncs(server->config);
139
140   /* Initialize random number generator for the server. */
141   server->rng = silc_rng_alloc();
142   silc_rng_init(server->rng);
143   silc_math_primegen_init(); /* XXX */
144
145   /* Initialize hash functions for server to use */
146   silc_hash_alloc("md5", &server->md5hash);
147   silc_hash_alloc("sha1", &server->sha1hash);
148
149   /* Initialize none cipher */
150   silc_cipher_alloc("none", &server->none_cipher);
151
152   /* XXXXX Generate RSA key pair */
153   {
154     unsigned char *public_key;
155     unsigned char *private_key;
156     unsigned int pk_len, prv_len;
157     struct stat st;
158
159     if (stat("pubkey.pub", &st) < 0 && stat("privkey.prv", &st) < 0) {
160
161       if (silc_pkcs_alloc("rsa", &server->pkcs) == FALSE) {
162         SILC_LOG_ERROR(("Could not create RSA key pair"));
163         goto err0;
164       }
165       
166       if (server->pkcs->pkcs->init(server->pkcs->context, 
167                                    1024, server->rng) == FALSE) {
168         SILC_LOG_ERROR(("Could not generate RSA key pair"));
169         goto err0;
170       }
171       
172       public_key = server->pkcs->pkcs->get_public_key(server->pkcs->context,
173                                                       &pk_len);
174       private_key = server->pkcs->pkcs->get_private_key(server->pkcs->context,
175                                                         &prv_len);
176       
177       SILC_LOG_HEXDUMP(("public key"), public_key, pk_len);
178       SILC_LOG_HEXDUMP(("private key"), private_key, prv_len);
179       
180       server->public_key = 
181         silc_pkcs_public_key_alloc("rsa", "UN=root, HN=dummy",
182                                    public_key, pk_len);
183       server->private_key = 
184         silc_pkcs_private_key_alloc("rsa", private_key, prv_len);
185       
186       /* XXX Save keys */
187       silc_pkcs_save_public_key("pubkey.pub", server->public_key,
188                                 SILC_PKCS_FILE_PEM);
189       silc_pkcs_save_private_key("privkey.prv", server->private_key, NULL,
190                                  SILC_PKCS_FILE_BIN);
191
192       memset(public_key, 0, pk_len);
193       memset(private_key, 0, prv_len);
194       silc_free(public_key);
195       silc_free(private_key);
196     } else {
197       silc_pkcs_load_public_key("pubkey.pub", &server->public_key,
198                                 SILC_PKCS_FILE_PEM);
199       silc_pkcs_load_private_key("privkey.prv", &server->private_key,
200                                  SILC_PKCS_FILE_BIN);
201     }
202   }
203
204   /* Create a listening server. Note that our server can listen on
205      multiple ports. All listeners are created here and now. */
206   /* XXX Still check this whether to use server_info or listen_port. */
207   sock_count = 0;
208   while(server->config->listen_port) {
209     int tmp;
210
211     tmp = silc_net_create_server(server->config->listen_port->port,
212                                  server->config->listen_port->host);
213     if (tmp < 0)
214       goto err0;
215
216     sock = silc_realloc(sock, (sizeof(int *) * (sock_count + 1)));
217     sock[sock_count] = tmp;
218     server->config->listen_port = server->config->listen_port->next;
219     sock_count++;
220   }
221
222   /* Initialize ID caches */
223   server->local_list->clients = silc_idcache_alloc(0);
224   server->local_list->servers = silc_idcache_alloc(0);
225   server->local_list->channels = silc_idcache_alloc(0);
226
227   /* These are allocated for normal server as well as these hold some 
228      global information that the server has fetched from its router. For 
229      router these are used as they are supposed to be used on router. */
230   server->global_list->clients = silc_idcache_alloc(0);
231   server->global_list->servers = silc_idcache_alloc(0);
232   server->global_list->channels = silc_idcache_alloc(0);
233
234   /* Allocate the entire socket list that is used in server. Eventually 
235      all connections will have entry in this table (it is a table of 
236      pointers to the actual object that is allocated individually 
237      later). */
238   server->sockets = silc_calloc(SILC_SERVER_MAX_CONNECTIONS,
239                                 sizeof(*server->sockets));
240
241   for (i = 0; i < sock_count; i++) {
242     SilcSocketConnection newsocket = NULL;
243
244     /* Set socket to non-blocking mode */
245     silc_net_set_socket_nonblock(sock[i]);
246     server->sock = sock[i];
247     
248     /* Create a Server ID for the server. */
249     silc_id_create_server_id(sock[i], server->rng, &id);
250     if (!id) {
251       goto err0;
252     }
253     
254     server->id = id;
255     server->id_string = silc_id_id2str(id, SILC_ID_SERVER);
256     server->id_string_len = silc_id_get_len(SILC_ID_SERVER);
257     server->id_type = SILC_ID_SERVER;
258     server->server_name = server->config->server_info->server_name;
259
260     /* Add ourselves to the server list. We don't have a router yet 
261        beacuse we haven't established a route yet. It will be done later. 
262        For now, NULL is sent as router. This allocates new entry to
263        the ID list. */
264     id_entry = 
265       silc_idlist_add_server(server->local_list,
266                              server->config->server_info->server_name,
267                              server->server_type, server->id, NULL, NULL);
268     if (!id_entry) {
269       SILC_LOG_ERROR(("Could not add ourselves to cache"));
270       goto err0;
271     }
272     
273     /* Add ourselves also to the socket table. The entry allocated above
274        is sent as argument for fast referencing in the future. */
275     silc_socket_alloc(sock[i], SILC_SOCKET_TYPE_SERVER, id_entry, 
276                       &newsocket);
277     if (!newsocket)
278       goto err0;
279
280     server->sockets[sock[i]] = newsocket;
281
282     /* Put the allocated socket pointer also to the entry allocated above 
283        for fast back-referencing to the socket list. */
284     id_entry->connection = (void *)server->sockets[sock[i]];
285     server->id_entry = id_entry;
286   }
287
288   /* Register the task queues. In SILC we have by default three task queues. 
289      One task queue for non-timeout tasks which perform different kind of 
290      I/O on file descriptors, timeout task queue for timeout tasks, and,
291      generic non-timeout task queue whose tasks apply to all connections. */
292   silc_task_queue_alloc(&server->io_queue, TRUE);
293   if (!server->io_queue) {
294     goto err0;
295   }
296   silc_task_queue_alloc(&server->timeout_queue, TRUE);
297   if (!server->timeout_queue) {
298     goto err1;
299   }
300   silc_task_queue_alloc(&server->generic_queue, TRUE);
301   if (!server->generic_queue) {
302     goto err1;
303   }
304
305   /* Register protocols */
306   silc_server_protocols_register();
307
308   /* Initialize the scheduler */
309   silc_schedule_init(&server->io_queue, &server->timeout_queue, 
310                      &server->generic_queue, 
311                      SILC_SERVER_MAX_CONNECTIONS);
312   
313   /* Add the first task to the queue. This is task that is executed by
314      timeout. It expires as soon as the caller calls silc_server_run. This
315      task performs authentication protocol and key exchange with our
316      primary router. */
317   silc_task_register(server->timeout_queue, sock[0], 
318                      silc_server_connect_to_router,
319                      (void *)server, 0, 1,
320                      SILC_TASK_TIMEOUT,
321                      SILC_TASK_PRI_NORMAL);
322
323   /* Add listener task to the queue. This task receives new connections to the 
324      server. This task remains on the queue until the end of the program. */
325   silc_task_register(server->io_queue, sock[0],
326                      silc_server_accept_new_connection,
327                      (void *)server, 0, 0, 
328                      SILC_TASK_FD,
329                      SILC_TASK_PRI_NORMAL);
330   server->listenning = TRUE;
331
332   /* If server connections has been configured then we must be router as
333      normal server cannot have server connections, only router connections. */
334   if (server->config->servers)
335     server->server_type = SILC_ROUTER;
336
337   SILC_LOG_DEBUG(("Server initialized"));
338
339   /* We are done here, return succesfully */
340   return TRUE;
341
342   silc_task_queue_free(server->timeout_queue);
343  err1:
344   silc_task_queue_free(server->io_queue);
345  err0:
346   for (i = 0; i < sock_count; i++)
347     silc_net_close_server(sock[i]);
348
349   return FALSE;
350 }
351
352 /* Fork server to background and set gid+uid to non-root.
353    Silcd will not run as root, so trying to set either user or group to
354    root will cause silcd to exit. */
355
356 void silc_server_daemonise(SilcServer server)
357 {
358   /* Are we executing silcd as root or a regular user? */
359   if (geteuid()==0) {
360     
361     struct passwd *pw;
362     struct group *gr;
363     char *user, *group;
364     
365     if (!server->config->identity || !server->config->identity->user || 
366         !server->config->identity->group) {
367       fprintf(stderr, "Error:"
368        "\tSILC server must not be run as root.  For the security of your\n"
369        "\tsystem it is strongly suggested that you run SILC under dedicated\n"
370        "\tuser account.  Modify the [Identity] configuration section to run\n"
371        "\tthe server as non-root user.\n");
372       exit(1);
373     }
374     
375     /* Get the values given for user and group in configuration file */
376     user=server->config->identity->user;
377     group=server->config->identity->group;
378     
379     /* Check whether the user/group information is text */ 
380     if (atoi(user)!=0 || atoi(group)!=0) {
381       SILC_LOG_DEBUG(("Invalid user and/or group information"));
382       SILC_LOG_DEBUG(("User and/or group given as number"));
383       fprintf(stderr, "Invalid user and/or group information\n");
384       fprintf(stderr, "Please assign them as names, not numbers\n");
385       exit(1);
386     }
387     
388     /* Catch the nasty incident of string "0" returning 0 from atoi */
389     if (strcmp("0", user)==0 || strcmp("0", group)==0) {
390       SILC_LOG_DEBUG(("User and/or group configured to 0. Unacceptable"));
391       fprintf(stderr, "User and/or group configured to 0. Exiting\n");
392       exit(1);
393     }
394     
395     pw=getpwnam(user);
396     gr=getgrnam(group);
397
398     if (!pw) {
399       fprintf(stderr, "No such user %s found\n", user);
400       exit(1);
401     }
402
403     if (!gr) {
404       fprintf(stderr, "No such group %s found\n", group);
405       exit(1);
406     }
407     
408     /* Check whether user and/or group is set to root. If yes, exit
409        immediately. Otherwise, setgid and setuid server to user.group */
410     if (gr->gr_gid==0 || pw->pw_uid==0) {
411       fprintf(stderr, "Error:"
412        "\tSILC server must not be run as root.  For the security of your\n"
413        "\tsystem it is strongly suggested that you run SILC under dedicated\n"
414        "\tuser account.  Modify the [Identity] configuration section to run\n"
415        "\tthe server as non-root user.\n");
416       exit(1);
417     } else {
418       /* Fork server to background, making it a daemon */
419       if (fork()) {
420         SILC_LOG_DEBUG(("Server started as root. Dropping privileges."));
421         SILC_LOG_DEBUG(("Forking SILC server to background"));
422         exit(0);
423       } 
424       setsid();
425       
426       SILC_LOG_DEBUG(("Changing to group %s", group));
427       if(setgid(gr->gr_gid)==0) {
428         SILC_LOG_DEBUG(("Setgid to %s", group));
429       } else {
430         SILC_LOG_DEBUG(("Setgid to %s failed", group));
431         fprintf(stderr, "Tried to setgid %s but no such group. Exiting\n",
432                 group);
433         exit(1);
434       }
435       SILC_LOG_DEBUG(("Changing to user nobody"));
436       if(setuid(pw->pw_uid)==0) {
437         SILC_LOG_DEBUG(("Setuid to %s", user));
438       } else {
439         SILC_LOG_DEBUG(("Setuid to %s failed", user));
440         fprintf(stderr, "Tried to setuid %s but no such user. Exiting\n",
441                 user);
442         exit(1);
443       }
444     }
445   } else {
446     /* Fork server to background, making it a daemon */
447     if (fork()) {
448       SILC_LOG_DEBUG(("Server started as user")); 
449       SILC_LOG_DEBUG(("Forking SILC server to background"));
450       exit(0);
451     }
452     setsid();
453   }
454 }
455
456 /* Stops the SILC server. This function is used to shutdown the server. 
457    This is usually called after the scheduler has returned. After stopping 
458    the server one should call silc_server_free. */
459
460 void silc_server_stop(SilcServer server)
461 {
462   SILC_LOG_DEBUG(("Stopping server"));
463
464   /* Stop the scheduler, although it might be already stopped. This
465      doesn't hurt anyone. This removes all the tasks and task queues,
466      as well. */
467   silc_schedule_stop();
468   silc_schedule_uninit();
469
470   silc_server_protocols_unregister();
471
472   SILC_LOG_DEBUG(("Server stopped"));
473 }
474
475 /* The heart of the server. This runs the scheduler thus runs the server. 
476    When this returns the server has been stopped and the program will
477    be terminated. */
478
479 void silc_server_run(SilcServer server)
480 {
481   SILC_LOG_DEBUG(("Running server"));
482
483   /* Start the scheduler, the heart of the SILC server. When this returns
484      the program will be terminated. */
485   silc_schedule();
486 }
487
488 /* Timeout callback that will be called to retry connecting to remote
489    router. This is used by both normal and router server. This will wait
490    before retrying the connecting. The timeout is generated by exponential
491    backoff algorithm. */
492
493 SILC_TASK_CALLBACK(silc_server_connect_to_router_retry)
494 {
495   SilcServerConnection sconn = (SilcServerConnection)context;
496   SilcServer server = sconn->server;
497
498   SILC_LOG_INFO(("Retrying connecting to a router"));
499
500   /* Calculate next timeout */
501   if (sconn->retry_count >= 1) {
502     sconn->retry_timeout = sconn->retry_timeout * SILC_SERVER_RETRY_MULTIPLIER;
503     if (sconn->retry_timeout > SILC_SERVER_RETRY_INTERVAL_MAX)
504       sconn->retry_timeout = SILC_SERVER_RETRY_INTERVAL_MAX;
505   } else {
506     sconn->retry_timeout = server->params->retry_interval_min;
507   }
508   sconn->retry_count++;
509   sconn->retry_timeout = sconn->retry_timeout +
510     silc_rng_get_rn32(server->rng) % SILC_SERVER_RETRY_RANDOMIZER;
511
512   /* If we've reached max retry count, give up. */
513   if (sconn->retry_count > server->params->retry_count && 
514       server->params->retry_keep_trying == FALSE) {
515     SILC_LOG_ERROR(("Could not connect to router, giving up"));
516     return;
517   }
518
519   /* Wait one before retrying */
520   silc_task_register(server->timeout_queue, fd, silc_server_connect_router,
521                      context, sconn->retry_timeout, 
522                      server->params->retry_interval_min_usec,
523                      SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
524 }
525
526 /* Generic routine to use connect to a router. */
527
528 SILC_TASK_CALLBACK(silc_server_connect_router)
529 {    
530   SilcServerConnection sconn = (SilcServerConnection)context;
531   SilcServer server = sconn->server;
532   SilcSocketConnection newsocket;
533   SilcProtocol protocol;
534   SilcServerKEInternalContext *proto_ctx;
535   int sock;
536
537   /* Connect to remote host */
538   sock = silc_net_create_connection(sconn->remote_port, 
539                                     sconn->remote_host);
540   if (sock < 0) {
541     SILC_LOG_ERROR(("Could not connect to router"));
542     silc_task_register(server->timeout_queue, fd, 
543                        silc_server_connect_to_router_retry,
544                        context, 0, 1, SILC_TASK_TIMEOUT, 
545                        SILC_TASK_PRI_NORMAL);
546     return;
547   }
548
549   /* Set socket options */
550   silc_net_set_socket_nonblock(sock);
551   silc_net_set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 1);
552
553   /* Create socket connection for the connection. Even though we
554      know that we are connecting to a router we will mark the socket
555      to be unknown connection until we have executed authentication
556      protocol. */
557   silc_socket_alloc(sock, SILC_SOCKET_TYPE_UNKNOWN, NULL, &newsocket);
558   server->sockets[sock] = newsocket;
559   newsocket->hostname = strdup(sconn->remote_host);
560   newsocket->ip = strdup(sconn->remote_host);
561   newsocket->port = sconn->remote_port;
562   sconn->sock = newsocket;
563
564   /* Allocate internal protocol context. This is sent as context
565      to the protocol. */
566   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
567   proto_ctx->server = (void *)server;
568   proto_ctx->context = (void *)sconn;
569   proto_ctx->sock = newsocket;
570   proto_ctx->rng = server->rng;
571   proto_ctx->responder = FALSE;
572       
573   /* Perform key exchange protocol. silc_server_connect_to_router_second
574      will be called after the protocol is finished. */
575   silc_protocol_alloc(SILC_PROTOCOL_SERVER_KEY_EXCHANGE, 
576                       &protocol, proto_ctx,
577                       silc_server_connect_to_router_second);
578   newsocket->protocol = protocol;
579       
580   /* Register a timeout task that will be executed if the protocol
581      is not executed within set limit. */
582   proto_ctx->timeout_task = 
583     silc_task_register(server->timeout_queue, sock, 
584                        silc_server_timeout_remote,
585                        server, server->params->protocol_timeout,
586                        server->params->protocol_timeout_usec,
587                        SILC_TASK_TIMEOUT,
588                        SILC_TASK_PRI_LOW);
589
590   /* Register the connection for network input and output. This sets
591      that scheduler will listen for incoming packets for this connection 
592      and sets that outgoing packets may be sent to this connection as 
593      well. However, this doesn't set the scheduler for outgoing traffic,
594      it will be set separately by calling SILC_SET_CONNECTION_FOR_OUTPUT,
595      later when outgoing data is available. */
596   context = (void *)server;
597   SILC_REGISTER_CONNECTION_FOR_IO(sock);
598   
599   /* Run the protocol */
600   protocol->execute(server->timeout_queue, 0, protocol, sock, 0, 0);
601 }
602   
603 /* This function connects to our primary router or if we are a router this
604    establishes all our primary routes. This is called at the start of the
605    server to do authentication and key exchange with our router - called
606    from schedule. */
607
608 SILC_TASK_CALLBACK(silc_server_connect_to_router)
609 {
610   SilcServer server = (SilcServer)context;
611   SilcServerConnection sconn;
612
613   SILC_LOG_DEBUG(("Connecting to router(s)"));
614
615   /* If we are normal SILC server we need to connect to our cell's
616      router. */
617   if (server->server_type == SILC_SERVER) {
618     SILC_LOG_DEBUG(("We are normal server"));
619
620     /* Create connection to the router, if configured. */
621     if (server->config->routers) {
622
623       /* Allocate connection object for hold connection specific stuff. */
624       sconn = silc_calloc(1, sizeof(*sconn));
625       sconn->server = server;
626       sconn->remote_host = server->config->routers->host;
627       sconn->remote_port = server->config->routers->port;
628
629       silc_task_register(server->timeout_queue, fd, 
630                          silc_server_connect_router,
631                          (void *)sconn, 0, 1, SILC_TASK_TIMEOUT, 
632                          SILC_TASK_PRI_NORMAL);
633       return;
634     }
635   }
636
637   /* If we are a SILC router we need to establish all of our primary
638      routes. */
639   if (server->server_type == SILC_ROUTER) {
640     SilcConfigServerSectionServerConnection *ptr;
641
642     SILC_LOG_DEBUG(("We are router"));
643
644     /* Create the connections to all our routes */
645     ptr = server->config->routers;
646     while (ptr) {
647
648       SILC_LOG_DEBUG(("Router connection [%s] %s:%d",
649                       ptr->initiator ? "Initiator" : "Responder",
650                       ptr->host, ptr->port));
651
652       if (ptr->initiator) {
653         /* Allocate connection object for hold connection specific stuff. */
654         sconn = silc_calloc(1, sizeof(*sconn));
655         sconn->server = server;
656         sconn->remote_host = ptr->host;
657         sconn->remote_port = ptr->port;
658
659         silc_task_register(server->timeout_queue, fd, 
660                            silc_server_connect_router,
661                            (void *)sconn, 0, 1, SILC_TASK_TIMEOUT, 
662                            SILC_TASK_PRI_NORMAL);
663       }
664
665       if (!ptr->next)
666         return;
667
668       ptr = ptr->next;
669     }
670   }
671
672   SILC_LOG_DEBUG(("No router(s), server will be standalone"));
673   
674   /* There wasn't a configured router, we will continue but we don't
675      have a connection to outside world.  We will be standalone server. */
676   server->standalone = TRUE;
677 }
678
679 /* Second part of connecting to router(s). Key exchange protocol has been
680    executed and now we will execute authentication protocol. */
681
682 SILC_TASK_CALLBACK(silc_server_connect_to_router_second)
683 {
684   SilcProtocol protocol = (SilcProtocol)context;
685   SilcServerKEInternalContext *ctx = 
686     (SilcServerKEInternalContext *)protocol->context;
687   SilcServer server = (SilcServer)ctx->server;
688   SilcServerConnection sconn = (SilcServerConnection)ctx->context;
689   SilcSocketConnection sock = NULL;
690   SilcServerConnAuthInternalContext *proto_ctx;
691
692   SILC_LOG_DEBUG(("Start"));
693
694   if (protocol->state == SILC_PROTOCOL_STATE_ERROR) {
695     /* Error occured during protocol */
696     silc_protocol_free(protocol);
697     if (ctx->packet)
698       silc_packet_context_free(ctx->packet);
699     if (ctx->ske)
700       silc_ske_free(ctx->ske);
701     if (ctx->dest_id)
702       silc_free(ctx->dest_id);
703     silc_free(ctx);
704     sock->protocol = NULL;
705     silc_server_disconnect_remote(server, sock, "Server closed connection: "
706                                   "Key exchange failed");
707     return;
708   }
709   
710   /* Allocate internal context for the authentication protocol. This
711      is sent as context for the protocol. */
712   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
713   proto_ctx->server = (void *)server;
714   proto_ctx->context = (void *)sconn;
715   proto_ctx->sock = sock = server->sockets[fd];
716   proto_ctx->ske = ctx->ske;       /* Save SKE object from previous protocol */
717   proto_ctx->dest_id_type = ctx->dest_id_type;
718   proto_ctx->dest_id = ctx->dest_id;
719
720   /* Resolve the authentication method used in this connection */
721   proto_ctx->auth_meth = SILC_PROTOCOL_CONN_AUTH_PASSWORD;
722   if (server->config->routers) {
723     SilcConfigServerSectionServerConnection *conn = NULL;
724
725     /* Check if we find a match from user configured connections */
726     conn = silc_config_server_find_router_conn(server->config,
727                                                sock->hostname,
728                                                sock->port);
729     if (conn) {
730       /* Match found. Use the configured authentication method */
731       proto_ctx->auth_meth = conn->auth_meth;
732       if (conn->auth_data) {
733         proto_ctx->auth_data = strdup(conn->auth_data);
734         proto_ctx->auth_data_len = strlen(conn->auth_data);
735       }
736     } else {
737       /* No match found. */
738       /* XXX */
739     }
740   } else {
741     /* XXX */
742   }
743
744   /* Free old protocol as it is finished now */
745   silc_protocol_free(protocol);
746   if (ctx->packet)
747     silc_packet_context_free(ctx->packet);
748   silc_free(ctx);
749   sock->protocol = NULL;
750
751   /* Allocate the authentication protocol. This is allocated here
752      but we won't start it yet. We will be receiving party of this
753      protocol thus we will wait that connecting party will make
754      their first move. */
755   silc_protocol_alloc(SILC_PROTOCOL_SERVER_CONNECTION_AUTH, 
756                       &sock->protocol, proto_ctx, 
757                       silc_server_connect_to_router_final);
758
759   /* Register timeout task. If the protocol is not executed inside
760      this timelimit the connection will be terminated. Currently
761      this is 15 seconds and is hard coded limit (XXX). */
762   proto_ctx->timeout_task = 
763     silc_task_register(server->timeout_queue, sock->sock, 
764                        silc_server_timeout_remote,
765                        (void *)server, 15, 0,
766                        SILC_TASK_TIMEOUT,
767                        SILC_TASK_PRI_LOW);
768
769   /* Run the protocol */
770   sock->protocol->execute(server->timeout_queue, 0, 
771                           sock->protocol, sock->sock, 0, 0);
772 }
773
774 /* Finalizes the connection to router. Registers a server task to the
775    queue so that we can accept new connections. */
776
777 SILC_TASK_CALLBACK(silc_server_connect_to_router_final)
778 {
779   SilcProtocol protocol = (SilcProtocol)context;
780   SilcServerConnAuthInternalContext *ctx = 
781     (SilcServerConnAuthInternalContext *)protocol->context;
782   SilcServer server = (SilcServer)ctx->server;
783   SilcServerConnection sconn = (SilcServerConnection)ctx->context;
784   SilcSocketConnection sock = ctx->sock;
785   SilcServerEntry id_entry;
786   SilcBuffer packet;
787   SilcServerHBContext hb_context;
788   unsigned char *id_string;
789
790   SILC_LOG_DEBUG(("Start"));
791
792   if (protocol->state == SILC_PROTOCOL_STATE_ERROR) {
793     /* Error occured during protocol */
794     if (ctx->dest_id)
795       silc_free(ctx->dest_id);
796     silc_server_disconnect_remote(server, sock, "Server closed connection: "
797                                   "Authentication failed");
798     goto out;
799   }
800
801   /* Add a task to the queue. This task receives new connections to the 
802      server. This task remains on the queue until the end of the program. */
803   if (!server->listenning) {
804     silc_task_register(server->io_queue, server->sock, 
805                        silc_server_accept_new_connection,
806                        (void *)server, 0, 0, 
807                        SILC_TASK_FD,
808                        SILC_TASK_PRI_NORMAL);
809     server->listenning = TRUE;
810   }
811
812   /* Send NEW_SERVER packet to the router. We will become registered
813      to the SILC network after sending this packet. */
814   id_string = silc_id_id2str(server->id, SILC_ID_SERVER);
815   packet = silc_buffer_alloc(2 + 2 + SILC_ID_SERVER_LEN + 
816                              strlen(server->server_name));
817   silc_buffer_pull_tail(packet, SILC_BUFFER_END(packet));
818   silc_buffer_format(packet,
819                      SILC_STR_UI_SHORT(SILC_ID_SERVER_LEN),
820                      SILC_STR_UI_XNSTRING(id_string, SILC_ID_SERVER_LEN),
821                      SILC_STR_UI_SHORT(strlen(server->server_name)),
822                      SILC_STR_UI_XNSTRING(server->server_name,
823                                           strlen(server->server_name)),
824                      SILC_STR_END);
825
826   /* Send the packet */
827   silc_server_packet_send(server, ctx->sock, SILC_PACKET_NEW_SERVER, 0,
828                           packet->data, packet->len, TRUE);
829   silc_buffer_free(packet);
830   silc_free(id_string);
831
832   SILC_LOG_DEBUG(("Connected to router %s", sock->hostname));
833
834   /* Add the connected router to local server list */
835   server->standalone = FALSE;
836   id_entry = silc_idlist_add_server(server->local_list, sock->hostname,
837                                     SILC_ROUTER, ctx->dest_id, NULL, sock);
838   if (!id_entry) {
839     if (ctx->dest_id)
840       silc_free(ctx->dest_id);
841     silc_server_disconnect_remote(server, sock, "Server closed connection: "
842                                   "Authentication failed");
843     goto out;
844   }
845
846   silc_idlist_add_data(id_entry, (SilcIDListData)sock->user_data);
847   silc_free(sock->user_data);
848   sock->user_data = (void *)id_entry;
849   sock->type = SILC_SOCKET_TYPE_ROUTER;
850   server->id_entry->router = id_entry;
851   server->router = id_entry;
852   server->router->data.registered = TRUE;
853
854   /* Perform keepalive. The `hb_context' will be freed automatically
855      when finally calling the silc_socket_free function. XXX hardcoded 
856      timeout!! */
857   hb_context = silc_calloc(1, sizeof(*hb_context));
858   hb_context->server = server;
859   silc_socket_set_heartbeat(sock, 600, hb_context,
860                             silc_server_perform_heartbeat,
861                             server->timeout_queue);
862
863   /* If we are router then announce our possible servers. */
864   if (server->server_type == SILC_ROUTER)
865     silc_server_announce_servers(server);
866
867   /* Announce our clients and channels to the router */
868   silc_server_announce_clients(server);
869   silc_server_announce_channels(server);
870
871  out:
872   /* Free the temporary connection data context */
873   if (sconn)
874     silc_free(sconn);
875
876   /* Free the protocol object */
877   silc_protocol_free(protocol);
878   if (ctx->packet)
879     silc_packet_context_free(ctx->packet);
880   if (ctx->ske)
881     silc_ske_free(ctx->ske);
882   silc_free(ctx);
883   sock->protocol = NULL;
884 }
885
886 /* Accepts new connections to the server. Accepting new connections are
887    done in three parts to make it async. */
888
889 SILC_TASK_CALLBACK(silc_server_accept_new_connection)
890 {
891   SilcServer server = (SilcServer)context;
892   SilcSocketConnection newsocket;
893   SilcServerKEInternalContext *proto_ctx;
894   int sock;
895
896   SILC_LOG_DEBUG(("Accepting new connection"));
897
898   server->stat.conn_attempts++;
899
900   sock = silc_net_accept_connection(server->sock);
901   if (sock < 0) {
902     SILC_LOG_ERROR(("Could not accept new connection: %s", strerror(errno)));
903     server->stat.conn_failures++;
904     return;
905   }
906
907   /* Check max connections */
908   if (sock > SILC_SERVER_MAX_CONNECTIONS) {
909     if (server->config->redirect) {
910       /* XXX Redirecting connection to somewhere else now?? */
911       /*silc_server_send_notify("Server is full, trying to redirect..."); */
912     } else {
913       SILC_LOG_ERROR(("Refusing connection, server is full"));
914       server->stat.conn_failures++;
915     }
916     return;
917   }
918
919   /* Set socket options */
920   silc_net_set_socket_nonblock(sock);
921   silc_net_set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 1);
922
923   /* We don't create a ID yet, since we don't know what type of connection
924      this is yet. But, we do add the connection to the socket table. */
925   silc_socket_alloc(sock, SILC_SOCKET_TYPE_UNKNOWN, NULL, &newsocket);
926   server->sockets[sock] = newsocket;
927
928   /* XXX This MUST be done async as this will block the entire server
929      process. Either we have to do our own resolver stuff or in the future
930      we can use threads. */
931   /* Perform name and address lookups for the remote host. */
932   silc_net_check_host_by_sock(sock, &newsocket->hostname, &newsocket->ip);
933   if ((server->params->require_reverse_mapping && !newsocket->hostname) ||
934       !newsocket->ip) {
935     SILC_LOG_ERROR(("IP/DNS lookup failed"));
936     server->stat.conn_failures++;
937     return;
938   }
939   if (!newsocket->hostname)
940     newsocket->hostname = strdup(newsocket->ip);
941   newsocket->port = silc_net_get_remote_port(sock);
942
943   SILC_LOG_INFO(("Incoming connection from %s (%s)", newsocket->hostname,
944                  newsocket->ip));
945
946   /* Allocate internal context for key exchange protocol. This is
947      sent as context for the protocol. */
948   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
949   proto_ctx->server = context;
950   proto_ctx->sock = newsocket;
951   proto_ctx->rng = server->rng;
952   proto_ctx->responder = TRUE;
953
954   /* Prepare the connection for key exchange protocol. We allocate the
955      protocol but will not start it yet. The connector will be the
956      initiator of the protocol thus we will wait for initiation from 
957      there before we start the protocol. */
958   server->stat.auth_attempts++;
959   silc_protocol_alloc(SILC_PROTOCOL_SERVER_KEY_EXCHANGE, 
960                       &newsocket->protocol, proto_ctx, 
961                       silc_server_accept_new_connection_second);
962
963   /* Register a timeout task that will be executed if the connector
964      will not start the key exchange protocol within 60 seconds. For
965      now, this is a hard coded limit. After 60 secs the connection will
966      be closed if the key exchange protocol has not been started. */
967   proto_ctx->timeout_task = 
968     silc_task_register(server->timeout_queue, newsocket->sock, 
969                        silc_server_timeout_remote,
970                        context, 60, 0,
971                        SILC_TASK_TIMEOUT,
972                        SILC_TASK_PRI_LOW);
973
974   /* Register the connection for network input and output. This sets
975      that scheduler will listen for incoming packets for this connection 
976      and sets that outgoing packets may be sent to this connection as well.
977      However, this doesn't set the scheduler for outgoing traffic, it
978      will be set separately by calling SILC_SET_CONNECTION_FOR_OUTPUT,
979      later when outgoing data is available. */
980   SILC_REGISTER_CONNECTION_FOR_IO(sock);
981 }
982
983 /* Second part of accepting new connection. Key exchange protocol has been
984    performed and now it is time to do little connection authentication
985    protocol to figure out whether this connection is client or server
986    and whether it has right to access this server (especially server
987    connections needs to be authenticated). */
988
989 SILC_TASK_CALLBACK(silc_server_accept_new_connection_second)
990 {
991   SilcProtocol protocol = (SilcProtocol)context;
992   SilcServerKEInternalContext *ctx = 
993     (SilcServerKEInternalContext *)protocol->context;
994   SilcServer server = (SilcServer)ctx->server;
995   SilcSocketConnection sock = NULL;
996   SilcServerConnAuthInternalContext *proto_ctx;
997
998   SILC_LOG_DEBUG(("Start"));
999
1000   if (protocol->state == SILC_PROTOCOL_STATE_ERROR) {
1001     /* Error occured during protocol */
1002     silc_protocol_free(protocol);
1003     if (ctx->packet)
1004       silc_packet_context_free(ctx->packet);
1005     if (ctx->ske)
1006       silc_ske_free(ctx->ske);
1007     if (ctx->dest_id)
1008       silc_free(ctx->dest_id);
1009     silc_free(ctx);
1010     if (sock)
1011       sock->protocol = NULL;
1012     silc_server_disconnect_remote(server, sock, "Server closed connection: "
1013                                   "Key exchange failed");
1014     server->stat.auth_failures++;
1015     return;
1016   }
1017
1018   /* Allocate internal context for the authentication protocol. This
1019      is sent as context for the protocol. */
1020   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
1021   proto_ctx->server = (void *)server;
1022   proto_ctx->sock = sock = server->sockets[fd];
1023   proto_ctx->ske = ctx->ske;    /* Save SKE object from previous protocol */
1024   proto_ctx->responder = TRUE;
1025   proto_ctx->dest_id_type = ctx->dest_id_type;
1026   proto_ctx->dest_id = ctx->dest_id;
1027
1028   /* Free old protocol as it is finished now */
1029   silc_protocol_free(protocol);
1030   if (ctx->packet)
1031     silc_packet_context_free(ctx->packet);
1032   silc_free(ctx);
1033   sock->protocol = NULL;
1034
1035   /* Allocate the authentication protocol. This is allocated here
1036      but we won't start it yet. We will be receiving party of this
1037      protocol thus we will wait that connecting party will make
1038      their first move. */
1039   silc_protocol_alloc(SILC_PROTOCOL_SERVER_CONNECTION_AUTH, 
1040                       &sock->protocol, proto_ctx, 
1041                       silc_server_accept_new_connection_final);
1042
1043   /* Register timeout task. If the protocol is not executed inside
1044      this timelimit the connection will be terminated. Currently
1045      this is 60 seconds and is hard coded limit (XXX). */
1046   proto_ctx->timeout_task = 
1047     silc_task_register(server->timeout_queue, sock->sock, 
1048                        silc_server_timeout_remote,
1049                        (void *)server, 60, 0,
1050                        SILC_TASK_TIMEOUT,
1051                        SILC_TASK_PRI_LOW);
1052 }
1053
1054 /* Final part of accepting new connection. The connection has now
1055    been authenticated and keys has been exchanged. We also know whether
1056    this is client or server connection. */
1057
1058 SILC_TASK_CALLBACK(silc_server_accept_new_connection_final)
1059 {
1060   SilcProtocol protocol = (SilcProtocol)context;
1061   SilcServerConnAuthInternalContext *ctx = 
1062     (SilcServerConnAuthInternalContext *)protocol->context;
1063   SilcServer server = (SilcServer)ctx->server;
1064   SilcSocketConnection sock = ctx->sock;
1065   SilcServerHBContext hb_context;
1066   void *id_entry = NULL;
1067
1068   SILC_LOG_DEBUG(("Start"));
1069
1070   if (protocol->state == SILC_PROTOCOL_STATE_ERROR) {
1071     /* Error occured during protocol */
1072     silc_protocol_free(protocol);
1073     if (ctx->packet)
1074       silc_packet_context_free(ctx->packet);
1075     if (ctx->ske)
1076       silc_ske_free(ctx->ske);
1077     if (ctx->dest_id)
1078       silc_free(ctx->dest_id);
1079     silc_free(ctx);
1080     if (sock)
1081       sock->protocol = NULL;
1082     silc_server_disconnect_remote(server, sock, "Server closed connection: "
1083                                   "Authentication failed");
1084     server->stat.auth_failures++;
1085     return;
1086   }
1087
1088   sock->type = ctx->conn_type;
1089   switch(sock->type) {
1090   case SILC_SOCKET_TYPE_CLIENT:
1091     {
1092       SilcClientEntry client;
1093
1094       SILC_LOG_DEBUG(("Remote host is client"));
1095       SILC_LOG_INFO(("Connection from %s (%s) is client", sock->hostname,
1096                      sock->ip));
1097
1098       /* Add the client to the client ID cache. The nickname and Client ID
1099          and other information is created after we have received NEW_CLIENT
1100          packet from client. */
1101       client = silc_idlist_add_client(server->local_list, 
1102                                       NULL, NULL, NULL, NULL, NULL, sock);
1103       if (!client) {
1104         SILC_LOG_ERROR(("Could not add new client to cache"));
1105         silc_free(sock->user_data);
1106         break;
1107       }
1108
1109       /* Statistics */
1110       server->stat.my_clients++;
1111       server->stat.clients++;
1112       if (server->server_type == SILC_ROUTER)
1113         server->stat.cell_clients++;
1114
1115       id_entry = (void *)client;
1116       break;
1117     }
1118   case SILC_SOCKET_TYPE_SERVER:
1119   case SILC_SOCKET_TYPE_ROUTER:
1120     {
1121       SilcServerEntry new_server;
1122
1123       SILC_LOG_DEBUG(("Remote host is %s", 
1124                       sock->type == SILC_SOCKET_TYPE_SERVER ? 
1125                       "server" : "router"));
1126       SILC_LOG_INFO(("Connection from %s (%s) is %s", sock->hostname,
1127                      sock->ip, sock->type == SILC_SOCKET_TYPE_SERVER ? 
1128                      "server" : "router"));
1129
1130       /* Add the server into server cache. The server name and Server ID
1131          is updated after we have received NEW_SERVER packet from the
1132          server. We mark ourselves as router for this server if we really
1133          are router. */
1134       new_server = 
1135         silc_idlist_add_server(server->local_list, NULL,
1136                                sock->type == SILC_SOCKET_TYPE_SERVER ?
1137                                SILC_SERVER : SILC_ROUTER, NULL, 
1138                                sock->type == SILC_SOCKET_TYPE_SERVER ?
1139                                server->id_entry : NULL, sock);
1140       if (!new_server) {
1141         SILC_LOG_ERROR(("Could not add new server to cache"));
1142         silc_free(sock->user_data);
1143         break;
1144       }
1145
1146       /* Statistics */
1147       if (sock->type == SILC_SOCKET_TYPE_SERVER)
1148         server->stat.my_servers++;
1149       else
1150         server->stat.my_routers++;
1151       server->stat.servers++;
1152
1153       id_entry = (void *)new_server;
1154       
1155       /* There is connection to other server now, if it is router then
1156          we will have connection to outside world.  If we are router but
1157          normal server connected to us then we will remain standalone,
1158          if we are standlone. */
1159       if (server->standalone && sock->type == SILC_SOCKET_TYPE_ROUTER) {
1160         SILC_LOG_DEBUG(("We are not standalone server anymore"));
1161         server->standalone = FALSE;
1162         if (!server->id_entry->router) {
1163           server->id_entry->router = id_entry;
1164           server->router = id_entry;
1165         }
1166       }
1167       break;
1168     }
1169   default:
1170     break;
1171   }
1172
1173   /* Add the common data structure to the ID entry. */
1174   if (id_entry)
1175     silc_idlist_add_data(id_entry, (SilcIDListData)sock->user_data);
1176       
1177   /* Add to sockets internal pointer for fast referencing */
1178   silc_free(sock->user_data);
1179   sock->user_data = id_entry;
1180
1181   /* Connection has been fully established now. Everything is ok. */
1182   SILC_LOG_DEBUG(("New connection authenticated"));
1183
1184   /* Perform keepalive. The `hb_context' will be freed automatically
1185      when finally calling the silc_socket_free function. XXX hardcoded 
1186      timeout!! */
1187   hb_context = silc_calloc(1, sizeof(*hb_context));
1188   hb_context->server = server;
1189   silc_socket_set_heartbeat(sock, 600, hb_context,
1190                             silc_server_perform_heartbeat,
1191                             server->timeout_queue);
1192
1193   silc_protocol_free(protocol);
1194   if (ctx->packet)
1195     silc_packet_context_free(ctx->packet);
1196   if (ctx->ske)
1197     silc_ske_free(ctx->ske);
1198   if (ctx->dest_id)
1199     silc_free(ctx->dest_id);
1200   silc_free(ctx);
1201   sock->protocol = NULL;
1202 }
1203
1204 /* This function is used to read packets from network and send packets to
1205    network. This is usually a generic task. */
1206
1207 SILC_TASK_CALLBACK(silc_server_packet_process)
1208 {
1209   SilcServer server = (SilcServer)context;
1210   SilcSocketConnection sock = server->sockets[fd];
1211   SilcIDListData idata;
1212   SilcCipher cipher = NULL;
1213   SilcHmac hmac = NULL;
1214   int ret;
1215
1216   if (!sock)
1217     return;
1218
1219   SILC_LOG_DEBUG(("Processing packet"));
1220
1221   /* Packet sending */
1222
1223   if (type == SILC_TASK_WRITE) {
1224     /* Do not send data to disconnected connection */
1225     if (SILC_IS_DISCONNECTED(sock))
1226       return;
1227
1228     server->stat.packets_sent++;
1229
1230     if (sock->outbuf->data - sock->outbuf->head)
1231       silc_buffer_push(sock->outbuf, sock->outbuf->data - sock->outbuf->head);
1232
1233     ret = silc_server_packet_send_real(server, sock, TRUE);
1234
1235     /* If returned -2 could not write to connection now, will do
1236        it later. */
1237     if (ret == -2)
1238       return;
1239
1240     if (ret == -1)
1241       return;
1242     
1243     /* The packet has been sent and now it is time to set the connection
1244        back to only for input. When there is again some outgoing data 
1245        available for this connection it will be set for output as well. 
1246        This call clears the output setting and sets it only for input. */
1247     SILC_SET_CONNECTION_FOR_INPUT(fd);
1248     SILC_UNSET_OUTBUF_PENDING(sock);
1249
1250     silc_buffer_clear(sock->outbuf);
1251     return;
1252   }
1253
1254   /* Packet receiving */
1255
1256   /* Read some data from connection */
1257   ret = silc_packet_receive(sock);
1258   if (ret < 0)
1259     return;
1260     
1261   /* EOF */
1262   if (ret == 0) {
1263     SILC_LOG_DEBUG(("Read EOF"));
1264       
1265     /* If connection is disconnecting already we will finally
1266        close the connection */
1267     if (SILC_IS_DISCONNECTING(sock)) {
1268       if (sock->user_data)
1269         silc_server_free_sock_user_data(server, sock);
1270       silc_server_close_connection(server, sock);
1271       return;
1272     }
1273       
1274     SILC_LOG_DEBUG(("Premature EOF from connection %d", sock->sock));
1275     SILC_SET_DISCONNECTING(sock);
1276
1277     /* If the closed connection was our primary router connection the
1278        start re-connecting phase. */
1279     if (!server->standalone && server->server_type == SILC_SERVER && 
1280         sock == server->router->connection)
1281       silc_task_register(server->timeout_queue, 0, 
1282                          silc_server_connect_to_router,
1283                          context, 0, 500000,
1284                          SILC_TASK_TIMEOUT,
1285                          SILC_TASK_PRI_NORMAL);
1286
1287     if (sock->user_data)
1288       silc_server_free_sock_user_data(server, sock);
1289     silc_server_close_connection(server, sock);
1290     return;
1291   }
1292
1293   /* If connection is disconnecting or disconnected we will ignore
1294      what we read. */
1295   if (SILC_IS_DISCONNECTING(sock) || SILC_IS_DISCONNECTED(sock)) {
1296     SILC_LOG_DEBUG(("Ignoring read data from disonnected connection"));
1297     return;
1298   }
1299
1300   server->stat.packets_received++;
1301
1302   /* Get keys and stuff from ID entry */
1303   idata = (SilcIDListData)sock->user_data;
1304   if (idata) {
1305     idata->last_receive = time(NULL);
1306     cipher = idata->receive_key;
1307     hmac = idata->hmac;
1308   }
1309  
1310   /* Process the packet. This will call the parser that will then
1311      decrypt and parse the packet. */
1312   silc_packet_receive_process(sock, cipher, hmac, silc_server_packet_parse, 
1313                               server);
1314 }
1315
1316 /* Parses whole packet, received earlier. */
1317
1318 SILC_TASK_CALLBACK(silc_server_packet_parse_real)
1319 {
1320   SilcPacketParserContext *parse_ctx = (SilcPacketParserContext *)context;
1321   SilcServer server = (SilcServer)parse_ctx->context;
1322   SilcSocketConnection sock = parse_ctx->sock;
1323   SilcPacketContext *packet = parse_ctx->packet;
1324   int ret;
1325
1326   SILC_LOG_DEBUG(("Start"));
1327
1328   /* Decrypt the received packet */
1329   ret = silc_packet_decrypt(parse_ctx->cipher, parse_ctx->hmac, 
1330                             packet->buffer, packet);
1331   if (ret < 0)
1332     goto out;
1333
1334   if (ret == 0) {
1335     /* Parse the packet. Packet type is returned. */
1336     ret = silc_packet_parse(packet);
1337   } else {
1338     /* Parse the packet header in special way as this is "special"
1339        packet type. */
1340     ret = silc_packet_parse_special(packet);
1341   }
1342
1343   if (ret == SILC_PACKET_NONE)
1344     goto out;
1345
1346   if (server->server_type == SILC_ROUTER) {
1347     /* Route the packet if it is not destined to us. Other ID types but
1348        server are handled separately after processing them. */
1349     if (packet->dst_id_type == SILC_ID_SERVER && 
1350         sock->type != SILC_SOCKET_TYPE_CLIENT &&
1351         SILC_ID_SERVER_COMPARE(packet->dst_id, server->id_string)) {
1352       
1353       /* Route the packet to fastest route for the destination ID */
1354       void *id = silc_id_str2id(packet->dst_id, packet->dst_id_len, 
1355                                 packet->dst_id_type);
1356       if (!id)
1357         goto out;
1358       silc_server_packet_route(server,
1359                                silc_server_route_get(server, id,
1360                                                      packet->dst_id_type),
1361                                packet);
1362       silc_free(id);
1363       goto out;
1364     }
1365     
1366     /* Broadcast packet if it is marked as broadcast packet and it is
1367        originated from router and we are router. */
1368     if (sock->type == SILC_SOCKET_TYPE_ROUTER &&
1369         packet->flags & SILC_PACKET_FLAG_BROADCAST) {
1370       silc_server_packet_broadcast(server, server->router->connection, packet);
1371     }
1372   }
1373
1374   /* Parse the incoming packet type */
1375   silc_server_packet_parse_type(server, sock, packet);
1376
1377  out:
1378   silc_buffer_clear(sock->inbuf);
1379   silc_packet_context_free(packet);
1380   silc_free(parse_ctx);
1381 }
1382
1383 /* Parser callback called by silc_packet_receive_process. This merely
1384    registers timeout that will handle the actual parsing when appropriate. */
1385
1386 void silc_server_packet_parse(SilcPacketParserContext *parser_context)
1387 {
1388   SilcServer server = (SilcServer)parser_context->context;
1389   SilcSocketConnection sock = parser_context->sock;
1390
1391   switch (sock->type) {
1392   case SILC_SOCKET_TYPE_CLIENT:
1393   case SILC_SOCKET_TYPE_UNKNOWN:
1394     /* Parse the packet with timeout */
1395     silc_task_register(server->timeout_queue, sock->sock,
1396                        silc_server_packet_parse_real,
1397                        (void *)parser_context, 0, 100000,
1398                        SILC_TASK_TIMEOUT,
1399                        SILC_TASK_PRI_NORMAL);
1400     break;
1401   case SILC_SOCKET_TYPE_SERVER:
1402   case SILC_SOCKET_TYPE_ROUTER:
1403     /* Packets from servers are parsed as soon as possible */
1404     silc_task_register(server->timeout_queue, sock->sock,
1405                        silc_server_packet_parse_real,
1406                        (void *)parser_context, 0, 1,
1407                        SILC_TASK_TIMEOUT,
1408                        SILC_TASK_PRI_NORMAL);
1409     break;
1410   default:
1411     return;
1412   }
1413 }
1414
1415 /* Parses the packet type and calls what ever routines the packet type
1416    requires. This is done for all incoming packets. */
1417
1418 void silc_server_packet_parse_type(SilcServer server, 
1419                                    SilcSocketConnection sock,
1420                                    SilcPacketContext *packet)
1421 {
1422   SilcPacketType type = packet->type;
1423
1424   SILC_LOG_DEBUG(("Parsing packet type %d", type));
1425
1426   /* Parse the packet type */
1427   switch(type) {
1428   case SILC_PACKET_DISCONNECT:
1429     SILC_LOG_DEBUG(("Disconnect packet"));
1430     break;
1431
1432   case SILC_PACKET_SUCCESS:
1433     /*
1434      * Success received for something. For now we can have only
1435      * one protocol for connection executing at once hence this
1436      * success message is for whatever protocol is executing currently.
1437      */
1438     SILC_LOG_DEBUG(("Success packet"));
1439     if (sock->protocol) {
1440       sock->protocol->execute(server->timeout_queue, 0,
1441                               sock->protocol, sock->sock, 0, 0);
1442     }
1443     break;
1444
1445   case SILC_PACKET_FAILURE:
1446     /*
1447      * Failure received for something. For now we can have only
1448      * one protocol for connection executing at once hence this
1449      * failure message is for whatever protocol is executing currently.
1450      */
1451     SILC_LOG_DEBUG(("Failure packet"));
1452     if (sock->protocol) {
1453       /* XXX Audit the failure type */
1454       sock->protocol->state = SILC_PROTOCOL_STATE_FAILURE;
1455       sock->protocol->execute(server->timeout_queue, 0,
1456                               sock->protocol, sock->sock, 0, 0);
1457     }
1458     break;
1459
1460   case SILC_PACKET_REJECT:
1461     SILC_LOG_DEBUG(("Reject packet"));
1462     return;
1463     break;
1464
1465   case SILC_PACKET_NOTIFY:
1466     /*
1467      * Received notify packet. Server can receive notify packets from
1468      * router. Server then relays the notify messages to clients if needed.
1469      */
1470     SILC_LOG_DEBUG(("Notify packet"));
1471     silc_server_notify(server, sock, packet);
1472     break;
1473
1474     /* 
1475      * Channel packets
1476      */
1477   case SILC_PACKET_CHANNEL_MESSAGE:
1478     /*
1479      * Received channel message. Channel messages are special packets
1480      * (although probably most common ones) thus they are handled
1481      * specially.
1482      */
1483     SILC_LOG_DEBUG(("Channel Message packet"));
1484     silc_server_channel_message(server, sock, packet);
1485     break;
1486
1487   case SILC_PACKET_CHANNEL_KEY:
1488     /*
1489      * Received key for channel. As channels are created by the router
1490      * the keys are as well. We will distribute the key to all of our
1491      * locally connected clients on the particular channel. Router
1492      * never receives this channel and thus is ignored.
1493      */
1494     SILC_LOG_DEBUG(("Channel Key packet"));
1495     silc_server_channel_key(server, sock, packet);
1496     break;
1497
1498     /*
1499      * Command packets
1500      */
1501   case SILC_PACKET_COMMAND:
1502     /*
1503      * Recived command. Processes the command request and allocates the
1504      * command context and calls the command.
1505      */
1506     SILC_LOG_DEBUG(("Command packet"));
1507     silc_server_command_process(server, sock, packet);
1508     break;
1509
1510   case SILC_PACKET_COMMAND_REPLY:
1511     /*
1512      * Received command reply packet. Received command reply to command. It
1513      * may be reply to command sent by us or reply to command sent by client
1514      * that we've routed further.
1515      */
1516     SILC_LOG_DEBUG(("Command Reply packet"));
1517     silc_server_command_reply(server, sock, packet);
1518     break;
1519
1520     /*
1521      * Private Message packets
1522      */
1523   case SILC_PACKET_PRIVATE_MESSAGE:
1524     /*
1525      * Received private message packet. The packet is coming from either
1526      * client or server.
1527      */
1528     SILC_LOG_DEBUG(("Private Message packet"));
1529     silc_server_private_message(server, sock, packet);
1530     break;
1531
1532   case SILC_PACKET_PRIVATE_MESSAGE_KEY:
1533     /*
1534      * Private message key packet.
1535      */
1536     break;
1537
1538     /*
1539      * Key Exchange protocol packets
1540      */
1541   case SILC_PACKET_KEY_EXCHANGE:
1542     SILC_LOG_DEBUG(("KE packet"));
1543     if (sock->protocol && sock->protocol->protocol->type 
1544         == SILC_PROTOCOL_SERVER_KEY_EXCHANGE) {
1545
1546       SilcServerKEInternalContext *proto_ctx = 
1547         (SilcServerKEInternalContext *)sock->protocol->context;
1548
1549       proto_ctx->packet = silc_packet_context_dup(packet);
1550
1551       /* Let the protocol handle the packet */
1552       sock->protocol->execute(server->timeout_queue, 0, 
1553                               sock->protocol, sock->sock, 0, 100000);
1554     } else {
1555       SILC_LOG_ERROR(("Received Key Exchange packet but no key exchange "
1556                       "protocol active, packet dropped."));
1557
1558       /* XXX Trigger KE protocol?? Rekey actually, maybe. */
1559     }
1560     break;
1561
1562   case SILC_PACKET_KEY_EXCHANGE_1:
1563     SILC_LOG_DEBUG(("KE 1 packet"));
1564     if (sock->protocol && sock->protocol->protocol->type 
1565         == SILC_PROTOCOL_SERVER_KEY_EXCHANGE) {
1566
1567       SilcServerKEInternalContext *proto_ctx = 
1568         (SilcServerKEInternalContext *)sock->protocol->context;
1569
1570       if (proto_ctx->packet)
1571         silc_packet_context_free(proto_ctx->packet);
1572
1573       proto_ctx->packet = silc_packet_context_dup(packet);
1574       proto_ctx->dest_id_type = packet->src_id_type;
1575       proto_ctx->dest_id = silc_id_str2id(packet->src_id, packet->src_id_len,
1576                                           packet->src_id_type);
1577       if (!proto_ctx->dest_id)
1578         break;
1579
1580       /* Let the protocol handle the packet */
1581       sock->protocol->execute(server->timeout_queue, 0, 
1582                               sock->protocol, sock->sock,
1583                               0, 100000);
1584     } else {
1585       SILC_LOG_ERROR(("Received Key Exchange 1 packet but no key exchange "
1586                       "protocol active, packet dropped."));
1587     }
1588     break;
1589
1590   case SILC_PACKET_KEY_EXCHANGE_2:
1591     SILC_LOG_DEBUG(("KE 2 packet"));
1592     if (sock->protocol && sock->protocol->protocol->type 
1593         == SILC_PROTOCOL_SERVER_KEY_EXCHANGE) {
1594
1595       SilcServerKEInternalContext *proto_ctx = 
1596         (SilcServerKEInternalContext *)sock->protocol->context;
1597
1598       if (proto_ctx->packet)
1599         silc_packet_context_free(proto_ctx->packet);
1600
1601       proto_ctx->packet = silc_packet_context_dup(packet);
1602       proto_ctx->dest_id_type = packet->src_id_type;
1603       proto_ctx->dest_id = silc_id_str2id(packet->src_id, packet->src_id_len,
1604                                           packet->src_id_type);
1605       if (!proto_ctx->dest_id)
1606         break;
1607
1608       /* Let the protocol handle the packet */
1609       sock->protocol->execute(server->timeout_queue, 0, 
1610                               sock->protocol, sock->sock,
1611                               0, 100000);
1612     } else {
1613       SILC_LOG_ERROR(("Received Key Exchange 2 packet but no key exchange "
1614                       "protocol active, packet dropped."));
1615     }
1616     break;
1617
1618   case SILC_PACKET_CONNECTION_AUTH_REQUEST:
1619     /*
1620      * Connection authentication request packet. When we receive this packet
1621      * we will send to the other end information about our mandatory
1622      * authentication method for the connection. This packet maybe received
1623      * at any time. 
1624      */
1625     SILC_LOG_DEBUG(("Connection authentication request packet"));
1626     break;
1627
1628     /*
1629      * Connection Authentication protocol packets
1630      */
1631   case SILC_PACKET_CONNECTION_AUTH:
1632     /* Start of the authentication protocol. We receive here the 
1633        authentication data and will verify it. */
1634     SILC_LOG_DEBUG(("Connection auth packet"));
1635     if (sock->protocol && sock->protocol->protocol->type 
1636         == SILC_PROTOCOL_SERVER_CONNECTION_AUTH) {
1637
1638       SilcServerConnAuthInternalContext *proto_ctx = 
1639         (SilcServerConnAuthInternalContext *)sock->protocol->context;
1640
1641       proto_ctx->packet = silc_packet_context_dup(packet);
1642
1643       /* Let the protocol handle the packet */
1644       sock->protocol->execute(server->timeout_queue, 0, 
1645                               sock->protocol, sock->sock, 0, 0);
1646     } else {
1647       SILC_LOG_ERROR(("Received Connection Auth packet but no authentication "
1648                       "protocol active, packet dropped."));
1649     }
1650     break;
1651
1652   case SILC_PACKET_NEW_ID:
1653     /*
1654      * Received New ID packet. This includes some new ID that has been
1655      * created. It may be for client, server or channel. This is the way
1656      * to distribute information about new registered entities in the
1657      * SILC network.
1658      */
1659     SILC_LOG_DEBUG(("New ID packet"));
1660     silc_server_new_id(server, sock, packet);
1661     break;
1662
1663   case SILC_PACKET_NEW_ID_LIST:
1664     /*
1665      * Received list of ID's. This packet is used by servers and routers
1666      * to notify their primary router about clients and servers they have.
1667      */
1668     SILC_LOG_DEBUG(("New ID List packet"));
1669     silc_server_new_id_list(server, sock, packet);
1670     break;
1671
1672   case SILC_PACKET_NEW_CLIENT:
1673     /*
1674      * Received new client packet. This includes client information that
1675      * we will use to create initial client ID. After creating new
1676      * ID we will send it to the client.
1677      */
1678     SILC_LOG_DEBUG(("New Client packet"));
1679     silc_server_new_client(server, sock, packet);
1680     break;
1681
1682   case SILC_PACKET_NEW_SERVER:
1683     /*
1684      * Received new server packet. This includes Server ID and some other
1685      * information that we may save. This is received after server has 
1686      * connected to us.
1687      */
1688     SILC_LOG_DEBUG(("New Server packet"));
1689     silc_server_new_server(server, sock, packet);
1690     break;
1691
1692   case SILC_PACKET_NEW_CHANNEL:
1693     /*
1694      * Received new channel packet. Information about new channel in the
1695      * network are distributed using this packet.
1696      */
1697     SILC_LOG_DEBUG(("New Channel packet"));
1698     silc_server_new_channel(server, sock, packet);
1699     break;
1700
1701   case SILC_PACKET_NEW_CHANNEL_USER:
1702     /*
1703      * Received new channel user packet. Information about new users on a
1704      * channel are distributed between routers using this packet.  The
1705      * router receiving this will redistribute it and also sent JOIN notify
1706      * to local clients on the same channel. Normal server sends JOIN notify
1707      * to its local clients on the channel.
1708      */
1709     SILC_LOG_DEBUG(("New Channel User packet"));
1710     silc_server_new_channel_user(server, sock, packet);
1711     break;
1712
1713   case SILC_PACKET_NEW_CHANNEL_LIST:
1714     /*
1715      * List of new channel packets received. This is usually received when
1716      * existing server or router connects to us and distributes information
1717      * of all channels it has.
1718      */
1719     SILC_LOG_DEBUG(("New Channel List packet"));
1720     silc_server_new_channel_list(server, sock, packet);
1721     break;
1722
1723   case SILC_PACKET_NEW_CHANNEL_USER_LIST:
1724     /*
1725      * List of new channel user packets received. This is usually received
1726      * when existing server or router connects to us and distributes 
1727      * information of all channel users it has.
1728      */
1729     SILC_LOG_DEBUG(("New Channel User List packet"));
1730     silc_server_new_channel_user_list(server, sock, packet);
1731     break;
1732
1733   case SILC_PACKET_REPLACE_ID:
1734     /*
1735      * Received replace ID packet. This sends the old ID that is to be
1736      * replaced with the new one included into the packet. Client must not
1737      * send this packet.
1738      */
1739     SILC_LOG_DEBUG(("Replace ID packet"));
1740     silc_server_replace_id(server, sock, packet);
1741     break;
1742
1743   case SILC_PACKET_REMOVE_ID:
1744     /*
1745      * Received remove ID Packet. 
1746      */
1747     SILC_LOG_DEBUG(("Remove ID packet"));
1748     silc_server_remove_id(server, sock, packet);
1749     break;
1750
1751   case SILC_PACKET_REMOVE_CHANNEL_USER:
1752     /*
1753      * Received packet to remove user from a channel. Routers notify other
1754      * routers about a user leaving a channel.
1755      */
1756     SILC_LOG_DEBUG(("Remove Channel User packet"));
1757     silc_server_remove_channel_user(server, sock, packet);
1758     break;
1759
1760   case SILC_PACKET_SET_MODE:
1761     /*
1762      * Received packet to set the mode of channel or client's channel mode.
1763      */
1764     SILC_LOG_DEBUG(("Set Mode packet"));
1765     silc_server_set_mode(server, sock, packet);
1766     break;
1767
1768   case SILC_PACKET_HEARTBEAT:
1769     /*
1770      * Received heartbeat.
1771      */
1772     SILC_LOG_DEBUG(("Heartbeat packet"));
1773     break;
1774
1775   default:
1776     SILC_LOG_ERROR(("Incorrect packet type %d, packet dropped", type));
1777     break;
1778   }
1779   
1780 }
1781
1782 /* Closes connection to socket connection */
1783
1784 void silc_server_close_connection(SilcServer server,
1785                                   SilcSocketConnection sock)
1786 {
1787   SILC_LOG_DEBUG(("Closing connection %d", sock->sock));
1788
1789   /* We won't listen for this connection anymore */
1790   silc_schedule_unset_listen_fd(sock->sock);
1791
1792   /* Unregister all tasks */
1793   silc_task_unregister_by_fd(server->io_queue, sock->sock);
1794   silc_task_unregister_by_fd(server->timeout_queue, sock->sock);
1795
1796   /* Close the actual connection */
1797   silc_net_close_connection(sock->sock);
1798   server->sockets[sock->sock] = NULL;
1799   silc_socket_free(sock);
1800 }
1801
1802 /* Sends disconnect message to remote connection and disconnects the 
1803    connection. */
1804
1805 void silc_server_disconnect_remote(SilcServer server,
1806                                    SilcSocketConnection sock,
1807                                    const char *fmt, ...)
1808 {
1809   va_list ap;
1810   unsigned char buf[4096];
1811
1812   if (!sock)
1813     return;
1814
1815   memset(buf, 0, sizeof(buf));
1816   va_start(ap, fmt);
1817   vsprintf(buf, fmt, ap);
1818   va_end(ap);
1819
1820   SILC_LOG_DEBUG(("Disconnecting remote host"));
1821
1822   SILC_LOG_INFO(("Disconnecting %s:%d (%s) [%s]", sock->hostname,
1823                   sock->port,
1824                   (sock->type == SILC_SOCKET_TYPE_UNKNOWN ? "Unknown" :
1825                    sock->type == SILC_SOCKET_TYPE_CLIENT ? "Client" :
1826                    sock->type == SILC_SOCKET_TYPE_SERVER ? "Server" :
1827                    "Router")));
1828
1829   /* Notify remote end that the conversation is over. The notify message
1830      is tried to be sent immediately. */
1831   silc_server_packet_send(server, sock, SILC_PACKET_DISCONNECT, 0,  
1832                           buf, strlen(buf), TRUE);
1833
1834   /* Mark the connection to be disconnected */
1835   SILC_SET_DISCONNECTED(sock);
1836   silc_server_close_connection(server, sock);
1837 }
1838
1839 /* Free's user_data pointer from socket connection object. This also sends
1840    appropriate notify packets to the network to inform about leaving
1841    entities. */
1842
1843 void silc_server_free_sock_user_data(SilcServer server, 
1844                                      SilcSocketConnection sock)
1845 {
1846   SILC_LOG_DEBUG(("Start"));
1847
1848   switch(sock->type) {
1849   case SILC_SOCKET_TYPE_CLIENT:
1850     {
1851       SilcClientEntry user_data = (SilcClientEntry)sock->user_data;
1852
1853       /* Remove client from all channels */
1854       silc_server_remove_from_channels(server, sock, user_data);
1855
1856       /* XXX must take some info to history before freeing */
1857
1858       /* Send REMOVE_ID packet to routers. */
1859       if (!server->standalone && server->router)
1860         silc_server_send_remove_id(server, server->router->connection,
1861                                    server->server_type == SILC_SERVER ?
1862                                    FALSE : TRUE, user_data->id, 
1863                                    SILC_ID_CLIENT_LEN, SILC_ID_CLIENT);
1864
1865       /* Free the client entry and everything in it */
1866       silc_idlist_del_data(user_data);
1867       silc_idlist_del_client(server->local_list, user_data);
1868       server->stat.my_clients--;
1869       server->stat.clients--;
1870       if (server->server_type == SILC_ROUTER)
1871         server->stat.cell_clients--;
1872       break;
1873     }
1874   case SILC_SOCKET_TYPE_SERVER:
1875   case SILC_SOCKET_TYPE_ROUTER:
1876     {
1877       SilcServerEntry user_data = (SilcServerEntry)sock->user_data;
1878
1879       /* Send REMOVE_ID packet to routers. */
1880       if (!server->standalone && server->router)
1881         silc_server_send_remove_id(server, server->router->connection,
1882                                    server->server_type == SILC_SERVER ?
1883                                    FALSE : TRUE, user_data->id, 
1884                                    SILC_ID_SERVER_LEN, SILC_ID_SERVER);
1885
1886       /* Then also free all client entries that this server owns as
1887          they will become invalid now as well. */
1888       silc_server_remove_clients_by_server(server, user_data);
1889
1890       /* If this was our primary router connection then we're lost to
1891          the outside world. */
1892       if (server->server_type == SILC_SERVER && server->router == user_data) {
1893         server->id_entry->router = NULL;
1894         server->router = NULL;
1895         server->standalone = TRUE;
1896       }
1897
1898       /* Free the server entry */
1899       silc_idlist_del_data(user_data);
1900       silc_idlist_del_server(server->local_list, user_data);
1901       server->stat.my_servers--;
1902       server->stat.servers--;
1903       if (server->server_type == SILC_ROUTER)
1904         server->stat.cell_servers--;
1905       break;
1906     }
1907   default:
1908     {
1909       SilcUnknownEntry user_data = (SilcUnknownEntry)sock->user_data;
1910
1911       silc_idlist_del_data(user_data);
1912       silc_free(user_data);
1913       break;
1914     }
1915   }
1916
1917   sock->user_data = NULL;
1918 }
1919
1920 /* This function is used to remove all client entries by the server `entry'.
1921    This is called when the connection is lost to the server. In this case
1922    we must invalidate all the client entries owned by the server `entry'. */
1923
1924 int silc_server_remove_clients_by_server(SilcServer server, 
1925                                          SilcServerEntry entry)
1926 {
1927   SilcIDCacheList list = NULL;
1928   SilcIDCacheEntry id_cache = NULL;
1929   SilcClientEntry client = NULL;
1930
1931   if (silc_idcache_find_by_id(server->local_list->clients, 
1932                               SILC_ID_CACHE_ANY, SILC_ID_CLIENT, &list)) {
1933
1934     if (silc_idcache_list_first(list, &id_cache)) {
1935       while (id_cache) {
1936         client = (SilcClientEntry)id_cache->context;
1937         
1938         if (client->router != entry) {
1939           if (!silc_idcache_list_next(list, &id_cache))
1940             break;
1941           else
1942             continue;
1943         }
1944
1945         /* Remove the client entry */
1946         silc_server_remove_from_channels(server, NULL, client);
1947         silc_idlist_del_client(server->local_list, client);
1948
1949         if (!silc_idcache_list_next(list, &id_cache))
1950           break;
1951       }
1952     }
1953     silc_idcache_list_free(list);
1954   }
1955   
1956   if (silc_idcache_find_by_id(server->global_list->clients, 
1957                               SILC_ID_CACHE_ANY, SILC_ID_CLIENT, &list)) {
1958
1959     if (silc_idcache_list_first(list, &id_cache)) {
1960       while (id_cache) {
1961         client = (SilcClientEntry)id_cache->context;
1962         
1963         if (client->router != entry) {
1964           if (!silc_idcache_list_next(list, &id_cache))
1965             break;
1966           else
1967             continue;
1968         }
1969
1970         /* Remove the client entry */
1971         silc_server_remove_from_channels(server, NULL, client);
1972         silc_idlist_del_client(server->global_list, client);
1973
1974         if (!silc_idcache_list_next(list, &id_cache))
1975           break;
1976       }
1977     }
1978     silc_idcache_list_free(list);
1979   }
1980   
1981   return TRUE;
1982 }
1983
1984 /* Checks whether given channel has global users.  If it does this returns
1985    TRUE and FALSE if there is only locally connected clients on the channel. */
1986
1987 int silc_server_channel_has_global(SilcChannelEntry channel)
1988 {
1989   SilcChannelClientEntry chl;
1990
1991   silc_list_start(channel->user_list);
1992   while ((chl = silc_list_get(channel->user_list)) != SILC_LIST_END) {
1993     if (chl->client->router)
1994       return TRUE;
1995   }
1996
1997   return FALSE;
1998 }
1999
2000 /* Checks whether given channel has locally connected users.  If it does this
2001    returns TRUE and FALSE if there is not one locally connected client. */
2002
2003 int silc_server_channel_has_local(SilcChannelEntry channel)
2004 {
2005   SilcChannelClientEntry chl;
2006
2007   silc_list_start(channel->user_list);
2008   while ((chl = silc_list_get(channel->user_list)) != SILC_LIST_END) {
2009     if (!chl->client->router)
2010       return TRUE;
2011   }
2012
2013   return FALSE;
2014 }
2015
2016 /* Removes client from all channels it has joined. This is used when client
2017    connection is disconnected. If the client on a channel is last, the
2018    channel is removed as well. This sends the SIGNOFF notify types. */
2019
2020 void silc_server_remove_from_channels(SilcServer server, 
2021                                       SilcSocketConnection sock,
2022                                       SilcClientEntry client)
2023 {
2024   SilcChannelEntry channel;
2025   SilcChannelClientEntry chl;
2026   SilcBuffer clidp;
2027
2028   SILC_LOG_DEBUG(("Start"));
2029
2030   if (!client || !client->id)
2031     return;
2032
2033   clidp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
2034
2035   /* Remove the client from all channels. The client is removed from
2036      the channels' user list. */
2037   silc_list_start(client->channels);
2038   while ((chl = silc_list_get(client->channels)) != SILC_LIST_END) {
2039     channel = chl->channel;
2040
2041     /* Remove channel from client's channel list */
2042     silc_list_del(client->channels, chl);
2043
2044     /* Remove channel if there is no users anymore */
2045     if (server->server_type == SILC_ROUTER &&
2046         silc_list_count(channel->user_list) < 2) {
2047       if (!silc_idlist_del_channel(server->local_list, channel))
2048         silc_idlist_del_channel(server->global_list, channel);
2049       server->stat.my_channels--;
2050       continue;
2051     }
2052
2053     /* Remove client from channel's client list */
2054     silc_list_del(channel->user_list, chl);
2055     silc_free(chl);
2056     server->stat.my_chanclients--;
2057
2058     /* If there is not at least one local user on the channel then we don't
2059        need the channel entry anymore, we can remove it safely. */
2060     if (server->server_type == SILC_SERVER &&
2061         !silc_server_channel_has_local(channel)) {
2062       /* Notify about leaving client if this channel has global users. */
2063       if (channel->global_users)
2064         silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2065                                            SILC_NOTIFY_TYPE_SIGNOFF, 1,
2066                                            clidp->data, clidp->len);
2067
2068       if (!silc_idlist_del_channel(server->local_list, channel))
2069         silc_idlist_del_channel(server->global_list, channel);
2070       server->stat.my_channels--;
2071       continue;
2072     }
2073
2074     /* Send notify to channel about client leaving SILC and thus
2075        the entire channel. */
2076     silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2077                                        SILC_NOTIFY_TYPE_SIGNOFF, 1,
2078                                        clidp->data, clidp->len);
2079   }
2080
2081   silc_buffer_free(clidp);
2082 }
2083
2084 /* Removes client from one channel. This is used for example when client
2085    calls LEAVE command to remove itself from the channel. Returns TRUE
2086    if channel still exists and FALSE if the channel is removed when
2087    last client leaves the channel. If `notify' is FALSE notify messages
2088    are not sent. */
2089
2090 int silc_server_remove_from_one_channel(SilcServer server, 
2091                                         SilcSocketConnection sock,
2092                                         SilcChannelEntry channel,
2093                                         SilcClientEntry client,
2094                                         int notify)
2095 {
2096   SilcChannelEntry ch;
2097   SilcChannelClientEntry chl;
2098   SilcBuffer clidp;
2099
2100   SILC_LOG_DEBUG(("Start"));
2101
2102   clidp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
2103
2104   /* Remove the client from the channel. The client is removed from
2105      the channel's user list. */
2106   silc_list_start(client->channels);
2107   while ((chl = silc_list_get(client->channels)) != SILC_LIST_END) {
2108     if (chl->channel != channel)
2109       continue;
2110
2111     ch = chl->channel;
2112
2113     /* Remove channel from client's channel list */
2114     silc_list_del(client->channels, chl);
2115
2116     /* Remove channel if there is no users anymore */
2117     if (server->server_type == SILC_ROUTER &&
2118         silc_list_count(channel->user_list) < 2) {
2119       if (!silc_idlist_del_channel(server->local_list, channel))
2120         silc_idlist_del_channel(server->global_list, channel);
2121       silc_buffer_free(clidp);
2122       server->stat.my_channels--;
2123       return FALSE;
2124     }
2125
2126     /* Remove client from channel's client list */
2127     silc_list_del(channel->user_list, chl);
2128     silc_free(chl);
2129     server->stat.my_chanclients--;
2130
2131     /* If there is no global users on the channel anymore mark the channel
2132        as local channel. */
2133     if (server->server_type == SILC_SERVER &&
2134         !silc_server_channel_has_global(channel))
2135       channel->global_users = FALSE;
2136
2137     /* If there is not at least one local user on the channel then we don't
2138        need the channel entry anymore, we can remove it safely. */
2139     if (server->server_type == SILC_SERVER &&
2140         !silc_server_channel_has_local(channel)) {
2141       /* Notify about leaving client if this channel has global users. */
2142       if (notify && channel->global_users)
2143         silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2144                                            SILC_NOTIFY_TYPE_LEAVE, 1,
2145                                            clidp->data, clidp->len);
2146
2147       if (!silc_idlist_del_channel(server->local_list, channel))
2148         silc_idlist_del_channel(server->global_list, channel);
2149       silc_buffer_free(clidp);
2150       server->stat.my_channels--;
2151       return FALSE;
2152     }
2153
2154     /* Send notify to channel about client leaving the channel */
2155     if (notify)
2156       silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2157                                          SILC_NOTIFY_TYPE_LEAVE, 1,
2158                                          clidp->data, clidp->len);
2159     break;
2160   }
2161
2162   silc_buffer_free(clidp);
2163   return TRUE;
2164 }
2165
2166 /* Returns TRUE if the given client is on the channel.  FALSE if not. 
2167    This works because we assure that the user list on the channel is
2168    always in up to date thus we can only check the channel list from 
2169    `client' which is faster than checking the user list from `channel'. */
2170
2171 int silc_server_client_on_channel(SilcClientEntry client,
2172                                   SilcChannelEntry channel)
2173 {
2174   SilcChannelClientEntry chl;
2175
2176   if (!client || !channel)
2177     return FALSE;
2178
2179   silc_list_start(client->channels);
2180   while ((chl = silc_list_get(client->channels)) != SILC_LIST_END)
2181     if (chl->channel == channel)
2182       return TRUE;
2183
2184   return FALSE;
2185 }
2186
2187 /* Timeout callback. This is called if connection is idle or for some
2188    other reason is not responding within some period of time. This 
2189    disconnects the remote end. */
2190
2191 SILC_TASK_CALLBACK(silc_server_timeout_remote)
2192 {
2193   SilcServer server = (SilcServer)context;
2194   SilcSocketConnection sock = server->sockets[fd];
2195
2196   if (!sock)
2197     return;
2198
2199   if (sock->user_data)
2200     silc_server_free_sock_user_data(server, sock);
2201
2202   silc_server_disconnect_remote(server, sock, 
2203                                 "Server closed connection: "
2204                                 "Connection timeout");
2205 }
2206
2207 /* Creates new channel. Sends NEW_CHANNEL packet to primary route. This
2208    function may be used only by router. In real SILC network all channels
2209    are created by routers thus this function is never used by normal
2210    server. */
2211
2212 SilcChannelEntry silc_server_create_new_channel(SilcServer server, 
2213                                                 SilcServerID *router_id,
2214                                                 char *cipher, 
2215                                                 char *channel_name,
2216                                                 int broadcast)
2217 {
2218   SilcChannelID *channel_id;
2219   SilcChannelEntry entry;
2220   SilcCipher key;
2221
2222   SILC_LOG_DEBUG(("Creating new channel"));
2223
2224   if (!cipher)
2225     cipher = "twofish";
2226
2227   /* Allocate cipher */
2228   silc_cipher_alloc(cipher, &key);
2229
2230   channel_name = strdup(channel_name);
2231
2232   /* Create the channel */
2233   silc_id_create_channel_id(router_id, server->rng, &channel_id);
2234   entry = silc_idlist_add_channel(server->local_list, channel_name, 
2235                                   SILC_CHANNEL_MODE_NONE, channel_id, 
2236                                   NULL, key);
2237   if (!entry) {
2238     silc_free(channel_name);
2239     return NULL;
2240   }
2241
2242   /* Now create the actual key material */
2243   silc_server_create_channel_key(server, entry, 16);
2244
2245   /* Notify other routers about the new channel. We send the packet
2246      to our primary route. */
2247   if (broadcast && server->standalone == FALSE) {
2248     silc_server_send_new_channel(server, server->router->connection, TRUE, 
2249                                  channel_name, entry->id, SILC_ID_CHANNEL_LEN);
2250   }
2251
2252   server->stat.my_channels++;
2253
2254   return entry;
2255 }
2256
2257 /* Same as above but creates the channel with Channel ID `channel_id. */
2258
2259 SilcChannelEntry 
2260 silc_server_create_new_channel_with_id(SilcServer server, 
2261                                        char *cipher, 
2262                                        char *channel_name,
2263                                        SilcChannelID *channel_id,
2264                                        int broadcast)
2265 {
2266   SilcChannelEntry entry;
2267   SilcCipher key;
2268
2269   SILC_LOG_DEBUG(("Creating new channel"));
2270
2271   if (!cipher)
2272     cipher = "twofish";
2273
2274   /* Allocate cipher */
2275   silc_cipher_alloc(cipher, &key);
2276
2277   channel_name = strdup(channel_name);
2278
2279   /* Create the channel */
2280   entry = silc_idlist_add_channel(server->local_list, channel_name, 
2281                                   SILC_CHANNEL_MODE_NONE, channel_id, 
2282                                   NULL, key);
2283   if (!entry) {
2284     silc_free(channel_name);
2285     return NULL;
2286   }
2287
2288   /* Now create the actual key material */
2289   silc_server_create_channel_key(server, entry, 16);
2290
2291   /* Notify other routers about the new channel. We send the packet
2292      to our primary route. */
2293   if (broadcast && server->standalone == FALSE) {
2294     silc_server_send_new_channel(server, server->router->connection, TRUE, 
2295                                  channel_name, entry->id, SILC_ID_CHANNEL_LEN);
2296   }
2297
2298   server->stat.my_channels++;
2299
2300   return entry;
2301 }
2302
2303 /* Generates new channel key. This is used to create the initial channel key
2304    but also to re-generate new key for channel. If `key_len' is provided
2305    it is the bytes of the key length. */
2306
2307 void silc_server_create_channel_key(SilcServer server, 
2308                                     SilcChannelEntry channel,
2309                                     unsigned int key_len)
2310 {
2311   int i;
2312   unsigned char channel_key[32];
2313   unsigned int len;
2314
2315   if (!channel->channel_key)
2316     silc_cipher_alloc("twofish", &channel->channel_key);
2317
2318   if (key_len)
2319     len = key_len;
2320   else if (channel->key_len)
2321     len = channel->key_len / 8;
2322   else
2323     len = sizeof(channel_key);
2324
2325   /* Create channel key */
2326   for (i = 0; i < len; i++) channel_key[i] = silc_rng_get_byte(server->rng);
2327   
2328   /* Set the key */
2329   channel->channel_key->cipher->set_key(channel->channel_key->context, 
2330                                         channel_key, len);
2331
2332   /* Remove old key if exists */
2333   if (channel->key) {
2334     memset(channel->key, 0, channel->key_len / 8);
2335     silc_free(channel->key);
2336   }
2337
2338   /* Save the key */
2339   channel->key_len = len * 8;
2340   channel->key = silc_calloc(len, sizeof(*channel->key));
2341   memcpy(channel->key, channel_key, len);
2342   memset(channel_key, 0, sizeof(channel_key));
2343 }
2344
2345 /* Saves the channel key found in the encoded `key_payload' buffer. This 
2346    function is used when we receive Channel Key Payload and also when we're
2347    processing JOIN command reply. Returns entry to the channel. */
2348
2349 SilcChannelEntry silc_server_save_channel_key(SilcServer server,
2350                                               SilcBuffer key_payload,
2351                                               SilcChannelEntry channel)
2352 {
2353   SilcChannelKeyPayload payload = NULL;
2354   SilcChannelID *id = NULL;
2355   unsigned char *tmp;
2356   unsigned int tmp_len;
2357   char *cipher;
2358
2359   /* Decode channel key payload */
2360   payload = silc_channel_key_payload_parse(key_payload);
2361   if (!payload) {
2362     SILC_LOG_ERROR(("Bad channel key payload, dropped"));
2363     channel = NULL;
2364     goto out;
2365   }
2366
2367   /* Get the channel entry */
2368   if (!channel) {
2369
2370     /* Get channel ID */
2371     tmp = silc_channel_key_get_id(payload, &tmp_len);
2372     id = silc_id_str2id(tmp, tmp_len, SILC_ID_CHANNEL);
2373     if (!id) {
2374       channel = NULL;
2375       goto out;
2376     }
2377
2378     channel = silc_idlist_find_channel_by_id(server->local_list, id, NULL);
2379     if (!channel) {
2380       channel = silc_idlist_find_channel_by_id(server->global_list, id, NULL);
2381       if (!channel) {
2382         SILC_LOG_ERROR(("Received key for non-existent channel"));
2383         goto out;
2384       }
2385     }
2386   }
2387
2388   tmp = silc_channel_key_get_key(payload, &tmp_len);
2389   if (!tmp) {
2390     channel = NULL;
2391     goto out;
2392   }
2393
2394   cipher = silc_channel_key_get_cipher(payload, NULL);;
2395   if (!cipher) {
2396     channel = NULL;
2397     goto out;
2398   }
2399
2400   /* Remove old key if exists */
2401   if (channel->key) {
2402     memset(channel->key, 0, channel->key_len / 8);
2403     silc_free(channel->key);
2404     silc_cipher_free(channel->channel_key);
2405   }
2406
2407   /* Create new cipher */
2408   if (!silc_cipher_alloc(cipher, &channel->channel_key)) {
2409     channel = NULL;
2410     goto out;
2411   }
2412
2413   /* Save the key */
2414   channel->key_len = tmp_len * 8;
2415   channel->key = silc_calloc(tmp_len, sizeof(unsigned char));
2416   memcpy(channel->key, tmp, tmp_len);
2417   channel->channel_key->cipher->set_key(channel->channel_key->context, 
2418                                         tmp, tmp_len);
2419
2420  out:
2421   if (id)
2422     silc_free(id);
2423   if (payload)
2424     silc_channel_key_payload_free(payload);
2425
2426   return channel;
2427 }
2428
2429 /* Heartbeat callback. This function is set as argument for the
2430    silc_socket_set_heartbeat function. The library will call this function
2431    at the set time interval. */
2432
2433 void silc_server_perform_heartbeat(SilcSocketConnection sock,
2434                                    void *hb_context)
2435 {
2436   SilcServerHBContext hb = (SilcServerHBContext)hb_context;
2437
2438   SILC_LOG_DEBUG(("Sending heartbeat to %s (%s)", sock->hostname,
2439                   sock->ip));
2440
2441   /* Send the heartbeat */
2442   silc_server_send_heartbeat(hb->server, sock);
2443 }
2444
2445 /* Returns assembled of all servers in the given ID list. The packet's
2446    form is dictated by the New ID payload. */
2447
2448 static void silc_server_announce_get_servers(SilcServer server,
2449                                              SilcIDList id_list,
2450                                              SilcBuffer *servers)
2451 {
2452   SilcIDCacheList list;
2453   SilcIDCacheEntry id_cache;
2454   SilcServerEntry entry;
2455   SilcBuffer idp;
2456
2457   /* Go through all clients in the list */
2458   if (silc_idcache_find_by_id(id_list->clients, SILC_ID_CACHE_ANY, 
2459                               SILC_ID_SERVER, &list)) {
2460     if (silc_idcache_list_first(list, &id_cache)) {
2461       while (id_cache) {
2462         entry = (SilcServerEntry)id_cache->context;
2463
2464         idp = silc_id_payload_encode(entry->id, SILC_ID_SERVER);
2465
2466         *servers = silc_buffer_realloc(*servers, 
2467                                        (*servers ? 
2468                                         (*servers)->truelen + idp->len : 
2469                                         idp->len));
2470         silc_buffer_pull_tail(*servers, ((*servers)->end - (*servers)->data));
2471         silc_buffer_put(*servers, idp->data, idp->len);
2472         silc_buffer_pull(*servers, idp->len);
2473         silc_buffer_free(idp);
2474
2475         if (!silc_idcache_list_next(list, &id_cache))
2476           break;
2477       }
2478     }
2479
2480     silc_idcache_list_free(list);
2481   }
2482 }
2483
2484 /* This function is used by router to announce existing servers to our
2485    primary router when we've connected to it. */
2486
2487 void silc_server_announce_servers(SilcServer server)
2488 {
2489   SilcBuffer servers = NULL;
2490
2491   SILC_LOG_DEBUG(("Announcing servers"));
2492
2493   /* Get servers in local list */
2494   silc_server_announce_get_servers(server, server->local_list, &servers);
2495
2496   /* Get servers in global list */
2497   silc_server_announce_get_servers(server, server->global_list, &servers);
2498
2499   if (servers) {
2500     silc_buffer_push(servers, servers->data - servers->head);
2501     SILC_LOG_HEXDUMP(("servers"), servers->data, servers->len);
2502
2503     /* Send the packet */
2504     silc_server_packet_send(server, server->router->connection,
2505                             SILC_PACKET_NEW_ID_LIST, 0,
2506                             servers->data, servers->len, TRUE);
2507
2508     silc_buffer_free(servers);
2509   }
2510 }
2511
2512 /* Returns assembled packet of all clients in the given ID list. The
2513    packet's form is dictated by the New ID Payload. */
2514
2515 static void silc_server_announce_get_clients(SilcServer server,
2516                                              SilcIDList id_list,
2517                                              SilcBuffer *clients)
2518 {
2519   SilcIDCacheList list;
2520   SilcIDCacheEntry id_cache;
2521   SilcClientEntry client;
2522   SilcBuffer idp;
2523
2524   /* Go through all clients in the list */
2525   if (silc_idcache_find_by_id(id_list->clients, SILC_ID_CACHE_ANY, 
2526                               SILC_ID_CLIENT, &list)) {
2527     if (silc_idcache_list_first(list, &id_cache)) {
2528       while (id_cache) {
2529         client = (SilcClientEntry)id_cache->context;
2530
2531         idp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
2532
2533         *clients = silc_buffer_realloc(*clients, 
2534                                        (*clients ? 
2535                                         (*clients)->truelen + idp->len : 
2536                                         idp->len));
2537         silc_buffer_pull_tail(*clients, ((*clients)->end - (*clients)->data));
2538         silc_buffer_put(*clients, idp->data, idp->len);
2539         silc_buffer_pull(*clients, idp->len);
2540         silc_buffer_free(idp);
2541
2542         if (!silc_idcache_list_next(list, &id_cache))
2543           break;
2544       }
2545     }
2546
2547     silc_idcache_list_free(list);
2548   }
2549 }
2550
2551 /* This function is used to announce our existing clients to our router
2552    when we've connected to it. */
2553
2554 void silc_server_announce_clients(SilcServer server)
2555 {
2556   SilcBuffer clients = NULL;
2557
2558   SILC_LOG_DEBUG(("Announcing clients"));
2559
2560   /* Get clients in local list */
2561   silc_server_announce_get_clients(server, server->local_list,
2562                                    &clients);
2563
2564   /* As router we announce our global list as well */
2565   if (server->server_type == SILC_ROUTER)
2566     silc_server_announce_get_clients(server, server->global_list,
2567                                      &clients);
2568
2569   if (clients) {
2570     silc_buffer_push(clients, clients->data - clients->head);
2571     SILC_LOG_HEXDUMP(("clients"), clients->data, clients->len);
2572
2573     /* Send the packet */
2574     silc_server_packet_send(server, server->router->connection,
2575                             SILC_PACKET_NEW_ID_LIST, 0,
2576                             clients->data, clients->len, TRUE);
2577
2578     silc_buffer_free(clients);
2579   }
2580 }
2581
2582 /* Returns assembled packets for all channels and users on those channels
2583    from the given ID List. The packets are in the form dictated by the
2584    New Channel and New Channel User payloads. */
2585
2586 static void silc_server_announce_get_channels(SilcServer server,
2587                                               SilcIDList id_list,
2588                                               SilcBuffer *channels,
2589                                               SilcBuffer *channel_users)
2590 {
2591   SilcIDCacheList list;
2592   SilcIDCacheEntry id_cache;
2593   SilcChannelEntry channel;
2594   SilcChannelClientEntry chl;
2595   unsigned char *cid;
2596   unsigned short name_len;
2597   int len;
2598
2599   /* Go through all channels in the list */
2600   if (silc_idcache_find_by_id(id_list->channels, SILC_ID_CACHE_ANY, 
2601                               SILC_ID_CHANNEL, &list)) {
2602     if (silc_idcache_list_first(list, &id_cache)) {
2603       while (id_cache) {
2604         channel = (SilcChannelEntry)id_cache->context;
2605         
2606         cid = silc_id_id2str(channel->id, SILC_ID_CHANNEL);
2607         name_len = strlen(channel->channel_name);
2608
2609         len = 4 + name_len + SILC_ID_CHANNEL_LEN;
2610         *channels = 
2611           silc_buffer_realloc(*channels, 
2612                               (*channels ? (*channels)->truelen + len : len));
2613         silc_buffer_pull_tail(*channels, 
2614                               ((*channels)->end - (*channels)->data));
2615         silc_buffer_format(*channels,
2616                            SILC_STR_UI_SHORT(name_len),
2617                            SILC_STR_UI_XNSTRING(channel->channel_name, 
2618                                                 name_len),
2619                            SILC_STR_UI_SHORT(SILC_ID_CHANNEL_LEN),
2620                            SILC_STR_UI_XNSTRING(cid, SILC_ID_CHANNEL_LEN),
2621                            SILC_STR_END);
2622         silc_buffer_pull(*channels, len);
2623
2624         /* Now find all users on the channel */
2625         silc_list_start(channel->user_list);
2626         while ((chl = silc_list_get(channel->user_list)) != SILC_LIST_END) {
2627           unsigned char *clid;
2628
2629           clid = silc_id_id2str(chl->client->id, SILC_ID_CLIENT);
2630           
2631           len = 4 + SILC_ID_CHANNEL_LEN + SILC_ID_CLIENT_LEN;
2632           *channel_users = 
2633             silc_buffer_realloc(*channel_users, 
2634                                 (*channel_users ? 
2635                                  (*channel_users)->truelen + len : len));
2636           silc_buffer_pull_tail(*channel_users, 
2637                                 ((*channel_users)->end - 
2638                                  (*channel_users)->data));
2639           silc_buffer_format(*channel_users,
2640                              SILC_STR_UI_SHORT(SILC_ID_CHANNEL_LEN),
2641                              SILC_STR_UI_XNSTRING(cid, SILC_ID_CHANNEL_LEN),
2642                              SILC_STR_UI_SHORT(SILC_ID_CLIENT_LEN),
2643                              SILC_STR_UI_XNSTRING(clid, SILC_ID_CLIENT_LEN),
2644                              SILC_STR_END);
2645           silc_buffer_pull(*channel_users, len);
2646           silc_free(clid);
2647         }
2648
2649         silc_free(cid);
2650
2651         if (!silc_idcache_list_next(list, &id_cache))
2652           break;
2653       }
2654     }
2655
2656     silc_idcache_list_free(list);
2657   }
2658 }
2659
2660 /* This function is used to announce our existing channels to our router
2661    when we've connected to it. This also announces the users on the
2662    channels to the router. */
2663
2664 void silc_server_announce_channels(SilcServer server)
2665 {
2666   SilcBuffer channels = NULL, channel_users = NULL;
2667
2668   SILC_LOG_DEBUG(("Announcing channels and channel users"));
2669
2670   /* Get channels and channel users in local list */
2671   silc_server_announce_get_channels(server, server->local_list,
2672                                     &channels, &channel_users);
2673
2674   /* Get channels and channel users in global list */
2675   silc_server_announce_get_channels(server, server->global_list,
2676                                     &channels, &channel_users);
2677
2678   if (channels) {
2679     silc_buffer_push(channels, channels->data - channels->head);
2680     SILC_LOG_HEXDUMP(("channels"), channels->data, channels->len);
2681
2682     /* Send the packet */
2683     silc_server_packet_send(server, server->router->connection,
2684                             SILC_PACKET_NEW_CHANNEL_LIST, 0,
2685                             channels->data, channels->len,
2686                             FALSE);
2687
2688     silc_buffer_free(channels);
2689   }
2690
2691   if (channel_users) {
2692     silc_buffer_push(channel_users, channel_users->data - channel_users->head);
2693     SILC_LOG_HEXDUMP(("channel users"), channel_users->data, 
2694                      channel_users->len);
2695
2696     /* Send the packet */
2697     silc_server_packet_send(server, server->router->connection,
2698                             SILC_PACKET_NEW_CHANNEL_USER_LIST, 0,
2699                             channel_users->data, channel_users->len,
2700                             FALSE);
2701
2702     silc_buffer_free(channel_users);
2703   }
2704 }