215657586fdf863b0a5f911f5ccda05e9a031635
[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_free(server);
100   }
101 }
102
103 /* Initializes the entire SILC server. This is called always before running
104    the server. This is called only once at the initialization of the program.
105    This binds the server to its listenning port. After this function returns 
106    one should call silc_server_run to start the server. This returns TRUE 
107    when everything is ok to run the server. Configuration file must be
108    read and parsed before calling this. */
109
110 int silc_server_init(SilcServer server)
111 {
112   int *sock = NULL, sock_count = 0, i;
113   SilcServerID *id;
114   SilcServerEntry id_entry;
115
116   SILC_LOG_DEBUG(("Initializing server"));
117   assert(server);
118   assert(server->config);
119
120   /* XXX After server is made as Silc Server Library this can be given
121      as argument, for now this is hard coded */
122   server->params = silc_calloc(1, sizeof(*server->params));
123   server->params->retry_count = SILC_SERVER_RETRY_COUNT;
124   server->params->retry_interval_min = SILC_SERVER_RETRY_INTERVAL_MIN;
125   server->params->retry_interval_max = SILC_SERVER_RETRY_INTERVAL_MAX;
126   server->params->retry_keep_trying = FALSE;
127   server->params->protocol_timeout = 60;
128   server->params->require_reverse_mapping = FALSE;
129
130   /* Set log files where log message should be saved. */
131   server->config->server = server;
132   silc_server_config_setlogfiles(server->config);
133  
134   /* Register all configured ciphers, PKCS and hash functions. */
135   silc_server_config_register_ciphers(server->config);
136   silc_server_config_register_pkcs(server->config);
137   silc_server_config_register_hashfuncs(server->config);
138
139   /* Initialize random number generator for the server. */
140   server->rng = silc_rng_alloc();
141   silc_rng_init(server->rng);
142   silc_rng_global_init(server->rng);
143
144   /* Initialize hash functions for server to use */
145   silc_hash_alloc("md5", &server->md5hash);
146   silc_hash_alloc("sha1", &server->sha1hash);
147
148   /* Initialize none cipher */
149   silc_cipher_alloc("none", &server->none_cipher);
150
151   /* XXXXX Generate RSA key pair */
152   {
153     unsigned char *public_key;
154     unsigned char *private_key;
155     unsigned int pk_len, prv_len;
156     struct stat st;
157
158     if (stat("pubkey.pub", &st) < 0 && stat("privkey.prv", &st) < 0) {
159
160       if (silc_pkcs_alloc("rsa", &server->pkcs) == FALSE) {
161         SILC_LOG_ERROR(("Could not create RSA key pair"));
162         goto err0;
163       }
164       
165       if (server->pkcs->pkcs->init(server->pkcs->context, 
166                                    1024, server->rng) == FALSE) {
167         SILC_LOG_ERROR(("Could not generate RSA key pair"));
168         goto err0;
169       }
170       
171       public_key = server->pkcs->pkcs->get_public_key(server->pkcs->context,
172                                                       &pk_len);
173       private_key = server->pkcs->pkcs->get_private_key(server->pkcs->context,
174                                                         &prv_len);
175       
176       SILC_LOG_HEXDUMP(("public key"), public_key, pk_len);
177       SILC_LOG_HEXDUMP(("private key"), private_key, prv_len);
178       
179       server->public_key = 
180         silc_pkcs_public_key_alloc("rsa", "UN=root, HN=dummy",
181                                    public_key, pk_len);
182       server->private_key = 
183         silc_pkcs_private_key_alloc("rsa", private_key, prv_len);
184       
185       /* XXX Save keys */
186       silc_pkcs_save_public_key("pubkey.pub", server->public_key,
187                                 SILC_PKCS_FILE_PEM);
188       silc_pkcs_save_private_key("privkey.prv", server->private_key, NULL,
189                                  SILC_PKCS_FILE_BIN);
190
191       memset(public_key, 0, pk_len);
192       memset(private_key, 0, prv_len);
193       silc_free(public_key);
194       silc_free(private_key);
195     } else {
196       silc_pkcs_load_public_key("pubkey.pub", &server->public_key,
197                                 SILC_PKCS_FILE_PEM);
198       silc_pkcs_load_private_key("privkey.prv", &server->private_key,
199                                  SILC_PKCS_FILE_BIN);
200     }
201   }
202
203   /* Create a listening server. Note that our server can listen on
204      multiple ports. All listeners are created here and now. */
205   /* XXX Still check this whether to use server_info or listen_port. */
206   sock_count = 0;
207   while(server->config->listen_port) {
208     int tmp;
209
210     tmp = silc_net_create_server(server->config->listen_port->port,
211                                  server->config->listen_port->host);
212     if (tmp < 0)
213       goto err0;
214
215     sock = silc_realloc(sock, (sizeof(int *) * (sock_count + 1)));
216     sock[sock_count] = tmp;
217     server->config->listen_port = server->config->listen_port->next;
218     sock_count++;
219   }
220
221   /* Initialize ID caches */
222   server->local_list->clients = silc_idcache_alloc(0);
223   server->local_list->servers = silc_idcache_alloc(0);
224   server->local_list->channels = silc_idcache_alloc(0);
225
226   /* These are allocated for normal server as well as these hold some 
227      global information that the server has fetched from its router. For 
228      router these are used as they are supposed to be used on router. */
229   server->global_list->clients = silc_idcache_alloc(0);
230   server->global_list->servers = silc_idcache_alloc(0);
231   server->global_list->channels = silc_idcache_alloc(0);
232
233   /* Allocate the entire socket list that is used in server. Eventually 
234      all connections will have entry in this table (it is a table of 
235      pointers to the actual object that is allocated individually 
236      later). */
237   server->sockets = silc_calloc(SILC_SERVER_MAX_CONNECTIONS,
238                                 sizeof(*server->sockets));
239
240   for (i = 0; i < sock_count; i++) {
241     SilcSocketConnection newsocket = NULL;
242
243     /* Set socket to non-blocking mode */
244     silc_net_set_socket_nonblock(sock[i]);
245     server->sock = sock[i];
246     
247     /* Create a Server ID for the server. */
248     silc_id_create_server_id(sock[i], server->rng, &id);
249     if (!id) {
250       goto err0;
251     }
252     
253     server->id = id;
254     server->id_string = silc_id_id2str(id, SILC_ID_SERVER);
255     server->id_string_len = silc_id_get_len(SILC_ID_SERVER);
256     server->id_type = SILC_ID_SERVER;
257     server->server_name = server->config->server_info->server_name;
258
259     /* Add ourselves to the server list. We don't have a router yet 
260        beacuse we haven't established a route yet. It will be done later. 
261        For now, NULL is sent as router. This allocates new entry to
262        the ID list. */
263     id_entry = 
264       silc_idlist_add_server(server->local_list,
265                              server->config->server_info->server_name,
266                              server->server_type, server->id, NULL, NULL);
267     if (!id_entry) {
268       SILC_LOG_ERROR(("Could not add ourselves to cache"));
269       goto err0;
270     }
271     
272     /* Add ourselves also to the socket table. The entry allocated above
273        is sent as argument for fast referencing in the future. */
274     silc_socket_alloc(sock[i], SILC_SOCKET_TYPE_SERVER, id_entry, 
275                       &newsocket);
276     if (!newsocket)
277       goto err0;
278
279     server->sockets[sock[i]] = newsocket;
280
281     /* Put the allocated socket pointer also to the entry allocated above 
282        for fast back-referencing to the socket list. */
283     id_entry->connection = (void *)server->sockets[sock[i]];
284     server->id_entry = id_entry;
285   }
286
287   /* Register the task queues. In SILC we have by default three task queues. 
288      One task queue for non-timeout tasks which perform different kind of 
289      I/O on file descriptors, timeout task queue for timeout tasks, and,
290      generic non-timeout task queue whose tasks apply to all connections. */
291   silc_task_queue_alloc(&server->io_queue, TRUE);
292   if (!server->io_queue) {
293     goto err0;
294   }
295   silc_task_queue_alloc(&server->timeout_queue, TRUE);
296   if (!server->timeout_queue) {
297     goto err1;
298   }
299   silc_task_queue_alloc(&server->generic_queue, TRUE);
300   if (!server->generic_queue) {
301     goto err1;
302   }
303
304   /* Register protocols */
305   silc_server_protocols_register();
306
307   /* Initialize the scheduler */
308   silc_schedule_init(&server->io_queue, &server->timeout_queue, 
309                      &server->generic_queue, 
310                      SILC_SERVER_MAX_CONNECTIONS);
311   
312   /* Add the first task to the queue. This is task that is executed by
313      timeout. It expires as soon as the caller calls silc_server_run. This
314      task performs authentication protocol and key exchange with our
315      primary router. */
316   silc_task_register(server->timeout_queue, sock[0], 
317                      silc_server_connect_to_router,
318                      (void *)server, 0, 1,
319                      SILC_TASK_TIMEOUT,
320                      SILC_TASK_PRI_NORMAL);
321
322   /* Add listener task to the queue. This task receives new connections to the 
323      server. This task remains on the queue until the end of the program. */
324   silc_task_register(server->io_queue, sock[0],
325                      silc_server_accept_new_connection,
326                      (void *)server, 0, 0, 
327                      SILC_TASK_FD,
328                      SILC_TASK_PRI_NORMAL);
329   server->listenning = TRUE;
330
331   /* If server connections has been configured then we must be router as
332      normal server cannot have server connections, only router connections. */
333   if (server->config->servers)
334     server->server_type = SILC_ROUTER;
335
336   SILC_LOG_DEBUG(("Server initialized"));
337
338   /* We are done here, return succesfully */
339   return TRUE;
340
341   silc_task_queue_free(server->timeout_queue);
342  err1:
343   silc_task_queue_free(server->io_queue);
344  err0:
345   for (i = 0; i < sock_count; i++)
346     silc_net_close_server(sock[i]);
347
348   return FALSE;
349 }
350
351 /* Fork server to background and set gid+uid to non-root.
352    Silcd will not run as root, so trying to set either user or group to
353    root will cause silcd to exit. */
354
355 void silc_server_daemonise(SilcServer server)
356 {
357   /* Are we executing silcd as root or a regular user? */
358   if (geteuid()==0) {
359     
360     struct passwd *pw;
361     struct group *gr;
362     char *user, *group;
363     
364     if (!server->config->identity || !server->config->identity->user || 
365         !server->config->identity->group) {
366       fprintf(stderr, "Error:"
367        "\tSILC server must not be run as root.  For the security of your\n"
368        "\tsystem it is strongly suggested that you run SILC under dedicated\n"
369        "\tuser account.  Modify the [Identity] configuration section to run\n"
370        "\tthe server as non-root user.\n");
371       exit(1);
372     }
373     
374     /* Get the values given for user and group in configuration file */
375     user=server->config->identity->user;
376     group=server->config->identity->group;
377     
378     /* Check whether the user/group information is text */ 
379     if (atoi(user)!=0 || atoi(group)!=0) {
380       SILC_LOG_DEBUG(("Invalid user and/or group information"));
381       SILC_LOG_DEBUG(("User and/or group given as number"));
382       fprintf(stderr, "Invalid user and/or group information\n");
383       fprintf(stderr, "Please assign them as names, not numbers\n");
384       exit(1);
385     }
386     
387     /* Catch the nasty incident of string "0" returning 0 from atoi */
388     if (strcmp("0", user)==0 || strcmp("0", group)==0) {
389       SILC_LOG_DEBUG(("User and/or group configured to 0. Unacceptable"));
390       fprintf(stderr, "User and/or group configured to 0. Exiting\n");
391       exit(1);
392     }
393     
394     pw=getpwnam(user);
395     gr=getgrnam(group);
396
397     if (!pw) {
398       fprintf(stderr, "No such user %s found\n", user);
399       exit(1);
400     }
401
402     if (!gr) {
403       fprintf(stderr, "No such group %s found\n", group);
404       exit(1);
405     }
406     
407     /* Check whether user and/or group is set to root. If yes, exit
408        immediately. Otherwise, setgid and setuid server to user.group */
409     if (gr->gr_gid==0 || pw->pw_uid==0) {
410       fprintf(stderr, "Error:"
411        "\tSILC server must not be run as root.  For the security of your\n"
412        "\tsystem it is strongly suggested that you run SILC under dedicated\n"
413        "\tuser account.  Modify the [Identity] configuration section to run\n"
414        "\tthe server as non-root user.\n");
415       exit(1);
416     } else {
417       /* Fork server to background, making it a daemon */
418       if (fork()) {
419         SILC_LOG_DEBUG(("Server started as root. Dropping privileges."));
420         SILC_LOG_DEBUG(("Forking SILC server to background"));
421         exit(0);
422       } 
423       setsid();
424       
425       SILC_LOG_DEBUG(("Changing to group %s", group));
426       if(setgid(gr->gr_gid)==0) {
427         SILC_LOG_DEBUG(("Setgid to %s", group));
428       } else {
429         SILC_LOG_DEBUG(("Setgid to %s failed", group));
430         fprintf(stderr, "Tried to setgid %s but no such group. Exiting\n",
431                 group);
432         exit(1);
433       }
434       SILC_LOG_DEBUG(("Changing to user nobody"));
435       if(setuid(pw->pw_uid)==0) {
436         SILC_LOG_DEBUG(("Setuid to %s", user));
437       } else {
438         SILC_LOG_DEBUG(("Setuid to %s failed", user));
439         fprintf(stderr, "Tried to setuid %s but no such user. Exiting\n",
440                 user);
441         exit(1);
442       }
443     }
444   } else {
445     /* Fork server to background, making it a daemon */
446     if (fork()) {
447       SILC_LOG_DEBUG(("Server started as user")); 
448       SILC_LOG_DEBUG(("Forking SILC server to background"));
449       exit(0);
450     }
451     setsid();
452   }
453 }
454
455 /* Stops the SILC server. This function is used to shutdown the server. 
456    This is usually called after the scheduler has returned. After stopping 
457    the server one should call silc_server_free. */
458
459 void silc_server_stop(SilcServer server)
460 {
461   SILC_LOG_DEBUG(("Stopping server"));
462
463   /* Stop the scheduler, although it might be already stopped. This
464      doesn't hurt anyone. This removes all the tasks and task queues,
465      as well. */
466   silc_schedule_stop();
467   silc_schedule_uninit();
468
469   silc_server_protocols_unregister();
470
471   SILC_LOG_DEBUG(("Server stopped"));
472 }
473
474 /* The heart of the server. This runs the scheduler thus runs the server. 
475    When this returns the server has been stopped and the program will
476    be terminated. */
477
478 void silc_server_run(SilcServer server)
479 {
480   SILC_LOG_DEBUG(("Running server"));
481
482   /* Start the scheduler, the heart of the SILC server. When this returns
483      the program will be terminated. */
484   silc_schedule();
485 }
486
487 /* Timeout callback that will be called to retry connecting to remote
488    router. This is used by both normal and router server. This will wait
489    before retrying the connecting. The timeout is generated by exponential
490    backoff algorithm. */
491
492 SILC_TASK_CALLBACK(silc_server_connect_to_router_retry)
493 {
494   SilcServerConnection sconn = (SilcServerConnection)context;
495   SilcServer server = sconn->server;
496
497   SILC_LOG_INFO(("Retrying connecting to a router"));
498
499   /* Calculate next timeout */
500   if (sconn->retry_count >= 1) {
501     sconn->retry_timeout = sconn->retry_timeout * SILC_SERVER_RETRY_MULTIPLIER;
502     if (sconn->retry_timeout > SILC_SERVER_RETRY_INTERVAL_MAX)
503       sconn->retry_timeout = SILC_SERVER_RETRY_INTERVAL_MAX;
504   } else {
505     sconn->retry_timeout = server->params->retry_interval_min;
506   }
507   sconn->retry_count++;
508   sconn->retry_timeout = sconn->retry_timeout +
509     silc_rng_get_rn32(server->rng) % SILC_SERVER_RETRY_RANDOMIZER;
510
511   /* If we've reached max retry count, give up. */
512   if (sconn->retry_count > server->params->retry_count && 
513       server->params->retry_keep_trying == FALSE) {
514     SILC_LOG_ERROR(("Could not connect to router, giving up"));
515     return;
516   }
517
518   /* Wait one before retrying */
519   silc_task_register(server->timeout_queue, fd, silc_server_connect_router,
520                      context, sconn->retry_timeout, 
521                      server->params->retry_interval_min_usec,
522                      SILC_TASK_TIMEOUT, SILC_TASK_PRI_NORMAL);
523 }
524
525 /* Generic routine to use connect to a router. */
526
527 SILC_TASK_CALLBACK(silc_server_connect_router)
528 {    
529   SilcServerConnection sconn = (SilcServerConnection)context;
530   SilcServer server = sconn->server;
531   SilcSocketConnection newsocket;
532   SilcProtocol protocol;
533   SilcServerKEInternalContext *proto_ctx;
534   int sock;
535
536   /* Connect to remote host */
537   sock = silc_net_create_connection(sconn->remote_port, 
538                                     sconn->remote_host);
539   if (sock < 0) {
540     SILC_LOG_ERROR(("Could not connect to router"));
541     silc_task_register(server->timeout_queue, fd, 
542                        silc_server_connect_to_router_retry,
543                        context, 0, 1, SILC_TASK_TIMEOUT, 
544                        SILC_TASK_PRI_NORMAL);
545     return;
546   }
547
548   /* Set socket options */
549   silc_net_set_socket_nonblock(sock);
550   silc_net_set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 1);
551
552   /* Create socket connection for the connection. Even though we
553      know that we are connecting to a router we will mark the socket
554      to be unknown connection until we have executed authentication
555      protocol. */
556   silc_socket_alloc(sock, SILC_SOCKET_TYPE_UNKNOWN, NULL, &newsocket);
557   server->sockets[sock] = newsocket;
558   newsocket->hostname = strdup(sconn->remote_host);
559   newsocket->ip = strdup(sconn->remote_host);
560   newsocket->port = sconn->remote_port;
561   sconn->sock = newsocket;
562
563   /* Allocate internal protocol context. This is sent as context
564      to the protocol. */
565   proto_ctx = silc_calloc(1, sizeof(*proto_ctx));
566   proto_ctx->server = (void *)server;
567   proto_ctx->context = (void *)sconn;
568   proto_ctx->sock = newsocket;
569   proto_ctx->rng = server->rng;
570   proto_ctx->responder = FALSE;
571       
572   /* Perform key exchange protocol. silc_server_connect_to_router_second
573      will be called after the protocol is finished. */
574   silc_protocol_alloc(SILC_PROTOCOL_SERVER_KEY_EXCHANGE, 
575                       &protocol, proto_ctx,
576                       silc_server_connect_to_router_second);
577   newsocket->protocol = protocol;
578       
579   /* Register a timeout task that will be executed if the protocol
580      is not executed within set limit. */
581   proto_ctx->timeout_task = 
582     silc_task_register(server->timeout_queue, sock, 
583                        silc_server_timeout_remote,
584                        server, server->params->protocol_timeout,
585                        server->params->protocol_timeout_usec,
586                        SILC_TASK_TIMEOUT,
587                        SILC_TASK_PRI_LOW);
588
589   /* Register the connection for network input and output. This sets
590      that scheduler will listen for incoming packets for this connection 
591      and sets that outgoing packets may be sent to this connection as 
592      well. However, this doesn't set the scheduler for outgoing traffic,
593      it will be set separately by calling SILC_SET_CONNECTION_FOR_OUTPUT,
594      later when outgoing data is available. */
595   context = (void *)server;
596   SILC_REGISTER_CONNECTION_FOR_IO(sock);
597   
598   /* Run the protocol */
599   protocol->execute(server->timeout_queue, 0, protocol, sock, 0, 0);
600 }
601   
602 /* This function connects to our primary router or if we are a router this
603    establishes all our primary routes. This is called at the start of the
604    server to do authentication and key exchange with our router - called
605    from schedule. */
606
607 SILC_TASK_CALLBACK(silc_server_connect_to_router)
608 {
609   SilcServer server = (SilcServer)context;
610   SilcServerConnection sconn;
611
612   SILC_LOG_DEBUG(("Connecting to router(s)"));
613
614   /* If we are normal SILC server we need to connect to our cell's
615      router. */
616   if (server->server_type == SILC_SERVER) {
617     SILC_LOG_DEBUG(("We are normal server"));
618
619     /* Create connection to the router, if configured. */
620     if (server->config->routers) {
621
622       /* Allocate connection object for hold connection specific stuff. */
623       sconn = silc_calloc(1, sizeof(*sconn));
624       sconn->server = server;
625       sconn->remote_host = server->config->routers->host;
626       sconn->remote_port = server->config->routers->port;
627
628       silc_task_register(server->timeout_queue, fd, 
629                          silc_server_connect_router,
630                          (void *)sconn, 0, 1, SILC_TASK_TIMEOUT, 
631                          SILC_TASK_PRI_NORMAL);
632       return;
633     }
634   }
635
636   /* If we are a SILC router we need to establish all of our primary
637      routes. */
638   if (server->server_type == SILC_ROUTER) {
639     SilcServerConfigSectionServerConnection *ptr;
640
641     SILC_LOG_DEBUG(("We are router"));
642
643     /* Create the connections to all our routes */
644     ptr = server->config->routers;
645     while (ptr) {
646
647       SILC_LOG_DEBUG(("Router connection [%s] %s:%d",
648                       ptr->initiator ? "Initiator" : "Responder",
649                       ptr->host, ptr->port));
650
651       if (ptr->initiator) {
652         /* Allocate connection object for hold connection specific stuff. */
653         sconn = silc_calloc(1, sizeof(*sconn));
654         sconn->server = server;
655         sconn->remote_host = ptr->host;
656         sconn->remote_port = ptr->port;
657
658         silc_task_register(server->timeout_queue, fd, 
659                            silc_server_connect_router,
660                            (void *)sconn, 0, 1, SILC_TASK_TIMEOUT, 
661                            SILC_TASK_PRI_NORMAL);
662       }
663
664       if (!ptr->next)
665         return;
666
667       ptr = ptr->next;
668     }
669   }
670
671   SILC_LOG_DEBUG(("No router(s), server will be standalone"));
672   
673   /* There wasn't a configured router, we will continue but we don't
674      have a connection to outside world.  We will be standalone server. */
675   server->standalone = TRUE;
676 }
677
678 /* Second part of connecting to router(s). Key exchange protocol has been
679    executed and now we will execute authentication protocol. */
680
681 SILC_TASK_CALLBACK(silc_server_connect_to_router_second)
682 {
683   SilcProtocol protocol = (SilcProtocol)context;
684   SilcServerKEInternalContext *ctx = 
685     (SilcServerKEInternalContext *)protocol->context;
686   SilcServer server = (SilcServer)ctx->server;
687   SilcServerConnection sconn = (SilcServerConnection)ctx->context;
688   SilcSocketConnection sock = NULL;
689   SilcServerConnAuthInternalContext *proto_ctx;
690
691   SILC_LOG_DEBUG(("Start"));
692
693   if (protocol->state == SILC_PROTOCOL_STATE_ERROR) {
694     /* Error occured during protocol */
695     silc_protocol_free(protocol);
696     if (ctx->packet)
697       silc_packet_context_free(ctx->packet);
698     if (ctx->ske)
699       silc_ske_free(ctx->ske);
700     if (ctx->dest_id)
701       silc_free(ctx->dest_id);
702     silc_free(ctx);
703     if (sock)
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_AUTH_PASSWORD;
722   if (server->config->routers) {
723     SilcServerConfigSectionServerConnection *conn = NULL;
724
725     /* Check if we find a match from user configured connections */
726     conn = silc_server_config_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     if (packet->flags & SILC_PACKET_FLAG_LIST)
1431       break;
1432     break;
1433
1434   case SILC_PACKET_SUCCESS:
1435     /*
1436      * Success received for something. For now we can have only
1437      * one protocol for connection executing at once hence this
1438      * success message is for whatever protocol is executing currently.
1439      */
1440     SILC_LOG_DEBUG(("Success packet"));
1441     if (packet->flags & SILC_PACKET_FLAG_LIST)
1442       break;
1443     if (sock->protocol) {
1444       sock->protocol->execute(server->timeout_queue, 0,
1445                               sock->protocol, sock->sock, 0, 0);
1446     }
1447     break;
1448
1449   case SILC_PACKET_FAILURE:
1450     /*
1451      * Failure received for something. For now we can have only
1452      * one protocol for connection executing at once hence this
1453      * failure message is for whatever protocol is executing currently.
1454      */
1455     SILC_LOG_DEBUG(("Failure packet"));
1456     if (packet->flags & SILC_PACKET_FLAG_LIST)
1457       break;
1458     if (sock->protocol) {
1459       /* XXX Audit the failure type */
1460       sock->protocol->state = SILC_PROTOCOL_STATE_FAILURE;
1461       sock->protocol->execute(server->timeout_queue, 0,
1462                               sock->protocol, sock->sock, 0, 0);
1463     }
1464     break;
1465
1466   case SILC_PACKET_REJECT:
1467     SILC_LOG_DEBUG(("Reject packet"));
1468     if (packet->flags & SILC_PACKET_FLAG_LIST)
1469       break;
1470     return;
1471     break;
1472
1473   case SILC_PACKET_NOTIFY:
1474     /*
1475      * Received notify packet. Server can receive notify packets from
1476      * router. Server then relays the notify messages to clients if needed.
1477      */
1478     SILC_LOG_DEBUG(("Notify packet"));
1479     if (packet->flags & SILC_PACKET_FLAG_LIST)
1480       silc_server_notify_list(server, sock, packet);
1481     else
1482       silc_server_notify(server, sock, packet);
1483     break;
1484
1485     /* 
1486      * Channel packets
1487      */
1488   case SILC_PACKET_CHANNEL_MESSAGE:
1489     /*
1490      * Received channel message. Channel messages are special packets
1491      * (although probably most common ones) thus they are handled
1492      * specially.
1493      */
1494     SILC_LOG_DEBUG(("Channel Message packet"));
1495     if (packet->flags & SILC_PACKET_FLAG_LIST)
1496       break;
1497     silc_server_channel_message(server, sock, packet);
1498     break;
1499
1500   case SILC_PACKET_CHANNEL_KEY:
1501     /*
1502      * Received key for channel. As channels are created by the router
1503      * the keys are as well. We will distribute the key to all of our
1504      * locally connected clients on the particular channel. Router
1505      * never receives this channel and thus is ignored.
1506      */
1507     SILC_LOG_DEBUG(("Channel Key packet"));
1508     if (packet->flags & SILC_PACKET_FLAG_LIST)
1509       break;
1510     silc_server_channel_key(server, sock, packet);
1511     break;
1512
1513     /*
1514      * Command packets
1515      */
1516   case SILC_PACKET_COMMAND:
1517     /*
1518      * Recived command. Processes the command request and allocates the
1519      * command context and calls the command.
1520      */
1521     SILC_LOG_DEBUG(("Command packet"));
1522     if (packet->flags & SILC_PACKET_FLAG_LIST)
1523       break;
1524     silc_server_command_process(server, sock, packet);
1525     break;
1526
1527   case SILC_PACKET_COMMAND_REPLY:
1528     /*
1529      * Received command reply packet. Received command reply to command. It
1530      * may be reply to command sent by us or reply to command sent by client
1531      * that we've routed further.
1532      */
1533     SILC_LOG_DEBUG(("Command Reply packet"));
1534     if (packet->flags & SILC_PACKET_FLAG_LIST)
1535       break;
1536     silc_server_command_reply(server, sock, packet);
1537     break;
1538
1539     /*
1540      * Private Message packets
1541      */
1542   case SILC_PACKET_PRIVATE_MESSAGE:
1543     /*
1544      * Received private message packet. The packet is coming from either
1545      * client or server.
1546      */
1547     SILC_LOG_DEBUG(("Private Message packet"));
1548     if (packet->flags & SILC_PACKET_FLAG_LIST)
1549       break;
1550     silc_server_private_message(server, sock, packet);
1551     break;
1552
1553   case SILC_PACKET_PRIVATE_MESSAGE_KEY:
1554     /*
1555      * Private message key packet.
1556      */
1557     if (packet->flags & SILC_PACKET_FLAG_LIST)
1558       break;
1559     break;
1560
1561     /*
1562      * Key Exchange protocol packets
1563      */
1564   case SILC_PACKET_KEY_EXCHANGE:
1565     SILC_LOG_DEBUG(("KE packet"));
1566     if (packet->flags & SILC_PACKET_FLAG_LIST)
1567       break;
1568
1569     if (sock->protocol && sock->protocol->protocol->type 
1570         == SILC_PROTOCOL_SERVER_KEY_EXCHANGE) {
1571
1572       SilcServerKEInternalContext *proto_ctx = 
1573         (SilcServerKEInternalContext *)sock->protocol->context;
1574
1575       proto_ctx->packet = silc_packet_context_dup(packet);
1576
1577       /* Let the protocol handle the packet */
1578       sock->protocol->execute(server->timeout_queue, 0, 
1579                               sock->protocol, sock->sock, 0, 100000);
1580     } else {
1581       SILC_LOG_ERROR(("Received Key Exchange packet but no key exchange "
1582                       "protocol active, packet dropped."));
1583
1584       /* XXX Trigger KE protocol?? Rekey actually, maybe. */
1585     }
1586     break;
1587
1588   case SILC_PACKET_KEY_EXCHANGE_1:
1589     SILC_LOG_DEBUG(("KE 1 packet"));
1590     if (packet->flags & SILC_PACKET_FLAG_LIST)
1591       break;
1592
1593     if (sock->protocol && sock->protocol->protocol->type 
1594         == SILC_PROTOCOL_SERVER_KEY_EXCHANGE) {
1595
1596       SilcServerKEInternalContext *proto_ctx = 
1597         (SilcServerKEInternalContext *)sock->protocol->context;
1598
1599       if (proto_ctx->packet)
1600         silc_packet_context_free(proto_ctx->packet);
1601
1602       proto_ctx->packet = silc_packet_context_dup(packet);
1603       proto_ctx->dest_id_type = packet->src_id_type;
1604       proto_ctx->dest_id = silc_id_str2id(packet->src_id, packet->src_id_len,
1605                                           packet->src_id_type);
1606       if (!proto_ctx->dest_id)
1607         break;
1608
1609       /* Let the protocol handle the packet */
1610       sock->protocol->execute(server->timeout_queue, 0, 
1611                               sock->protocol, sock->sock,
1612                               0, 100000);
1613     } else {
1614       SILC_LOG_ERROR(("Received Key Exchange 1 packet but no key exchange "
1615                       "protocol active, packet dropped."));
1616     }
1617     break;
1618
1619   case SILC_PACKET_KEY_EXCHANGE_2:
1620     SILC_LOG_DEBUG(("KE 2 packet"));
1621     if (packet->flags & SILC_PACKET_FLAG_LIST)
1622       break;
1623
1624     if (sock->protocol && sock->protocol->protocol->type 
1625         == SILC_PROTOCOL_SERVER_KEY_EXCHANGE) {
1626
1627       SilcServerKEInternalContext *proto_ctx = 
1628         (SilcServerKEInternalContext *)sock->protocol->context;
1629
1630       if (proto_ctx->packet)
1631         silc_packet_context_free(proto_ctx->packet);
1632
1633       proto_ctx->packet = silc_packet_context_dup(packet);
1634       proto_ctx->dest_id_type = packet->src_id_type;
1635       proto_ctx->dest_id = silc_id_str2id(packet->src_id, packet->src_id_len,
1636                                           packet->src_id_type);
1637       if (!proto_ctx->dest_id)
1638         break;
1639
1640       /* Let the protocol handle the packet */
1641       sock->protocol->execute(server->timeout_queue, 0, 
1642                               sock->protocol, sock->sock,
1643                               0, 100000);
1644     } else {
1645       SILC_LOG_ERROR(("Received Key Exchange 2 packet but no key exchange "
1646                       "protocol active, packet dropped."));
1647     }
1648     break;
1649
1650   case SILC_PACKET_CONNECTION_AUTH_REQUEST:
1651     /*
1652      * Connection authentication request packet. When we receive this packet
1653      * we will send to the other end information about our mandatory
1654      * authentication method for the connection. This packet maybe received
1655      * at any time. 
1656      */
1657     SILC_LOG_DEBUG(("Connection authentication request packet"));
1658     if (packet->flags & SILC_PACKET_FLAG_LIST)
1659       break;
1660     break;
1661
1662     /*
1663      * Connection Authentication protocol packets
1664      */
1665   case SILC_PACKET_CONNECTION_AUTH:
1666     /* Start of the authentication protocol. We receive here the 
1667        authentication data and will verify it. */
1668     SILC_LOG_DEBUG(("Connection auth packet"));
1669     if (packet->flags & SILC_PACKET_FLAG_LIST)
1670       break;
1671
1672     if (sock->protocol && sock->protocol->protocol->type 
1673         == SILC_PROTOCOL_SERVER_CONNECTION_AUTH) {
1674
1675       SilcServerConnAuthInternalContext *proto_ctx = 
1676         (SilcServerConnAuthInternalContext *)sock->protocol->context;
1677
1678       proto_ctx->packet = silc_packet_context_dup(packet);
1679
1680       /* Let the protocol handle the packet */
1681       sock->protocol->execute(server->timeout_queue, 0, 
1682                               sock->protocol, sock->sock, 0, 0);
1683     } else {
1684       SILC_LOG_ERROR(("Received Connection Auth packet but no authentication "
1685                       "protocol active, packet dropped."));
1686     }
1687     break;
1688
1689   case SILC_PACKET_NEW_ID:
1690     /*
1691      * Received New ID packet. This includes some new ID that has been
1692      * created. It may be for client, server or channel. This is the way
1693      * to distribute information about new registered entities in the
1694      * SILC network.
1695      */
1696     SILC_LOG_DEBUG(("New ID packet"));
1697     if (packet->flags & SILC_PACKET_FLAG_LIST)
1698       silc_server_new_id_list(server, sock, packet);
1699     else
1700       silc_server_new_id(server, sock, packet);
1701     break;
1702
1703   case SILC_PACKET_NEW_CLIENT:
1704     /*
1705      * Received new client packet. This includes client information that
1706      * we will use to create initial client ID. After creating new
1707      * ID we will send it to the client.
1708      */
1709     SILC_LOG_DEBUG(("New Client packet"));
1710     if (packet->flags & SILC_PACKET_FLAG_LIST)
1711       break;
1712     silc_server_new_client(server, sock, packet);
1713     break;
1714
1715   case SILC_PACKET_NEW_SERVER:
1716     /*
1717      * Received new server packet. This includes Server ID and some other
1718      * information that we may save. This is received after server has 
1719      * connected to us.
1720      */
1721     SILC_LOG_DEBUG(("New Server packet"));
1722     if (packet->flags & SILC_PACKET_FLAG_LIST)
1723       break;
1724     silc_server_new_server(server, sock, packet);
1725     break;
1726
1727   case SILC_PACKET_NEW_CHANNEL:
1728     /*
1729      * Received new channel packet. Information about new channel in the
1730      * network are distributed using this packet.
1731      */
1732     SILC_LOG_DEBUG(("New Channel packet"));
1733     if (packet->flags & SILC_PACKET_FLAG_LIST)
1734       silc_server_new_channel_list(server, sock, packet);
1735     else
1736       silc_server_new_channel(server, sock, packet);
1737     break;
1738
1739   case SILC_PACKET_HEARTBEAT:
1740     /*
1741      * Received heartbeat.
1742      */
1743     SILC_LOG_DEBUG(("Heartbeat packet"));
1744     if (packet->flags & SILC_PACKET_FLAG_LIST)
1745       break;
1746     break;
1747
1748   default:
1749     SILC_LOG_ERROR(("Incorrect packet type %d, packet dropped", type));
1750     break;
1751   }
1752   
1753 }
1754
1755 /* Closes connection to socket connection */
1756
1757 void silc_server_close_connection(SilcServer server,
1758                                   SilcSocketConnection sock)
1759 {
1760   SILC_LOG_DEBUG(("Closing connection %d", sock->sock));
1761
1762   /* We won't listen for this connection anymore */
1763   silc_schedule_unset_listen_fd(sock->sock);
1764
1765   /* Unregister all tasks */
1766   silc_task_unregister_by_fd(server->io_queue, sock->sock);
1767   silc_task_unregister_by_fd(server->timeout_queue, sock->sock);
1768
1769   /* Close the actual connection */
1770   silc_net_close_connection(sock->sock);
1771   server->sockets[sock->sock] = NULL;
1772   silc_socket_free(sock);
1773 }
1774
1775 /* Sends disconnect message to remote connection and disconnects the 
1776    connection. */
1777
1778 void silc_server_disconnect_remote(SilcServer server,
1779                                    SilcSocketConnection sock,
1780                                    const char *fmt, ...)
1781 {
1782   va_list ap;
1783   unsigned char buf[4096];
1784
1785   if (!sock)
1786     return;
1787
1788   memset(buf, 0, sizeof(buf));
1789   va_start(ap, fmt);
1790   vsprintf(buf, fmt, ap);
1791   va_end(ap);
1792
1793   SILC_LOG_DEBUG(("Disconnecting remote host"));
1794
1795   SILC_LOG_INFO(("Disconnecting %s:%d [%s]", sock->hostname,
1796                   sock->port,
1797                   (sock->type == SILC_SOCKET_TYPE_UNKNOWN ? "Unknown" :
1798                    sock->type == SILC_SOCKET_TYPE_CLIENT ? "Client" :
1799                    sock->type == SILC_SOCKET_TYPE_SERVER ? "Server" :
1800                    "Router")));
1801
1802   /* Notify remote end that the conversation is over. The notify message
1803      is tried to be sent immediately. */
1804   silc_server_packet_send(server, sock, SILC_PACKET_DISCONNECT, 0,  
1805                           buf, strlen(buf), TRUE);
1806
1807   /* Mark the connection to be disconnected */
1808   SILC_SET_DISCONNECTED(sock);
1809   silc_server_close_connection(server, sock);
1810 }
1811
1812 /* Frees client data and notifies about client's signoff. */
1813
1814 void silc_server_free_client_data(SilcServer server, 
1815                                   SilcSocketConnection sock,
1816                                   SilcClientEntry user_data, char *signoff)
1817 {
1818   /* Send REMOVE_ID packet to routers. */
1819   if (!server->standalone && server->router)
1820     silc_server_send_notify_signoff(server, server->router->connection,
1821                                     server->server_type == SILC_SERVER ?
1822                                     FALSE : TRUE, user_data->id, 
1823                                     SILC_ID_CLIENT_LEN, signoff);
1824
1825   /* Remove client from all channels */
1826   silc_server_remove_from_channels(server, sock, user_data, signoff);
1827
1828   /* XXX must take some info to history before freeing */
1829
1830   /* Free the client entry and everything in it */
1831   silc_idlist_del_data(user_data);
1832   silc_idlist_del_client(server->local_list, user_data);
1833   server->stat.my_clients--;
1834   server->stat.clients--;
1835   if (server->server_type == SILC_ROUTER)
1836     server->stat.cell_clients--;
1837 }
1838
1839 /* Frees 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       silc_server_free_client_data(server, sock, user_data, NULL);
1853       break;
1854     }
1855   case SILC_SOCKET_TYPE_SERVER:
1856   case SILC_SOCKET_TYPE_ROUTER:
1857     {
1858       SilcServerEntry user_data = (SilcServerEntry)sock->user_data;
1859
1860       /* Send REMOVE_ID packet to routers. */
1861       if (!server->standalone && server->router)
1862         silc_server_send_notify_server_signoff(server, 
1863                                                server->router->connection,
1864                                                server->server_type == 
1865                                                SILC_SERVER ?
1866                                                FALSE : TRUE, user_data->id, 
1867                                                SILC_ID_SERVER_LEN);
1868
1869       /* Then also free all client entries that this server owns as
1870          they will become invalid now as well. */
1871       silc_server_remove_clients_by_server(server, user_data);
1872
1873       /* If this was our primary router connection then we're lost to
1874          the outside world. */
1875       if (server->server_type == SILC_SERVER && server->router == user_data) {
1876         server->id_entry->router = NULL;
1877         server->router = NULL;
1878         server->standalone = TRUE;
1879       }
1880
1881       /* Free the server entry */
1882       silc_idlist_del_data(user_data);
1883       silc_idlist_del_server(server->local_list, user_data);
1884       server->stat.my_servers--;
1885       server->stat.servers--;
1886       if (server->server_type == SILC_ROUTER)
1887         server->stat.cell_servers--;
1888       break;
1889     }
1890   default:
1891     {
1892       SilcUnknownEntry user_data = (SilcUnknownEntry)sock->user_data;
1893
1894       silc_idlist_del_data(user_data);
1895       silc_free(user_data);
1896       break;
1897     }
1898   }
1899
1900   sock->user_data = NULL;
1901 }
1902
1903 /* This function is used to remove all client entries by the server `entry'.
1904    This is called when the connection is lost to the server. In this case
1905    we must invalidate all the client entries owned by the server `entry'. */
1906
1907 int silc_server_remove_clients_by_server(SilcServer server, 
1908                                          SilcServerEntry entry)
1909 {
1910   SilcIDCacheList list = NULL;
1911   SilcIDCacheEntry id_cache = NULL;
1912   SilcClientEntry client = NULL;
1913
1914   SILC_LOG_DEBUG(("Start"));
1915
1916   if (silc_idcache_find_by_id(server->local_list->clients, 
1917                               SILC_ID_CACHE_ANY, SILC_ID_CLIENT, &list)) {
1918
1919     if (silc_idcache_list_first(list, &id_cache)) {
1920       while (id_cache) {
1921         client = (SilcClientEntry)id_cache->context;
1922         
1923         if (client->router != entry) {
1924           if (!silc_idcache_list_next(list, &id_cache))
1925             break;
1926           else
1927             continue;
1928         }
1929
1930         /* Remove the client entry */
1931         silc_server_remove_from_channels(server, NULL, client, NULL);
1932         silc_idlist_del_client(server->local_list, client);
1933
1934         if (!silc_idcache_list_next(list, &id_cache))
1935           break;
1936       }
1937     }
1938     silc_idcache_list_free(list);
1939   }
1940   
1941   if (silc_idcache_find_by_id(server->global_list->clients, 
1942                               SILC_ID_CACHE_ANY, SILC_ID_CLIENT, &list)) {
1943
1944     if (silc_idcache_list_first(list, &id_cache)) {
1945       while (id_cache) {
1946         client = (SilcClientEntry)id_cache->context;
1947         
1948         if (client->router != entry) {
1949           if (!silc_idcache_list_next(list, &id_cache))
1950             break;
1951           else
1952             continue;
1953         }
1954
1955         /* Remove the client entry */
1956         silc_server_remove_from_channels(server, NULL, client, NULL);
1957         silc_idlist_del_client(server->global_list, client);
1958
1959         if (!silc_idcache_list_next(list, &id_cache))
1960           break;
1961       }
1962     }
1963     silc_idcache_list_free(list);
1964   }
1965   
1966   return TRUE;
1967 }
1968
1969 /* Checks whether given channel has global users.  If it does this returns
1970    TRUE and FALSE if there is only locally connected clients on the channel. */
1971
1972 int silc_server_channel_has_global(SilcChannelEntry channel)
1973 {
1974   SilcChannelClientEntry chl;
1975
1976   silc_list_start(channel->user_list);
1977   while ((chl = silc_list_get(channel->user_list)) != SILC_LIST_END) {
1978     if (chl->client->router)
1979       return TRUE;
1980   }
1981
1982   return FALSE;
1983 }
1984
1985 /* Checks whether given channel has locally connected users.  If it does this
1986    returns TRUE and FALSE if there is not one locally connected client. */
1987
1988 int silc_server_channel_has_local(SilcChannelEntry channel)
1989 {
1990   SilcChannelClientEntry chl;
1991
1992   silc_list_start(channel->user_list);
1993   while ((chl = silc_list_get(channel->user_list)) != SILC_LIST_END) {
1994     if (!chl->client->router)
1995       return TRUE;
1996   }
1997
1998   return FALSE;
1999 }
2000
2001 /* Removes client from all channels it has joined. This is used when client
2002    connection is disconnected. If the client on a channel is last, the
2003    channel is removed as well. This sends the SIGNOFF notify types. */
2004
2005 void silc_server_remove_from_channels(SilcServer server, 
2006                                       SilcSocketConnection sock,
2007                                       SilcClientEntry client,
2008                                       char *signoff_message)
2009 {
2010   SilcChannelEntry channel;
2011   SilcChannelClientEntry chl;
2012   SilcBuffer clidp;
2013
2014   SILC_LOG_DEBUG(("Start"));
2015
2016   if (!client || !client->id)
2017     return;
2018
2019   clidp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
2020
2021   /* Remove the client from all channels. The client is removed from
2022      the channels' user list. */
2023   silc_list_start(client->channels);
2024   while ((chl = silc_list_get(client->channels)) != SILC_LIST_END) {
2025     channel = chl->channel;
2026
2027     /* Remove channel from client's channel list */
2028     silc_list_del(client->channels, chl);
2029
2030     /* Remove channel if there is no users anymore */
2031     if (server->server_type == SILC_ROUTER &&
2032         silc_list_count(channel->user_list) < 2) {
2033       if (!silc_idlist_del_channel(server->local_list, channel))
2034         silc_idlist_del_channel(server->global_list, channel);
2035       server->stat.my_channels--;
2036       continue;
2037     }
2038
2039     /* Remove client from channel's client list */
2040     silc_list_del(channel->user_list, chl);
2041     silc_free(chl);
2042     server->stat.my_chanclients--;
2043
2044     /* If there is no global users on the channel anymore mark the channel
2045        as local channel. */
2046     if (server->server_type == SILC_SERVER &&
2047         !silc_server_channel_has_global(channel))
2048       channel->global_users = FALSE;
2049
2050     /* If there is not at least one local user on the channel then we don't
2051        need the channel entry anymore, we can remove it safely. */
2052     if (server->server_type == SILC_SERVER &&
2053         !silc_server_channel_has_local(channel)) {
2054       /* Notify about leaving client if this channel has global users. */
2055       if (channel->global_users)
2056         silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2057                                            SILC_NOTIFY_TYPE_SIGNOFF, 
2058                                            signoff_message ? 2 : 1,
2059                                            clidp->data, clidp->len,
2060                                            signoff_message, signoff_message ?
2061                                            strlen(signoff_message) : 0);
2062
2063       if (!silc_idlist_del_channel(server->local_list, channel))
2064         silc_idlist_del_channel(server->global_list, channel);
2065       server->stat.my_channels--;
2066       continue;
2067     }
2068
2069     /* Send notify to channel about client leaving SILC and thus
2070        the entire channel. */
2071     silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2072                                        SILC_NOTIFY_TYPE_SIGNOFF, 
2073                                        signoff_message ? 2 : 1,
2074                                        clidp->data, clidp->len,
2075                                        signoff_message, signoff_message ?
2076                                        strlen(signoff_message) : 0);
2077   }
2078
2079   silc_buffer_free(clidp);
2080 }
2081
2082 /* Removes client from one channel. This is used for example when client
2083    calls LEAVE command to remove itself from the channel. Returns TRUE
2084    if channel still exists and FALSE if the channel is removed when
2085    last client leaves the channel. If `notify' is FALSE notify messages
2086    are not sent. */
2087
2088 int silc_server_remove_from_one_channel(SilcServer server, 
2089                                         SilcSocketConnection sock,
2090                                         SilcChannelEntry channel,
2091                                         SilcClientEntry client,
2092                                         int notify)
2093 {
2094   SilcChannelEntry ch;
2095   SilcChannelClientEntry chl;
2096   SilcBuffer clidp;
2097
2098   SILC_LOG_DEBUG(("Start"));
2099
2100   clidp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
2101
2102   /* Remove the client from the channel. The client is removed from
2103      the channel's user list. */
2104   silc_list_start(client->channels);
2105   while ((chl = silc_list_get(client->channels)) != SILC_LIST_END) {
2106     if (chl->channel != channel)
2107       continue;
2108
2109     ch = chl->channel;
2110
2111     /* Remove channel from client's channel list */
2112     silc_list_del(client->channels, chl);
2113
2114     /* Remove channel if there is no users anymore */
2115     if (server->server_type == SILC_ROUTER &&
2116         silc_list_count(channel->user_list) < 2) {
2117       if (!silc_idlist_del_channel(server->local_list, channel))
2118         silc_idlist_del_channel(server->global_list, channel);
2119       silc_buffer_free(clidp);
2120       server->stat.my_channels--;
2121       return FALSE;
2122     }
2123
2124     /* Remove client from channel's client list */
2125     silc_list_del(channel->user_list, chl);
2126     silc_free(chl);
2127     server->stat.my_chanclients--;
2128
2129     /* If there is no global users on the channel anymore mark the channel
2130        as local channel. */
2131     if (server->server_type == SILC_SERVER &&
2132         !silc_server_channel_has_global(channel))
2133       channel->global_users = FALSE;
2134
2135     /* If there is not at least one local user on the channel then we don't
2136        need the channel entry anymore, we can remove it safely. */
2137     if (server->server_type == SILC_SERVER &&
2138         !silc_server_channel_has_local(channel)) {
2139       /* Notify about leaving client if this channel has global users. */
2140       if (notify && channel->global_users)
2141         silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2142                                            SILC_NOTIFY_TYPE_LEAVE, 1,
2143                                            clidp->data, clidp->len);
2144
2145       if (!silc_idlist_del_channel(server->local_list, channel))
2146         silc_idlist_del_channel(server->global_list, channel);
2147       silc_buffer_free(clidp);
2148       server->stat.my_channels--;
2149       return FALSE;
2150     }
2151
2152     /* Send notify to channel about client leaving the channel */
2153     if (notify)
2154       silc_server_send_notify_to_channel(server, NULL, channel, FALSE,
2155                                          SILC_NOTIFY_TYPE_LEAVE, 1,
2156                                          clidp->data, clidp->len);
2157     break;
2158   }
2159
2160   silc_buffer_free(clidp);
2161   return TRUE;
2162 }
2163
2164 /* Returns TRUE if the given client is on the channel.  FALSE if not. 
2165    This works because we assure that the user list on the channel is
2166    always in up to date thus we can only check the channel list from 
2167    `client' which is faster than checking the user list from `channel'. */
2168
2169 int silc_server_client_on_channel(SilcClientEntry client,
2170                                   SilcChannelEntry channel)
2171 {
2172   SilcChannelClientEntry chl;
2173
2174   if (!client || !channel)
2175     return FALSE;
2176
2177   silc_list_start(client->channels);
2178   while ((chl = silc_list_get(client->channels)) != SILC_LIST_END)
2179     if (chl->channel == channel)
2180       return TRUE;
2181
2182   return FALSE;
2183 }
2184
2185 /* Timeout callback. This is called if connection is idle or for some
2186    other reason is not responding within some period of time. This 
2187    disconnects the remote end. */
2188
2189 SILC_TASK_CALLBACK(silc_server_timeout_remote)
2190 {
2191   SilcServer server = (SilcServer)context;
2192   SilcSocketConnection sock = server->sockets[fd];
2193
2194   if (!sock)
2195     return;
2196
2197   if (sock->user_data)
2198     silc_server_free_sock_user_data(server, sock);
2199
2200   silc_server_disconnect_remote(server, sock, 
2201                                 "Server closed connection: "
2202                                 "Connection timeout");
2203 }
2204
2205 /* Creates new channel. Sends NEW_CHANNEL packet to primary route. This
2206    function may be used only by router. In real SILC network all channels
2207    are created by routers thus this function is never used by normal
2208    server. */
2209
2210 SilcChannelEntry silc_server_create_new_channel(SilcServer server, 
2211                                                 SilcServerID *router_id,
2212                                                 char *cipher, 
2213                                                 char *channel_name,
2214                                                 int broadcast)
2215 {
2216   SilcChannelID *channel_id;
2217   SilcChannelEntry entry;
2218   SilcCipher key;
2219
2220   SILC_LOG_DEBUG(("Creating new channel"));
2221
2222   if (!cipher)
2223     cipher = "twofish";
2224
2225   /* Allocate cipher */
2226   silc_cipher_alloc(cipher, &key);
2227
2228   channel_name = strdup(channel_name);
2229
2230   /* Create the channel */
2231   silc_id_create_channel_id(router_id, server->rng, &channel_id);
2232   entry = silc_idlist_add_channel(server->local_list, channel_name, 
2233                                   SILC_CHANNEL_MODE_NONE, channel_id, 
2234                                   NULL, key);
2235   if (!entry) {
2236     silc_free(channel_name);
2237     return NULL;
2238   }
2239
2240   /* Now create the actual key material */
2241   silc_server_create_channel_key(server, entry, 16);
2242
2243   /* Notify other routers about the new channel. We send the packet
2244      to our primary route. */
2245   if (broadcast && server->standalone == FALSE) {
2246     silc_server_send_new_channel(server, server->router->connection, TRUE, 
2247                                  channel_name, entry->id, SILC_ID_CHANNEL_LEN);
2248   }
2249
2250   server->stat.my_channels++;
2251
2252   return entry;
2253 }
2254
2255 /* Same as above but creates the channel with Channel ID `channel_id. */
2256
2257 SilcChannelEntry 
2258 silc_server_create_new_channel_with_id(SilcServer server, 
2259                                        char *cipher, 
2260                                        char *channel_name,
2261                                        SilcChannelID *channel_id,
2262                                        int broadcast)
2263 {
2264   SilcChannelEntry entry;
2265   SilcCipher key;
2266
2267   SILC_LOG_DEBUG(("Creating new channel"));
2268
2269   if (!cipher)
2270     cipher = "twofish";
2271
2272   /* Allocate cipher */
2273   silc_cipher_alloc(cipher, &key);
2274
2275   channel_name = strdup(channel_name);
2276
2277   /* Create the channel */
2278   entry = silc_idlist_add_channel(server->local_list, channel_name, 
2279                                   SILC_CHANNEL_MODE_NONE, channel_id, 
2280                                   NULL, key);
2281   if (!entry) {
2282     silc_free(channel_name);
2283     return NULL;
2284   }
2285
2286   /* Now create the actual key material */
2287   silc_server_create_channel_key(server, entry, 16);
2288
2289   /* Notify other routers about the new channel. We send the packet
2290      to our primary route. */
2291   if (broadcast && server->standalone == FALSE) {
2292     silc_server_send_new_channel(server, server->router->connection, TRUE, 
2293                                  channel_name, entry->id, SILC_ID_CHANNEL_LEN);
2294   }
2295
2296   server->stat.my_channels++;
2297
2298   return entry;
2299 }
2300
2301 /* Generates new channel key. This is used to create the initial channel key
2302    but also to re-generate new key for channel. If `key_len' is provided
2303    it is the bytes of the key length. */
2304
2305 void silc_server_create_channel_key(SilcServer server, 
2306                                     SilcChannelEntry channel,
2307                                     unsigned int key_len)
2308 {
2309   int i;
2310   unsigned char channel_key[32];
2311   unsigned int len;
2312
2313   if (!channel->channel_key)
2314     silc_cipher_alloc("twofish", &channel->channel_key);
2315
2316   if (key_len)
2317     len = key_len;
2318   else if (channel->key_len)
2319     len = channel->key_len / 8;
2320   else
2321     len = sizeof(channel_key);
2322
2323   /* Create channel key */
2324   for (i = 0; i < len; i++) channel_key[i] = silc_rng_get_byte(server->rng);
2325   
2326   /* Set the key */
2327   channel->channel_key->cipher->set_key(channel->channel_key->context, 
2328                                         channel_key, len);
2329
2330   /* Remove old key if exists */
2331   if (channel->key) {
2332     memset(channel->key, 0, channel->key_len / 8);
2333     silc_free(channel->key);
2334   }
2335
2336   /* Save the key */
2337   channel->key_len = len * 8;
2338   channel->key = silc_calloc(len, sizeof(*channel->key));
2339   memcpy(channel->key, channel_key, len);
2340   memset(channel_key, 0, sizeof(channel_key));
2341 }
2342
2343 /* Saves the channel key found in the encoded `key_payload' buffer. This 
2344    function is used when we receive Channel Key Payload and also when we're
2345    processing JOIN command reply. Returns entry to the channel. */
2346
2347 SilcChannelEntry silc_server_save_channel_key(SilcServer server,
2348                                               SilcBuffer key_payload,
2349                                               SilcChannelEntry channel)
2350 {
2351   SilcChannelKeyPayload payload = NULL;
2352   SilcChannelID *id = NULL;
2353   unsigned char *tmp;
2354   unsigned int tmp_len;
2355   char *cipher;
2356
2357   /* Decode channel key payload */
2358   payload = silc_channel_key_payload_parse(key_payload);
2359   if (!payload) {
2360     SILC_LOG_ERROR(("Bad channel key payload, dropped"));
2361     channel = NULL;
2362     goto out;
2363   }
2364
2365   /* Get the channel entry */
2366   if (!channel) {
2367
2368     /* Get channel ID */
2369     tmp = silc_channel_key_get_id(payload, &tmp_len);
2370     id = silc_id_str2id(tmp, tmp_len, SILC_ID_CHANNEL);
2371     if (!id) {
2372       channel = NULL;
2373       goto out;
2374     }
2375
2376     channel = silc_idlist_find_channel_by_id(server->local_list, id, NULL);
2377     if (!channel) {
2378       channel = silc_idlist_find_channel_by_id(server->global_list, id, NULL);
2379       if (!channel) {
2380         SILC_LOG_ERROR(("Received key for non-existent channel"));
2381         goto out;
2382       }
2383     }
2384   }
2385
2386   tmp = silc_channel_key_get_key(payload, &tmp_len);
2387   if (!tmp) {
2388     channel = NULL;
2389     goto out;
2390   }
2391
2392   cipher = silc_channel_key_get_cipher(payload, NULL);;
2393   if (!cipher) {
2394     channel = NULL;
2395     goto out;
2396   }
2397
2398   /* Remove old key if exists */
2399   if (channel->key) {
2400     memset(channel->key, 0, channel->key_len / 8);
2401     silc_free(channel->key);
2402     silc_cipher_free(channel->channel_key);
2403   }
2404
2405   /* Create new cipher */
2406   if (!silc_cipher_alloc(cipher, &channel->channel_key)) {
2407     channel = NULL;
2408     goto out;
2409   }
2410
2411   /* Save the key */
2412   channel->key_len = tmp_len * 8;
2413   channel->key = silc_calloc(tmp_len, sizeof(unsigned char));
2414   memcpy(channel->key, tmp, tmp_len);
2415   channel->channel_key->cipher->set_key(channel->channel_key->context, 
2416                                         tmp, tmp_len);
2417
2418  out:
2419   if (id)
2420     silc_free(id);
2421   if (payload)
2422     silc_channel_key_payload_free(payload);
2423
2424   return channel;
2425 }
2426
2427 /* Heartbeat callback. This function is set as argument for the
2428    silc_socket_set_heartbeat function. The library will call this function
2429    at the set time interval. */
2430
2431 void silc_server_perform_heartbeat(SilcSocketConnection sock,
2432                                    void *hb_context)
2433 {
2434   SilcServerHBContext hb = (SilcServerHBContext)hb_context;
2435
2436   SILC_LOG_DEBUG(("Sending heartbeat to %s (%s)", sock->hostname,
2437                   sock->ip));
2438
2439   /* Send the heartbeat */
2440   silc_server_send_heartbeat(hb->server, sock);
2441 }
2442
2443 /* Returns assembled of all servers in the given ID list. The packet's
2444    form is dictated by the New ID payload. */
2445
2446 static void silc_server_announce_get_servers(SilcServer server,
2447                                              SilcIDList id_list,
2448                                              SilcBuffer *servers)
2449 {
2450   SilcIDCacheList list;
2451   SilcIDCacheEntry id_cache;
2452   SilcServerEntry entry;
2453   SilcBuffer idp;
2454
2455   /* Go through all clients in the list */
2456   if (silc_idcache_find_by_id(id_list->clients, SILC_ID_CACHE_ANY, 
2457                               SILC_ID_SERVER, &list)) {
2458     if (silc_idcache_list_first(list, &id_cache)) {
2459       while (id_cache) {
2460         entry = (SilcServerEntry)id_cache->context;
2461
2462         idp = silc_id_payload_encode(entry->id, SILC_ID_SERVER);
2463
2464         *servers = silc_buffer_realloc(*servers, 
2465                                        (*servers ? 
2466                                         (*servers)->truelen + idp->len : 
2467                                         idp->len));
2468         silc_buffer_pull_tail(*servers, ((*servers)->end - (*servers)->data));
2469         silc_buffer_put(*servers, idp->data, idp->len);
2470         silc_buffer_pull(*servers, idp->len);
2471         silc_buffer_free(idp);
2472
2473         if (!silc_idcache_list_next(list, &id_cache))
2474           break;
2475       }
2476     }
2477
2478     silc_idcache_list_free(list);
2479   }
2480 }
2481
2482 /* This function is used by router to announce existing servers to our
2483    primary router when we've connected to it. */
2484
2485 void silc_server_announce_servers(SilcServer server)
2486 {
2487   SilcBuffer servers = NULL;
2488
2489   SILC_LOG_DEBUG(("Announcing servers"));
2490
2491   /* Get servers in local list */
2492   silc_server_announce_get_servers(server, server->local_list, &servers);
2493
2494   /* Get servers in global list */
2495   silc_server_announce_get_servers(server, server->global_list, &servers);
2496
2497   if (servers) {
2498     silc_buffer_push(servers, servers->data - servers->head);
2499     SILC_LOG_HEXDUMP(("servers"), servers->data, servers->len);
2500
2501     /* Send the packet */
2502     silc_server_packet_send(server, server->router->connection,
2503                             SILC_PACKET_NEW_ID, SILC_PACKET_FLAG_LIST,
2504                             servers->data, servers->len, TRUE);
2505
2506     silc_buffer_free(servers);
2507   }
2508 }
2509
2510 /* Returns assembled packet of all clients in the given ID list. The
2511    packet's form is dictated by the New ID Payload. */
2512
2513 static void silc_server_announce_get_clients(SilcServer server,
2514                                              SilcIDList id_list,
2515                                              SilcBuffer *clients)
2516 {
2517   SilcIDCacheList list;
2518   SilcIDCacheEntry id_cache;
2519   SilcClientEntry client;
2520   SilcBuffer idp;
2521
2522   /* Go through all clients in the list */
2523   if (silc_idcache_find_by_id(id_list->clients, SILC_ID_CACHE_ANY, 
2524                               SILC_ID_CLIENT, &list)) {
2525     if (silc_idcache_list_first(list, &id_cache)) {
2526       while (id_cache) {
2527         client = (SilcClientEntry)id_cache->context;
2528
2529         idp = silc_id_payload_encode(client->id, SILC_ID_CLIENT);
2530
2531         *clients = silc_buffer_realloc(*clients, 
2532                                        (*clients ? 
2533                                         (*clients)->truelen + idp->len : 
2534                                         idp->len));
2535         silc_buffer_pull_tail(*clients, ((*clients)->end - (*clients)->data));
2536         silc_buffer_put(*clients, idp->data, idp->len);
2537         silc_buffer_pull(*clients, idp->len);
2538         silc_buffer_free(idp);
2539
2540         if (!silc_idcache_list_next(list, &id_cache))
2541           break;
2542       }
2543     }
2544
2545     silc_idcache_list_free(list);
2546   }
2547 }
2548
2549 /* This function is used to announce our existing clients to our router
2550    when we've connected to it. */
2551
2552 void silc_server_announce_clients(SilcServer server)
2553 {
2554   SilcBuffer clients = NULL;
2555
2556   SILC_LOG_DEBUG(("Announcing clients"));
2557
2558   /* Get clients in local list */
2559   silc_server_announce_get_clients(server, server->local_list,
2560                                    &clients);
2561
2562   /* As router we announce our global list as well */
2563   if (server->server_type == SILC_ROUTER)
2564     silc_server_announce_get_clients(server, server->global_list,
2565                                      &clients);
2566
2567   if (clients) {
2568     silc_buffer_push(clients, clients->data - clients->head);
2569     SILC_LOG_HEXDUMP(("clients"), clients->data, clients->len);
2570
2571     /* Send the packet */
2572     silc_server_packet_send(server, server->router->connection,
2573                             SILC_PACKET_NEW_ID, SILC_PACKET_FLAG_LIST,
2574                             clients->data, clients->len, TRUE);
2575
2576     silc_buffer_free(clients);
2577   }
2578 }
2579
2580 static SilcBuffer 
2581 silc_server_announce_encode_join(unsigned int argc, ...)
2582 {
2583   va_list ap;
2584
2585   va_start(ap, argc);
2586   return silc_notify_payload_encode(SILC_NOTIFY_TYPE_JOIN, argc, ap);
2587 }
2588
2589 /* Returns assembled packets for all channels and users on those channels
2590    from the given ID List. The packets are in the form dictated by the
2591    New Channel and New Channel User payloads. */
2592
2593 static void silc_server_announce_get_channels(SilcServer server,
2594                                               SilcIDList id_list,
2595                                               SilcBuffer *channels,
2596                                               SilcBuffer *channel_users)
2597 {
2598   SilcIDCacheList list;
2599   SilcIDCacheEntry id_cache;
2600   SilcChannelEntry channel;
2601   SilcChannelClientEntry chl;
2602   SilcBuffer chidp;
2603   unsigned char *cid;
2604   unsigned short name_len;
2605   int len;
2606
2607   /* Go through all channels in the list */
2608   if (silc_idcache_find_by_id(id_list->channels, SILC_ID_CACHE_ANY, 
2609                               SILC_ID_CHANNEL, &list)) {
2610     if (silc_idcache_list_first(list, &id_cache)) {
2611       while (id_cache) {
2612         channel = (SilcChannelEntry)id_cache->context;
2613         
2614         cid = silc_id_id2str(channel->id, SILC_ID_CHANNEL);
2615         name_len = strlen(channel->channel_name);
2616
2617         len = 4 + name_len + SILC_ID_CHANNEL_LEN;
2618         *channels = 
2619           silc_buffer_realloc(*channels, 
2620                               (*channels ? (*channels)->truelen + len : len));
2621         silc_buffer_pull_tail(*channels, 
2622                               ((*channels)->end - (*channels)->data));
2623         silc_buffer_format(*channels,
2624                            SILC_STR_UI_SHORT(name_len),
2625                            SILC_STR_UI_XNSTRING(channel->channel_name, 
2626                                                 name_len),
2627                            SILC_STR_UI_SHORT(SILC_ID_CHANNEL_LEN),
2628                            SILC_STR_UI_XNSTRING(cid, SILC_ID_CHANNEL_LEN),
2629                            SILC_STR_END);
2630         silc_buffer_pull(*channels, len);
2631
2632         /* Now find all users on the channel */
2633         chidp = silc_id_payload_encode(channel->id, SILC_ID_CHANNEL);
2634         silc_list_start(channel->user_list);
2635         while ((chl = silc_list_get(channel->user_list)) != SILC_LIST_END) {
2636           SilcBuffer clidp;
2637           SilcBuffer tmp;
2638
2639           clidp = silc_id_payload_encode(chl->client->id, SILC_ID_CLIENT);
2640
2641           tmp = silc_server_announce_encode_join(2, clidp->data, clidp->len,
2642                                                  chidp->data, chidp->len);
2643           len = tmp->len;
2644           *channel_users = 
2645             silc_buffer_realloc(*channel_users, 
2646                                 (*channel_users ? 
2647                                  (*channel_users)->truelen + len : len));
2648           silc_buffer_pull_tail(*channel_users, 
2649                                 ((*channel_users)->end - 
2650                                  (*channel_users)->data));
2651
2652           silc_buffer_put(*channel_users, tmp->data, tmp->len);
2653           silc_buffer_pull(*channel_users, len);
2654           silc_buffer_free(clidp);
2655           silc_buffer_free(tmp);
2656         }
2657         silc_buffer_free(chidp);
2658
2659         silc_free(cid);
2660
2661         if (!silc_idcache_list_next(list, &id_cache))
2662           break;
2663       }
2664     }
2665
2666     silc_idcache_list_free(list);
2667   }
2668 }
2669
2670 /* This function is used to announce our existing channels to our router
2671    when we've connected to it. This also announces the users on the
2672    channels to the router. */
2673
2674 void silc_server_announce_channels(SilcServer server)
2675 {
2676   SilcBuffer channels = NULL, channel_users = NULL;
2677
2678   SILC_LOG_DEBUG(("Announcing channels and channel users"));
2679
2680   /* Get channels and channel users in local list */
2681   silc_server_announce_get_channels(server, server->local_list,
2682                                     &channels, &channel_users);
2683
2684   /* Get channels and channel users in global list */
2685   silc_server_announce_get_channels(server, server->global_list,
2686                                     &channels, &channel_users);
2687
2688   if (channels) {
2689     silc_buffer_push(channels, channels->data - channels->head);
2690     SILC_LOG_HEXDUMP(("channels"), channels->data, channels->len);
2691
2692     /* Send the packet */
2693     silc_server_packet_send(server, server->router->connection,
2694                             SILC_PACKET_NEW_CHANNEL, SILC_PACKET_FLAG_LIST,
2695                             channels->data, channels->len,
2696                             FALSE);
2697
2698     silc_buffer_free(channels);
2699   }
2700
2701   if (channel_users) {
2702     silc_buffer_push(channel_users, channel_users->data - channel_users->head);
2703     SILC_LOG_HEXDUMP(("channel users"), channel_users->data, 
2704                      channel_users->len);
2705
2706     /* Send the packet */
2707     silc_server_packet_send(server, server->router->connection,
2708                             SILC_PACKET_NOTIFY, SILC_PACKET_FLAG_LIST,
2709                             channel_users->data, channel_users->len,
2710                             FALSE);
2711
2712     silc_buffer_free(channel_users);
2713   }
2714 }