]> arthur.barton.de Git - ngircd-alex.git/blob - src/ngircd/conn.c
Adjust severity levels of some log messages
[ngircd-alex.git] / src / ngircd / conn.c
1 /*
2  * ngIRCd -- The Next Generation IRC Daemon
3  * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  * Please read the file COPYING, README and AUTHORS for more information.
10  */
11
12 #undef DEBUG_BUFFER
13
14 #define CONN_MODULE
15
16 #include "portab.h"
17 #include "conf-ssl.h"
18 #include "io.h"
19
20 /**
21  * @file
22  * Connection management
23  */
24
25 #include "imp.h"
26 #include <assert.h>
27 #ifdef PROTOTYPES
28 # include <stdarg.h>
29 #else
30 # include <varargs.h>
31 #endif
32 #include <stdio.h>
33 #include <stdlib.h>
34 #include <unistd.h>
35 #include <errno.h>
36 #include <string.h>
37 #include <sys/socket.h>
38 #include <sys/time.h>
39 #include <sys/types.h>
40 #include <time.h>
41 #include <netinet/in.h>
42
43 #ifdef HAVE_NETINET_IP_H
44 # ifdef HAVE_NETINET_IN_SYSTM_H
45 #  include <netinet/in_systm.h>
46 # endif
47 # include <netinet/ip.h>
48 #endif
49
50 #ifdef TCPWRAP
51 # include <tcpd.h>                      /* for TCP Wrappers */
52 #endif
53
54 #include "array.h"
55 #include "defines.h"
56
57 #include "exp.h"
58 #include "conn.h"
59
60 #include "imp.h"
61 #include "ngircd.h"
62 #include "array.h"
63 #include "client.h"
64 #include "class.h"
65 #include "conf.h"
66 #include "conn-encoding.h"
67 #include "conn-ssl.h"
68 #include "conn-zip.h"
69 #include "conn-func.h"
70 #include "log.h"
71 #include "ng_ipaddr.h"
72 #include "parse.h"
73 #include "resolve.h"
74 #include "tool.h"
75
76 #include "exp.h"
77
78
79 #define SERVER_WAIT (NONE - 1)
80
81 #define MAX_COMMANDS 3
82 #define MAX_COMMANDS_SERVER_MIN 10
83 #define MAX_COMMANDS_SERVICE 10
84
85 #define SD_LISTEN_FDS_START 3
86
87
88 static bool Handle_Write PARAMS(( CONN_ID Idx ));
89 static bool Conn_Write PARAMS(( CONN_ID Idx, char *Data, size_t Len ));
90 static int New_Connection PARAMS(( int Sock, bool IsSSL ));
91 static CONN_ID Socket2Index PARAMS(( int Sock ));
92 static void Read_Request PARAMS(( CONN_ID Idx ));
93 static unsigned int Handle_Buffer PARAMS(( CONN_ID Idx ));
94 static void Check_Connections PARAMS(( void ));
95 static void Check_Servers PARAMS(( void ));
96 static void Init_Conn_Struct PARAMS(( CONN_ID Idx ));
97 static bool Init_Socket PARAMS(( int Sock ));
98 static void New_Server PARAMS(( int Server, ng_ipaddr_t *dest ));
99 static void Simple_Message PARAMS(( int Sock, const char *Msg ));
100 static int NewListener PARAMS(( const char *listen_addr, UINT16 Port ));
101 static void Account_Connection PARAMS((void));
102
103
104 static array My_Listeners;
105 static array My_ConnArray;
106 static size_t NumConnections, NumConnectionsMax, NumConnectionsAccepted;
107
108 #ifdef TCPWRAP
109 int allow_severity = LOG_INFO;
110 int deny_severity = LOG_ERR;
111 #endif
112
113 static void server_login PARAMS((CONN_ID idx));
114
115 #ifdef SSL_SUPPORT
116 extern struct SSLOptions Conf_SSLOptions;
117 static void cb_connserver_login_ssl PARAMS((int sock, short what));
118 static void cb_clientserver_ssl PARAMS((int sock, short what));
119 #endif
120 static void cb_Read_Resolver_Result PARAMS((int sock, UNUSED short what));
121 static void cb_Connect_to_Server PARAMS((int sock, UNUSED short what));
122 static void cb_clientserver PARAMS((int sock, short what));
123
124 time_t idle_t = 0;
125
126
127 /**
128  * Get number of sockets available from systemd(8).
129  *
130  * ngIRCd needs to implement its own sd_listen_fds(3) function and can't
131  * use the one provided by systemd itself, becaus the sockets will be
132  * used in a forked child process with a new PID, and this would trigger
133  * an error in the standard implementation.
134  *
135  * @return Number of sockets available, -1 if sockets have already been
136  *         initialized, or 0 when no sockets have been passed.
137  */
138 static int
139 my_sd_listen_fds(void)
140 {
141         const char *e;
142         long count;
143
144         /* Check if LISTEN_PID exists; but we ignore the result, because
145          * normally ngircd forks a child before checking this, and therefore
146          * the PID set in the environment is always wrong ... */
147         e = getenv("LISTEN_PID");
148         if (!e || !*e)
149                 return 0;
150
151         e = getenv("LISTEN_FDS");
152         if (!e || !*e)
153                 return -1;
154         count = atol(e);
155         unsetenv("LISTEN_FDS");
156
157         return count;
158 }
159
160
161 /**
162  * IO callback for listening sockets: handle new connections. This callback
163  * gets called when a new non-SSL connection should be accepted.
164  *
165  * @param sock          Socket descriptor.
166  * @param irrelevant    (ignored IO specification)
167  */
168 static void
169 cb_listen(int sock, short irrelevant)
170 {
171         (void) irrelevant;
172         (void) New_Connection(sock, false);
173 }
174
175
176 #ifdef SSL_SUPPORT
177 /**
178  * IO callback for listening SSL sockets: handle new connections. This callback
179  * gets called when a new SSL-enabled connection should be accepted.
180  *
181  * @param sock          Socket descriptor.
182  * @param irrelevant    (ignored IO specification)
183  */
184 static void
185 cb_listen_ssl(int sock, short irrelevant)
186 {
187         int fd;
188
189         (void) irrelevant;
190         fd = New_Connection(sock, true);
191         if (fd < 0)
192                 return;
193         io_event_setcb(My_Connections[fd].sock, cb_clientserver_ssl);
194 }
195 #endif
196
197
198 /**
199  * IO callback for new outgoing non-SSL server connections.
200  *
201  * @param sock  Socket descriptor.
202  * @param what  IO specification (IO_WANTREAD/IO_WANTWRITE/...).
203  */
204 static void
205 cb_connserver(int sock, UNUSED short what)
206 {
207         int res, err, server;
208         socklen_t sock_len;
209         CONN_ID idx = Socket2Index( sock );
210
211         if (idx <= NONE) {
212                 LogDebug("cb_connserver wants to write on unknown socket?!");
213                 io_close(sock);
214                 return;
215         }
216
217         assert(what & IO_WANTWRITE);
218
219         /* Make sure that the server is still configured; it could have been
220          * removed in the meantime! */
221         server = Conf_GetServer(idx);
222         if (server < 0) {
223                 Log(LOG_ERR, "Connection on socket %d to \"%s\" aborted!",
224                     sock, My_Connections[idx].host);
225                 Conn_Close(idx, "Connection aborted!", NULL, false);
226                 return;
227         }
228
229         /* connect() finished, get result. */
230         sock_len = (socklen_t)sizeof(err);
231         res = getsockopt(My_Connections[idx].sock, SOL_SOCKET, SO_ERROR,
232                          &err, &sock_len );
233         assert(sock_len == sizeof(err));
234
235         /* Error while connecting? */
236         if ((res != 0) || (err != 0)) {
237                 if (res != 0)
238                         Log(LOG_CRIT, "getsockopt (connection %d): %s!",
239                             idx, strerror(errno));
240                 else
241                         Log(LOG_CRIT,
242                             "Can't connect socket to \"%s:%d\" (connection %d): %s!",
243                             My_Connections[idx].host, Conf_Server[server].port,
244                             idx, strerror(err));
245
246                 Conn_Close(idx, "Can't connect", NULL, false);
247
248                 if (ng_ipaddr_af(&Conf_Server[server].dst_addr[0])) {
249                         /* more addresses to try... */
250                         New_Server(server, &Conf_Server[server].dst_addr[0]);
251                         /* connection to dst_addr[0] is now in progress, so
252                          * remove this address... */
253                         Conf_Server[server].dst_addr[0] =
254                                 Conf_Server[server].dst_addr[1];
255                         memset(&Conf_Server[server].dst_addr[1], 0,
256                                sizeof(Conf_Server[server].dst_addr[1]));
257                 }
258                 return;
259         }
260
261         /* connect() succeeded, remove all additional addresses */
262         memset(&Conf_Server[server].dst_addr, 0,
263                sizeof(Conf_Server[server].dst_addr));
264
265         Conn_OPTION_DEL( &My_Connections[idx], CONN_ISCONNECTING );
266 #ifdef SSL_SUPPORT
267         if ( Conn_OPTION_ISSET( &My_Connections[idx], CONN_SSL_CONNECT )) {
268                 io_event_setcb( sock, cb_connserver_login_ssl );
269                 io_event_add( sock, IO_WANTWRITE|IO_WANTREAD );
270                 return;
271         }
272 #endif
273         server_login(idx);
274 }
275
276
277 /**
278  * Login to a remote server.
279  *
280  * @param idx   Connection index.
281  */
282 static void
283 server_login(CONN_ID idx)
284 {
285         Log(LOG_INFO,
286             "Connection %d (socket %d) with \"%s:%d\" established. Now logging in ...",
287             idx, My_Connections[idx].sock, My_Connections[idx].host,
288             Conf_Server[Conf_GetServer(idx)].port);
289
290         io_event_setcb( My_Connections[idx].sock, cb_clientserver);
291         io_event_add( My_Connections[idx].sock, IO_WANTREAD|IO_WANTWRITE);
292
293         /* Send PASS and SERVER command to peer */
294         Conn_WriteStr( idx, "PASS %s %s", Conf_Server[Conf_GetServer( idx )].pwd_out, NGIRCd_ProtoID );
295         Conn_WriteStr( idx, "SERVER %s :%s", Conf_ServerName, Conf_ServerInfo );
296 }
297
298
299 #ifdef SSL_SUPPORT
300 /**
301  * IO callback for new outgoing SSL-enabled server connections.
302  *
303  * @param sock          Socket descriptor.
304  * @param unused        (ignored IO specification)
305  */
306 static void
307 cb_connserver_login_ssl(int sock, short unused)
308 {
309         CONN_ID idx = Socket2Index(sock);
310
311         assert(idx >= 0);
312         if (idx < 0) {
313                 io_close(sock);
314                 return;
315         }
316         (void) unused;
317         switch (ConnSSL_Connect( &My_Connections[idx])) {
318         case 1: break;
319         case 0: LogDebug("ConnSSL_Connect: not ready");
320                 return;
321         case -1:
322                 Log(LOG_ERR, "SSL connection on socket %d failed!", sock);
323                 Conn_Close(idx, "Can't connect", NULL, false);
324                 return;
325         }
326
327         Log( LOG_INFO, "SSL connection %d with \"%s:%d\" established.", idx,
328                         My_Connections[idx].host, Conf_Server[Conf_GetServer( idx )].port );
329
330         server_login(idx);
331 }
332 #endif
333
334
335 /**
336  * IO callback for established non-SSL client and server connections.
337  *
338  * @param sock  Socket descriptor.
339  * @param what  IO specification (IO_WANTREAD/IO_WANTWRITE/...).
340  */
341 static void
342 cb_clientserver(int sock, short what)
343 {
344         CONN_ID idx = Socket2Index(sock);
345
346         assert(idx >= 0);
347
348         if (idx < 0) {
349                 io_close(sock);
350                 return;
351         }
352 #ifdef SSL_SUPPORT
353         if (what & IO_WANTREAD
354             || (Conn_OPTION_ISSET(&My_Connections[idx], CONN_SSL_WANT_WRITE))) {
355                 /* if TLS layer needs to write additional data, call
356                  * Read_Request() instead so that SSL/TLS can continue */
357                 Read_Request(idx);
358         }
359 #else
360         if (what & IO_WANTREAD)
361                 Read_Request(idx);
362 #endif
363         if (what & IO_WANTWRITE)
364                 Handle_Write(idx);
365 }
366
367
368 #ifdef SSL_SUPPORT
369 /**
370  * IO callback for established SSL-enabled client and server connections.
371  *
372  * @param sock  Socket descriptor.
373  * @param what  IO specification (IO_WANTREAD/IO_WANTWRITE/...).
374  */
375 static void
376 cb_clientserver_ssl(int sock, short what)
377 {
378         CONN_ID idx = Socket2Index(sock);
379
380         assert(idx >= 0);
381
382         if (idx < 0) {
383                 io_close(sock);
384                 return;
385         }
386
387         switch (ConnSSL_Accept(&My_Connections[idx])) {
388         case 1:
389                 break;  /* OK */
390         case 0:
391                 return; /* EAGAIN: callback will be invoked again by IO layer */
392         default:
393                 Conn_Close(idx, "SSL accept error, closing socket", "SSL accept error", false);
394                 return;
395         }
396         if (what & IO_WANTREAD)
397                 Read_Request(idx);
398
399         if (what & IO_WANTWRITE)
400                 Handle_Write(idx);
401
402         io_event_setcb(sock, cb_clientserver);  /* SSL handshake completed */
403 }
404 #endif
405
406
407 /**
408  * Initialize connecion module.
409  */
410 GLOBAL void
411 Conn_Init( void )
412 {
413         CONN_ID i;
414
415         /* Speicher fuer Verbindungs-Pool anfordern */
416         Pool_Size = CONNECTION_POOL;
417         if ((Conf_MaxConnections > 0) &&
418                 (Pool_Size > Conf_MaxConnections))
419                         Pool_Size = Conf_MaxConnections;
420
421         if (!array_alloc(&My_ConnArray, sizeof(CONNECTION), (size_t)Pool_Size)) {
422                 Log(LOG_EMERG, "Can't allocate memory! [Conn_Init]");
423                 exit(1);
424         }
425
426         /* FIXME: My_Connetions/Pool_Size is needed by other parts of the
427          * code; remove them! */
428         My_Connections = (CONNECTION*) array_start(&My_ConnArray);
429
430         LogDebug("Allocated connection pool for %d items (%ld bytes).",
431                 array_length(&My_ConnArray, sizeof(CONNECTION)),
432                 array_bytes(&My_ConnArray));
433
434         assert(array_length(&My_ConnArray, sizeof(CONNECTION)) >= (size_t)Pool_Size);
435         
436         array_free( &My_Listeners );
437
438         for (i = 0; i < Pool_Size; i++)
439                 Init_Conn_Struct(i);
440 } /* Conn_Init */
441
442
443 /**
444  * Clean up connection module.
445  */
446 GLOBAL void
447 Conn_Exit( void )
448 {
449         CONN_ID idx;
450
451         Conn_ExitListeners();
452
453         LogDebug("Shutting down all connections ..." );
454         for( idx = 0; idx < Pool_Size; idx++ ) {
455                 if( My_Connections[idx].sock > NONE ) {
456                         Conn_Close( idx, NULL, NGIRCd_SignalRestart ?
457                                 "Server going down (restarting)":"Server going down", true );
458                 }
459         }
460
461         array_free(&My_ConnArray);
462         My_Connections = NULL;
463         Pool_Size = 0;
464         io_library_shutdown();
465 } /* Conn_Exit */
466
467
468 /**
469  * Close all sockets (file descriptors) of open connections.
470  * This is useful in forked child processes, for example, to make sure that
471  * they don't hold connections open that the main process wants to close.
472  */
473 GLOBAL void
474 Conn_CloseAllSockets(int ExceptOf)
475 {
476         CONN_ID idx;
477
478         for(idx = 0; idx < Pool_Size; idx++) {
479                 if(My_Connections[idx].sock > NONE &&
480                    My_Connections[idx].sock != ExceptOf)
481                         close(My_Connections[idx].sock);
482         }
483 }
484
485
486 /**
487  * Initialize listening ports.
488  *
489  * @param a             Array containing the ports the daemon should listen on.
490  * @param listen_addr   Address the socket should listen on (can be "0.0.0.0").
491  * @param func          IO callback function to register.
492  * @returns             Number of listening sockets created.
493  */
494 static unsigned int
495 Init_Listeners(array *a, const char *listen_addr, void (*func)(int,short))
496 {
497         unsigned int created = 0;
498         size_t len;
499         int fd;
500         UINT16 *port;
501
502         len = array_length(a, sizeof (UINT16));
503         port = array_start(a);
504         while (len--) {
505                 fd = NewListener(listen_addr, *port);
506                 if (fd < 0) {
507                         port++;
508                         continue;
509                 }
510                 if (!io_event_create( fd, IO_WANTREAD, func )) {
511                         Log(LOG_ERR,
512                             "io_event_create(): Can't add fd %d (port %u): %s!",
513                             fd, (unsigned int) *port, strerror(errno));
514                         close(fd);
515                         port++;
516                         continue;
517                 }
518                 created++;
519                 port++;
520         }
521         return created;
522 }
523
524
525 /**
526  * Initialize all listening sockets.
527  *
528  * @returns     Number of created listening sockets
529  */
530 GLOBAL unsigned int
531 Conn_InitListeners( void )
532 {
533         /* Initialize ports on which the server should accept connections */
534         unsigned int created = 0;
535         char *copy, *listen_addr;
536         int count, fd, i;
537
538         assert(Conf_ListenAddress);
539
540         count = my_sd_listen_fds();
541         if (count < 0) {
542                 Log(LOG_INFO,
543                     "Not re-initializing listening sockets of systemd(8) ...");
544                 return 0;
545         }
546         if (count > 0) {
547                 /* systemd(8) passed sockets to us, so don't try to initialize
548                  * listening sockets on our own but use the passed ones */
549                 LogDebug("Initializing %d systemd sockets ...", count);
550                 for (i = 0; i < count; i++) {
551                         fd = SD_LISTEN_FDS_START + i;
552                         Init_Socket(fd);
553                         if (!io_event_create(fd, IO_WANTREAD, cb_listen)) {
554                                 Log(LOG_ERR,
555                                     "io_event_create(): Can't add fd %d: %s!",
556                                     fd, strerror(errno));
557                                 continue;
558                         }
559                         Log(LOG_INFO,
560                             "Initialized socket %d from systemd.", fd);
561                         created++;
562                 }
563                 return created;
564         }
565
566         /* not using systemd socket activation, initialize listening sockets: */
567
568         /* can't use Conf_ListenAddress directly, see below */
569         copy = strdup(Conf_ListenAddress);
570         if (!copy) {
571                 Log(LOG_CRIT, "Cannot copy %s: %s", Conf_ListenAddress,
572                     strerror(errno));
573                 return 0;
574         }
575         listen_addr = strtok(copy, ",");
576
577         while (listen_addr) {
578                 ngt_TrimStr(listen_addr);
579                 if (*listen_addr) {
580                         created += Init_Listeners(&Conf_ListenPorts,
581                                                   listen_addr, cb_listen);
582 #ifdef SSL_SUPPORT
583                         created += Init_Listeners(&Conf_SSLOptions.ListenPorts,
584                                                   listen_addr, cb_listen_ssl);
585 #endif
586                 }
587
588                 listen_addr = strtok(NULL, ",");
589         }
590
591         /* Can't free() Conf_ListenAddress here: on REHASH, if the config file
592          * cannot be re-loaded, we'd end up with a NULL Conf_ListenAddress.
593          * Instead, free() takes place in conf.c, before the config file
594          * is being parsed. */
595         free(copy);
596
597         return created;
598 } /* Conn_InitListeners */
599
600
601 /**
602  * Shut down all listening sockets.
603  */
604 GLOBAL void
605 Conn_ExitListeners( void )
606 {
607         /* Close down all listening sockets */
608         int *fd;
609         size_t arraylen;
610
611         /* Get number of listening sockets to shut down. There can be none
612          * if ngIRCd has been "socket activated" by systemd. */
613         arraylen = array_length(&My_Listeners, sizeof (int));
614         if (arraylen < 1)
615                 return;
616
617         Log(LOG_INFO,
618             "Shutting down all listening sockets (%d total) ...", arraylen);
619         fd = array_start(&My_Listeners);
620         while(arraylen--) {
621                 assert(fd != NULL);
622                 assert(*fd >= 0);
623                 io_close(*fd);
624                 LogDebug("Listening socket %d closed.", *fd );
625                 fd++;
626         }
627         array_free(&My_Listeners);
628 } /* Conn_ExitListeners */
629
630
631 /**
632  * Bind a socket to a specific (source) address.
633  *
634  * @param addr                  Address structure.
635  * @param listen_addrstr        Source address as string.
636  * @param Port                  Port number.
637  * @returns                     true on success, false otherwise.
638  */
639 static bool
640 InitSinaddrListenAddr(ng_ipaddr_t *addr, const char *listen_addrstr, UINT16 Port)
641 {
642         bool ret;
643
644         ret = ng_ipaddr_init(addr, listen_addrstr, Port);
645         if (!ret) {
646                 assert(listen_addrstr);
647                 Log(LOG_CRIT, "Can't bind to [%s]:%u: can't convert ip address \"%s\"!",
648                                                 listen_addrstr, Port, listen_addrstr);
649         }
650         return ret;
651 }
652
653
654 /**
655  * Set a socket to "IPv6 only". If the given socket doesn't belong to the
656  * AF_INET6 family, or the operating system doesn't support this functionality,
657  * this function retruns silently.
658  *
659  * @param af    Address family of the socket.
660  * @param sock  Socket handle.
661  */
662 static void
663 set_v6_only(int af, int sock)
664 {
665 #if defined(IPV6_V6ONLY) && defined(WANT_IPV6)
666         int on = 1;
667
668         if (af != AF_INET6)
669                 return;
670
671         if (setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, &on, (socklen_t)sizeof(on)))
672                 Log(LOG_ERR, "Could not set IPV6_V6ONLY: %s", strerror(errno));
673 #else
674         (void)af;
675         (void)sock;
676 #endif
677 }
678
679
680 /**
681  * Initialize new listening port.
682  *
683  * @param listen_addr   Local address to bind the socet to (can be 0.0.0.0).
684  * @param Port          Port number on which the new socket should be listening.
685  * @returns             file descriptor of the socket or -1 on failure.
686  */
687 static int
688 NewListener(const char *listen_addr, UINT16 Port)
689 {
690         /* Create new listening socket on specified port */
691         ng_ipaddr_t addr;
692         int sock, af;
693
694         if (!InitSinaddrListenAddr(&addr, listen_addr, Port))
695                 return -1;
696
697         af = ng_ipaddr_af(&addr);
698         sock = socket(af, SOCK_STREAM, 0);
699         if (sock < 0) {
700                 Log(LOG_CRIT, "Can't create socket (af %d) : %s!", af,
701                     strerror(errno));
702                 return -1;
703         }
704
705         set_v6_only(af, sock);
706
707         if (!Init_Socket(sock))
708                 return -1;
709
710         if (bind(sock, (struct sockaddr *)&addr, ng_ipaddr_salen(&addr)) != 0) {
711                 Log(LOG_CRIT, "Can't bind socket to address %s:%d - %s!",
712                     ng_ipaddr_tostr(&addr), Port, strerror(errno));
713                 close(sock);
714                 return -1;
715         }
716
717         if (listen(sock, 10) != 0) {
718                 Log(LOG_CRIT, "Can't listen on socket: %s!", strerror(errno));
719                 close(sock);
720                 return -1;
721         }
722
723         /* keep fd in list so we can close it when ngircd restarts/shuts down */
724         if (!array_catb(&My_Listeners, (char *)&sock, sizeof(int))) {
725                 Log(LOG_CRIT, "Can't add socket to My_Listeners array: %s!",
726                     strerror(errno));
727                 close(sock);
728                 return -1;
729         }
730
731         Log(LOG_INFO, "Now listening on [%s]:%d (socket %d).",
732             ng_ipaddr_tostr(&addr), Port, sock);
733         return sock;
734 } /* NewListener */
735
736
737 #ifdef SSL_SUPPORT
738
739 /**
740  * Check if SSL library needs to read SSL-protocol related data.
741  *
742  * SSL/TLS connections require extra treatment:
743  * When either CONN_SSL_WANT_WRITE or CONN_SSL_WANT_READ is set, we
744  * need to take care of that first, before checking read/write buffers.
745  * For instance, while we might have data in our write buffer, the
746  * TLS/SSL protocol might need to read internal data first for TLS/SSL
747  * writes to succeed.
748  *
749  * If this function returns true, such a condition is met and we have
750  * to reverse the condition (check for read even if we've data to write,
751  * do not check for read but writeability even if write-buffer is empty).
752  *
753  * @param c     Connection to check.
754  * @returns     true if SSL-library has to read protocol data.
755  */
756 static bool
757 SSL_WantRead(const CONNECTION *c)
758 {
759         if (Conn_OPTION_ISSET(c, CONN_SSL_WANT_READ)) {
760                 io_event_add(c->sock, IO_WANTREAD);
761                 return true;
762         }
763         return false;
764 }
765
766 /**
767  * Check if SSL library needs to write SSL-protocol related data.
768  *
769  * Please see description of SSL_WantRead() for full description!
770  *
771  * @param c     Connection to check.
772  * @returns     true if SSL-library has to write protocol data.
773  */
774 static bool
775 SSL_WantWrite(const CONNECTION *c)
776 {
777         if (Conn_OPTION_ISSET(c, CONN_SSL_WANT_WRITE)) {
778                 io_event_add(c->sock, IO_WANTWRITE);
779                 return true;
780         }
781         return false;
782 }
783
784 #else
785
786 static inline bool
787 SSL_WantRead(UNUSED const CONNECTION *c)
788 { return false; }
789
790 static inline bool
791 SSL_WantWrite(UNUSED const CONNECTION *c)
792 { return false; }
793
794 #endif
795
796
797 /**
798  * "Main Loop": Loop until shutdown or restart is signalled.
799  *
800  * This function loops until a shutdown or restart of ngIRCd is signalled and
801  * calls io_dispatch() to check for readable and writable sockets every second.
802  * It checks for status changes on pending connections (e. g. when a hostname
803  * has been resolved), checks for "penalties" and timeouts, and handles the
804  * input buffers.
805  */
806 GLOBAL void
807 Conn_Handler(void)
808 {
809         int i;
810         unsigned int wdatalen, bytes_processed;
811         struct timeval tv;
812         time_t t;
813
814         while (!NGIRCd_SignalQuit && !NGIRCd_SignalRestart) {
815                 t = time(NULL);
816
817                 /* Check configured servers and established links */
818                 Check_Servers();
819                 Check_Connections();
820
821                 /* Expire outdated class/list items */
822                 Class_Expire();
823
824                 /* Look for non-empty read buffers ... */
825                 for (i = 0; i < Pool_Size; i++) {
826                         if ((My_Connections[i].sock > NONE)
827                             && (array_bytes(&My_Connections[i].rbuf) > 0)
828                             && (My_Connections[i].delaytime <= t)) {
829                                 /* ... and try to handle the received data */
830                                 bytes_processed = Handle_Buffer(i);
831                                 /* if we processed data, and there might be
832                                  * more commands in the input buffer, do not
833                                  * try to read any more data now */
834                                 if (bytes_processed &&
835                                     array_bytes(&My_Connections[i].rbuf) > 2) {
836                                         LogDebug
837                                             ("Throttling connection %d: command limit reached!",
838                                              i);
839                                         Conn_SetPenalty(i, 1);
840                                 }
841                         }
842                 }
843
844                 /* Look for non-empty write buffers ... */
845                 for (i = 0; i < Pool_Size; i++) {
846                         if (My_Connections[i].sock <= NONE)
847                                 continue;
848
849                         wdatalen = (unsigned int)array_bytes(&My_Connections[i].wbuf);
850 #ifdef ZLIB
851                         if (wdatalen > 0 ||
852                             array_bytes(&My_Connections[i].zip.wbuf) > 0)
853 #else
854                         if (wdatalen > 0)
855 #endif
856                         {
857                                 if (SSL_WantRead(&My_Connections[i]))
858                                         continue;
859                                 io_event_add(My_Connections[i].sock,
860                                              IO_WANTWRITE);
861                         }
862                 }
863
864                 /* Check from which sockets we possibly could read ... */
865                 for (i = 0; i < Pool_Size; i++) {
866                         if (My_Connections[i].sock <= NONE)
867                                 continue;
868 #ifdef SSL_SUPPORT
869                         if (SSL_WantWrite(&My_Connections[i]))
870                                 continue; /* TLS/SSL layer needs to write data; deal with this first */
871 #endif
872                         if (Proc_InProgress(&My_Connections[i].proc_stat)) {
873                                 /* Wait for completion of forked subprocess
874                                  * and ignore the socket in the meantime ... */
875                                 io_event_del(My_Connections[i].sock,
876                                              IO_WANTREAD);
877                                 continue;
878                         }
879
880                         if (Conn_OPTION_ISSET(&My_Connections[i], CONN_ISCONNECTING))
881                                 /* Wait for completion of connect() ... */
882                                 continue;
883
884                         if (My_Connections[i].delaytime > t) {
885                                 /* There is a "penalty time" set: ignore socket! */
886                                 io_event_del(My_Connections[i].sock,
887                                              IO_WANTREAD);
888                                 continue;
889                         }
890
891                         io_event_add(My_Connections[i].sock, IO_WANTREAD);
892                 }
893
894                 /* Set the timeout for reading from the network to 1 second,
895                  * which is the granularity with witch we handle "penalty
896                  * times" for example.
897                  * Note: tv_sec/usec are undefined(!) after io_dispatch()
898                  * returns, so we have to set it beforce each call to it! */
899                 tv.tv_usec = 0;
900                 tv.tv_sec = 1;
901
902                 /* Wait for activity ... */
903                 i = io_dispatch(&tv);
904                 if (i == -1 && errno != EINTR) {
905                         Log(LOG_EMERG, "Conn_Handler(): io_dispatch(): %s!",
906                             strerror(errno));
907                         Log(LOG_ALERT, "%s exiting due to fatal errors!",
908                             PACKAGE_NAME);
909                         exit(1);
910                 }
911
912                 /* Should ngIRCd timeout when idle? */
913                 if (Conf_IdleTimeout > 0 && NumConnectionsAccepted > 0
914                     && idle_t > 0 && time(NULL) - idle_t >= Conf_IdleTimeout) {
915                         LogDebug("Server idle timeout reached: %d second%s. Initiating shutdown ...",
916                                  Conf_IdleTimeout,
917                                  Conf_IdleTimeout == 1 ? "" : "s");
918                         NGIRCd_SignalQuit = true;
919                 }
920         }
921
922         if (NGIRCd_SignalQuit)
923                 Log(LOG_NOTICE | LOG_snotice, "Server going down NOW!");
924         else if (NGIRCd_SignalRestart)
925                 Log(LOG_NOTICE | LOG_snotice, "Server restarting NOW!");
926 } /* Conn_Handler */
927
928
929 /**
930  * Write a text string into the socket of a connection.
931  *
932  * This function automatically appends CR+LF to the string and validates that
933  * the result is a valid IRC message (oversized messages are shortened, for
934  * example). Then it calls the Conn_Write() function to do the actual sending.
935  *
936  * @param Idx           Index fo the connection.
937  * @param Format        Format string, see printf().
938  * @returns             true on success, false otherwise.
939  */
940 #ifdef PROTOTYPES
941 GLOBAL bool
942 Conn_WriteStr(CONN_ID Idx, const char *Format, ...)
943 #else
944 GLOBAL bool 
945 Conn_WriteStr(Idx, Format, va_alist)
946 CONN_ID Idx;
947 const char *Format;
948 va_dcl
949 #endif
950 {
951         char buffer[COMMAND_LEN];
952 #ifdef ICONV
953         char *ptr, *message;
954 #endif
955         size_t len;
956         bool ok;
957         va_list ap;
958
959         assert( Idx > NONE );
960         assert( Format != NULL );
961
962 #ifdef PROTOTYPES
963         va_start( ap, Format );
964 #else
965         va_start( ap );
966 #endif
967         if (vsnprintf( buffer, COMMAND_LEN - 2, Format, ap ) >= COMMAND_LEN - 2 ) {
968                 /*
969                  * The string that should be written to the socket is longer
970                  * than the allowed size of COMMAND_LEN bytes (including both
971                  * the CR and LF characters). This can be caused by the
972                  * IRC_WriteXXX() functions when the prefix of this server had
973                  * to be added to an already "quite long" command line which
974                  * has been received from a regular IRC client, for example.
975                  * 
976                  * We are not allowed to send such "oversized" messages to
977                  * other servers and clients, see RFC 2812 2.3 and 2813 3.3
978                  * ("these messages SHALL NOT exceed 512 characters in length,
979                  * counting all characters including the trailing CR-LF").
980                  *
981                  * So we have a big problem here: we should send more bytes
982                  * to the network than we are allowed to and we don't know
983                  * the originator (any more). The "old" behaviour of blaming
984                  * the receiver ("next hop") is a bad idea (it could be just
985                  * an other server only routing the message!), so the only
986                  * option left is to shorten the string and to hope that the
987                  * result is still somewhat useful ...
988                  *                                                   -alex-
989                  */
990
991                 strcpy (buffer + sizeof(buffer) - strlen(CUT_TXTSUFFIX) - 2 - 1,
992                         CUT_TXTSUFFIX);
993         }
994
995 #ifdef ICONV
996         ptr = strchr(buffer + 1, ':');
997         if (ptr) {
998                 ptr++;
999                 message = Conn_EncodingTo(Idx, ptr);
1000                 if (message != ptr)
1001                         strlcpy(ptr, message, sizeof(buffer) - (ptr - buffer));
1002         }
1003 #endif
1004
1005 #ifdef SNIFFER
1006         if (NGIRCd_Sniffer)
1007                 Log(LOG_DEBUG, " -> connection %d: '%s'.", Idx, buffer);
1008 #endif
1009
1010         len = strlcat( buffer, "\r\n", sizeof( buffer ));
1011         ok = Conn_Write(Idx, buffer, len);
1012         My_Connections[Idx].msg_out++;
1013
1014         va_end( ap );
1015         return ok;
1016 } /* Conn_WriteStr */
1017
1018 GLOBAL char*
1019 Conn_Password( CONN_ID Idx )
1020 {
1021         assert( Idx > NONE );
1022         if (My_Connections[Idx].pwd == NULL)
1023                 return (char*)"\0";
1024         else
1025                 return My_Connections[Idx].pwd;
1026 } /* Conn_Password */
1027
1028 GLOBAL void
1029 Conn_SetPassword( CONN_ID Idx, const char *Pwd )
1030 {
1031         assert( Idx > NONE );
1032
1033         if (My_Connections[Idx].pwd)
1034                 free(My_Connections[Idx].pwd);
1035
1036         My_Connections[Idx].pwd = strdup(Pwd);
1037         if (My_Connections[Idx].pwd == NULL) {
1038                 Log(LOG_EMERG, "Can't allocate memory! [Conn_SetPassword]");
1039                 exit(1);
1040         }
1041 } /* Conn_SetPassword */
1042
1043 /**
1044  * Append Data to the outbound write buffer of a connection.
1045  *
1046  * @param Idx   Index of the connection.
1047  * @param Data  pointer to the data.
1048  * @param Len   length of Data.
1049  * @returns     true on success, false otherwise.
1050  */
1051 static bool
1052 Conn_Write( CONN_ID Idx, char *Data, size_t Len )
1053 {
1054         CLIENT *c;
1055         size_t writebuf_limit = WRITEBUFFER_MAX_LEN;
1056         assert( Idx > NONE );
1057         assert( Data != NULL );
1058         assert( Len > 0 );
1059
1060         /* Is the socket still open? A previous call to Conn_Write()
1061          * may have closed the connection due to a fatal error.
1062          * In this case it is sufficient to return an error, as well. */
1063         if (My_Connections[Idx].sock <= NONE) {
1064                 LogDebug("Skipped write on closed socket (connection %d).", Idx);
1065                 return false;
1066         }
1067
1068         /* Make sure that there still exists a CLIENT structure associated
1069          * with this connection and check if this is a server or not: */
1070         c = Conn_GetClient(Idx);
1071         if (c) {
1072                 /* Servers do get special write buffer limits, so they can
1073                  * generate all the messages that are required while peering. */
1074                 if (Client_Type(c) == CLIENT_SERVER)
1075                         writebuf_limit = WRITEBUFFER_SLINK_LEN;
1076         } else
1077                 LogDebug("Write on socket without client (connection %d)!?", Idx);
1078
1079 #ifdef ZLIB
1080         if ( Conn_OPTION_ISSET( &My_Connections[Idx], CONN_ZIP )) {
1081                 /* Compressed link:
1082                  * Zip_Buffer() does all the dirty work for us: it flushes
1083                  * the (pre-)compression buffers if required and handles
1084                  * all error conditions. */
1085                 if (!Zip_Buffer(Idx, Data, Len))
1086                         return false;
1087         }
1088         else
1089 #endif
1090         {
1091                 /* Uncompressed link:
1092                  * Check if outbound buffer has enough space for the data. */
1093                 if (array_bytes(&My_Connections[Idx].wbuf) + Len >=
1094                     WRITEBUFFER_FLUSH_LEN) {
1095                         /* Buffer is full, flush it. Handle_Write deals with
1096                          * low-level errors, if any. */
1097                         if (!Handle_Write(Idx))
1098                                 return false;
1099                 }
1100
1101                 /* When the write buffer is still too big after flushing it,
1102                  * the connection will be killed. */
1103                 if (array_bytes(&My_Connections[Idx].wbuf) + Len >=
1104                     writebuf_limit) {
1105                         Log(LOG_NOTICE,
1106                             "Write buffer space exhausted (connection %d, limit is %lu bytes, %lu bytes new, %lu bytes pending)",
1107                             Idx, writebuf_limit, Len,
1108                             (unsigned long)array_bytes(&My_Connections[Idx].wbuf));
1109                         Conn_Close(Idx, "Write buffer space exhausted", NULL, false);
1110                         return false;
1111                 }
1112
1113                 /* Copy data to write buffer */
1114                 if (!array_catb(&My_Connections[Idx].wbuf, Data, Len))
1115                         return false;
1116
1117                 My_Connections[Idx].bytes_out += Len;
1118         }
1119
1120         /* Adjust global write counter */
1121         WCounter += Len;
1122
1123         return true;
1124 } /* Conn_Write */
1125
1126
1127 /**
1128  * Shut down a connection.
1129  *
1130  * @param Idx           Connection index.
1131  * @param LogMsg        Message to write to the log or NULL. If no LogMsg
1132  *                      is given, the FwdMsg is logged.
1133  * @param FwdMsg        Message to forward to remote servers.
1134  * @param InformClient  If true, inform the client on the connection which is
1135  *                      to be shut down of the reason (FwdMsg) and send
1136  *                      connection statistics before disconnecting it.
1137  */
1138 GLOBAL void
1139 Conn_Close( CONN_ID Idx, const char *LogMsg, const char *FwdMsg, bool InformClient )
1140 {
1141         /* Close connection. Open pipes of asynchronous resolver
1142          * sub-processes are closed down. */
1143
1144         CLIENT *c;
1145         double in_k, out_k;
1146         UINT16 port;
1147 #ifdef ZLIB
1148         double in_z_k, out_z_k;
1149         int in_p, out_p;
1150 #endif
1151
1152         assert( Idx > NONE );
1153
1154         /* Is this link already shutting down? */
1155         if( Conn_OPTION_ISSET( &My_Connections[Idx], CONN_ISCLOSING )) {
1156                 /* Conn_Close() has been called recursively for this link;
1157                  * probabe reason: Handle_Write() failed  -- see below. */
1158                 LogDebug("Recursive request to close connection: %d", Idx );
1159                 return;
1160         }
1161
1162         assert( My_Connections[Idx].sock > NONE );
1163
1164         /* Mark link as "closing" */
1165         Conn_OPTION_ADD( &My_Connections[Idx], CONN_ISCLOSING );
1166
1167         port = ng_ipaddr_getport(&My_Connections[Idx].addr);
1168         Log(LOG_INFO, "Shutting down connection %d (%s) with \"%s:%d\" ...", Idx,
1169             LogMsg ? LogMsg : FwdMsg, My_Connections[Idx].host, port);
1170
1171         /* Search client, if any */
1172         c = Conn_GetClient( Idx );
1173
1174         /* Should the client be informed? */
1175         if (InformClient) {
1176 #ifndef STRICT_RFC
1177                 /* Send statistics to client if registered as user: */
1178                 if ((c != NULL) && (Client_Type(c) == CLIENT_USER)) {
1179                         Conn_WriteStr( Idx,
1180                          ":%s NOTICE %s :%sConnection statistics: client %.1f kb, server %.1f kb.",
1181                          Client_ID(Client_ThisServer()), Client_ID(c),
1182                          NOTICE_TXTPREFIX,
1183                          (double)My_Connections[Idx].bytes_in / 1024,
1184                          (double)My_Connections[Idx].bytes_out / 1024);
1185                 }
1186 #endif
1187                 /* Send ERROR to client (see RFC 2812, section 3.1.7) */
1188                 if (FwdMsg)
1189                         Conn_WriteStr(Idx, "ERROR :%s", FwdMsg);
1190                 else
1191                         Conn_WriteStr(Idx, "ERROR :Closing connection");
1192         }
1193
1194         /* Try to write out the write buffer. Note: Handle_Write() eventually
1195          * removes the CLIENT structure associated with this connection if an
1196          * error occurs! So we have to re-check if there is still an valid
1197          * CLIENT structure after calling Handle_Write() ...*/
1198         (void)Handle_Write( Idx );
1199
1200         /* Search client, if any (re-check!) */
1201         c = Conn_GetClient( Idx );
1202 #ifdef SSL_SUPPORT
1203         if ( Conn_OPTION_ISSET( &My_Connections[Idx], CONN_SSL )) {
1204                 Log(LOG_INFO, "SSL connection %d shutting down ...", Idx);
1205                 ConnSSL_Free(&My_Connections[Idx]);
1206         }
1207 #endif
1208         /* Shut down socket */
1209         if (! io_close(My_Connections[Idx].sock)) {
1210                 /* Oops, we can't close the socket!? This is ... ugly! */
1211                 Log(LOG_CRIT,
1212                     "Error closing connection %d (socket %d) with %s:%d - %s! (ignored)",
1213                     Idx, My_Connections[Idx].sock, My_Connections[Idx].host,
1214                     port, strerror(errno));
1215         }
1216
1217         /* Mark socket as invalid: */
1218         My_Connections[Idx].sock = NONE;
1219
1220         /* If there is still a client, unregister it now */
1221         if (c)
1222                 Client_Destroy(c, LogMsg, FwdMsg, true);
1223
1224         /* Calculate statistics and log information */
1225         in_k = (double)My_Connections[Idx].bytes_in / 1024;
1226         out_k = (double)My_Connections[Idx].bytes_out / 1024;
1227 #ifdef ZLIB
1228         if (Conn_OPTION_ISSET( &My_Connections[Idx], CONN_ZIP)) {
1229                 in_z_k = (double)My_Connections[Idx].zip.bytes_in / 1024;
1230                 out_z_k = (double)My_Connections[Idx].zip.bytes_out / 1024;
1231                 /* Make sure that no division by zero can occur during
1232                  * the calculation of in_p and out_p: in_z_k and out_z_k
1233                  * are non-zero, that's guaranteed by the protocol until
1234                  * compression can be enabled. */
1235                 if (! in_z_k)
1236                         in_z_k = in_k;
1237                 if (! out_z_k)
1238                         out_z_k = out_k;
1239                 in_p = (int)(( in_k * 100 ) / in_z_k );
1240                 out_p = (int)(( out_k * 100 ) / out_z_k );
1241                 Log(LOG_INFO,
1242                     "Connection %d with \"%s:%d\" closed (in: %.1fk/%.1fk/%d%%, out: %.1fk/%.1fk/%d%%).",
1243                     Idx, My_Connections[Idx].host, port,
1244                     in_k, in_z_k, in_p, out_k, out_z_k, out_p);
1245         }
1246         else
1247 #endif
1248         {
1249                 Log(LOG_INFO,
1250                     "Connection %d with \"%s:%d\" closed (in: %.1fk, out: %.1fk).",
1251                     Idx, My_Connections[Idx].host, port,
1252                     in_k, out_k);
1253         }
1254
1255         /* Servers: Modify time of next connect attempt? */
1256         Conf_UnsetServer( Idx );
1257
1258 #ifdef ZLIB
1259         /* Clean up zlib, if link was compressed */
1260         if ( Conn_OPTION_ISSET( &My_Connections[Idx], CONN_ZIP )) {
1261                 inflateEnd( &My_Connections[Idx].zip.in );
1262                 deflateEnd( &My_Connections[Idx].zip.out );
1263                 array_free(&My_Connections[Idx].zip.rbuf);
1264                 array_free(&My_Connections[Idx].zip.wbuf);
1265         }
1266 #endif
1267
1268         array_free(&My_Connections[Idx].rbuf);
1269         array_free(&My_Connections[Idx].wbuf);
1270         if (My_Connections[Idx].pwd != NULL)
1271                 free(My_Connections[Idx].pwd);
1272
1273         /* Clean up connection structure (=free it) */
1274         Init_Conn_Struct( Idx );
1275
1276         assert(NumConnections > 0);
1277         if (NumConnections)
1278                 NumConnections--;
1279         LogDebug("Shutdown of connection %d completed, %ld connection%s left.",
1280                  Idx, NumConnections, NumConnections != 1 ? "s" : "");
1281
1282         idle_t = NumConnections > 0 ? 0 : time(NULL);
1283 } /* Conn_Close */
1284
1285
1286 /**
1287  * Get current number of connections.
1288  *
1289  * @returns     Number of current connections.
1290  */
1291 GLOBAL long
1292 Conn_Count(void)
1293 {
1294         return NumConnections;
1295 } /* Conn_Count */
1296
1297
1298 /**
1299  * Get number of maximum simultaneous connections.
1300  *
1301  * @returns     Number of maximum simultaneous connections.
1302  */
1303 GLOBAL long
1304 Conn_CountMax(void)
1305 {
1306         return NumConnectionsMax;
1307 } /* Conn_CountMax */
1308
1309
1310 /**
1311  * Get number of connections accepted since the daemon startet.
1312  *
1313  * @returns     Number of connections accepted.
1314  */
1315 GLOBAL long
1316 Conn_CountAccepted(void)
1317 {
1318         return NumConnectionsAccepted;
1319 } /* Conn_CountAccepted */
1320
1321
1322 /**
1323  * Synchronize established connections and configured server structures
1324  * after a configuration update and store the correct connection IDs, if any.
1325  */
1326 GLOBAL void
1327 Conn_SyncServerStruct(void)
1328 {
1329         CLIENT *client;
1330         CONN_ID i;
1331         int c;
1332
1333         for (i = 0; i < Pool_Size; i++) {
1334                 if (My_Connections[i].sock == NONE)
1335                         continue;
1336
1337                 /* Server link? */
1338                 client = Conn_GetClient(i);
1339                 if (!client || Client_Type(client) != CLIENT_SERVER)
1340                         continue;
1341
1342                 for (c = 0; c < MAX_SERVERS; c++) {
1343                         /* Configured server? */
1344                         if (!Conf_Server[c].host[0])
1345                                 continue;
1346
1347                         if (strcasecmp(Conf_Server[c].name, Client_ID(client)) == 0)
1348                                 Conf_Server[c].conn_id = i;
1349                 }
1350         }
1351 } /* SyncServerStruct */
1352
1353
1354 /**
1355  * Get IP address string of a connection.
1356  *
1357  * @param Idx Connection index.
1358  * @return Pointer to a global buffer containing the IP address as string.
1359  */
1360 GLOBAL const char *
1361 Conn_GetIPAInfo(CONN_ID Idx)
1362 {
1363         assert(Idx > NONE);
1364         return ng_ipaddr_tostr(&My_Connections[Idx].addr);
1365 }
1366
1367
1368 /**
1369  * Send out data of write buffer; connect new sockets.
1370  *
1371  * @param Idx   Connection index.
1372  * @returns     true on success, false otherwise.
1373  */
1374 static bool
1375 Handle_Write( CONN_ID Idx )
1376 {
1377         ssize_t len;
1378         size_t wdatalen;
1379
1380         assert( Idx > NONE );
1381         if ( My_Connections[Idx].sock < 0 ) {
1382                 LogDebug("Handle_Write() on closed socket, connection %d", Idx);
1383                 return false;
1384         }
1385         assert( My_Connections[Idx].sock > NONE );
1386
1387         wdatalen = array_bytes(&My_Connections[Idx].wbuf );
1388
1389 #ifdef ZLIB
1390         if (wdatalen == 0) {
1391                 /* Write buffer is empty, so we try to flush the compression
1392                  * buffer and get some data to work with from there :-) */
1393                 if (!Zip_Flush(Idx))
1394                         return false;
1395
1396                 /* Now the write buffer most probably has changed: */
1397                 wdatalen = array_bytes(&My_Connections[Idx].wbuf);
1398         }
1399 #endif
1400
1401         if (wdatalen == 0) {
1402                 /* Still no data, fine. */
1403                 io_event_del(My_Connections[Idx].sock, IO_WANTWRITE );
1404                 return true;
1405         }
1406
1407 #ifdef DEBUG_BUFFER
1408         LogDebug
1409             ("Handle_Write() called for connection %d, %ld bytes pending ...",
1410              Idx, wdatalen);
1411 #endif
1412
1413 #ifdef SSL_SUPPORT
1414         if ( Conn_OPTION_ISSET( &My_Connections[Idx], CONN_SSL )) {
1415                 len = ConnSSL_Write(&My_Connections[Idx], array_start(&My_Connections[Idx].wbuf), wdatalen);
1416         } else
1417 #endif
1418         {
1419                 len = write(My_Connections[Idx].sock,
1420                             array_start(&My_Connections[Idx].wbuf), wdatalen );
1421         }
1422         if( len < 0 ) {
1423                 if (errno == EAGAIN || errno == EINTR)
1424                         return true;
1425
1426                 Log(LOG_ERR, "Write error on connection %d (socket %d): %s!",
1427                     Idx, My_Connections[Idx].sock, strerror(errno));
1428                 Conn_Close(Idx, "Write error!", NULL, false);
1429                 return false;
1430         }
1431
1432         /* move any data not yet written to beginning */
1433         array_moveleft(&My_Connections[Idx].wbuf, 1, (size_t)len);
1434
1435         return true;
1436 } /* Handle_Write */
1437
1438
1439 /**
1440  * Count established connections to a specific IP address.
1441  *
1442  * @returns     Number of established connections.
1443  */
1444 static int
1445 Count_Connections(ng_ipaddr_t *a)
1446 {
1447         int i, cnt;
1448
1449         cnt = 0;
1450         for (i = 0; i < Pool_Size; i++) {
1451                 if (My_Connections[i].sock <= NONE)
1452                         continue;
1453                 if (ng_ipaddr_ipequal(&My_Connections[i].addr, a))
1454                         cnt++;
1455         }
1456         return cnt;
1457 } /* Count_Connections */
1458
1459
1460 /**
1461  * Initialize new client connection on a listening socket.
1462  *
1463  * @param Sock  Listening socket descriptor.
1464  * @param IsSSL true if this socket expects SSL-encrypted data.
1465  * @returns     Accepted socket descriptor or -1 on error.
1466  */
1467 static int
1468 New_Connection(int Sock, UNUSED bool IsSSL)
1469 {
1470 #ifdef TCPWRAP
1471         struct request_info req;
1472 #endif
1473         ng_ipaddr_t new_addr;
1474         char ip_str[NG_INET_ADDRSTRLEN];
1475         int new_sock, new_sock_len;
1476         CLIENT *c;
1477         long cnt;
1478
1479         assert(Sock > NONE);
1480
1481         LogDebug("Accepting new connection on socket %d ...", Sock);
1482
1483         new_sock_len = (int)sizeof(new_addr);
1484         new_sock = accept(Sock, (struct sockaddr *)&new_addr,
1485                           (socklen_t *)&new_sock_len);
1486         if (new_sock < 0) {
1487                 Log(LOG_CRIT, "Can't accept connection: %s!", strerror(errno));
1488                 return -1;
1489         }
1490         NumConnectionsAccepted++;
1491
1492         if (!ng_ipaddr_tostr_r(&new_addr, ip_str)) {
1493                 Log(LOG_CRIT, "fd %d: Can't convert IP address!", new_sock);
1494                 Simple_Message(new_sock, "ERROR :Internal Server Error");
1495                 close(new_sock);
1496                 return -1;
1497         }
1498
1499 #ifdef TCPWRAP
1500         /* Validate socket using TCP Wrappers */
1501         request_init(&req, RQ_DAEMON, PACKAGE_NAME, RQ_FILE, new_sock,
1502                      RQ_CLIENT_SIN, &new_addr, NULL);
1503         fromhost(&req);
1504         if (!hosts_access(&req)) {
1505                 Log(deny_severity,
1506                     "Refused connection from %s (by TCP Wrappers)!", ip_str);
1507                 Simple_Message(new_sock, "ERROR :Connection refused");
1508                 close(new_sock);
1509                 return -1;
1510         }
1511 #endif
1512
1513         if (!Init_Socket(new_sock))
1514                 return -1;
1515
1516         /* Check global connection limit */
1517         if ((Conf_MaxConnections > 0) &&
1518             (NumConnections >= (size_t) Conf_MaxConnections)) {
1519                 Log(LOG_ALERT, "Can't accept connection: limit (%d) reached!",
1520                     Conf_MaxConnections);
1521                 Simple_Message(new_sock, "ERROR :Connection limit reached");
1522                 close(new_sock);
1523                 return -1;
1524         }
1525
1526         /* Check IP-based connection limit */
1527         cnt = Count_Connections(&new_addr);
1528         if ((Conf_MaxConnectionsIP > 0) && (cnt >= Conf_MaxConnectionsIP)) {
1529                 /* Access denied, too many connections from this IP address! */
1530                 Log(LOG_ERR,
1531                     "Refused connection from %s: too may connections (%ld) from this IP address!",
1532                     ip_str, cnt);
1533                 Simple_Message(new_sock,
1534                                "ERROR :Connection refused, too many connections from your IP address");
1535                 close(new_sock);
1536                 return -1;
1537         }
1538
1539         if (new_sock >= Pool_Size) {
1540                 if (!array_alloc(&My_ConnArray, sizeof(CONNECTION),
1541                                  (size_t) new_sock)) {
1542                         Log(LOG_EMERG,
1543                             "Can't allocate memory! [New_Connection]");
1544                         Simple_Message(new_sock, "ERROR: Internal error");
1545                         close(new_sock);
1546                         return -1;
1547                 }
1548                 LogDebug("Bumped connection pool to %ld items (internal: %ld items, %ld bytes)",
1549                          new_sock, array_length(&My_ConnArray,
1550                          sizeof(CONNECTION)), array_bytes(&My_ConnArray));
1551
1552                 /* Adjust pointer to new block */
1553                 My_Connections = array_start(&My_ConnArray);
1554                 while (Pool_Size <= new_sock)
1555                         Init_Conn_Struct(Pool_Size++);
1556         }
1557
1558         /* register callback */
1559         if (!io_event_create(new_sock, IO_WANTREAD, cb_clientserver)) {
1560                 Log(LOG_ALERT,
1561                     "Can't accept connection: io_event_create failed!");
1562                 Simple_Message(new_sock, "ERROR :Internal error");
1563                 close(new_sock);
1564                 return -1;
1565         }
1566
1567         c = Client_NewLocal(new_sock, NULL, CLIENT_UNKNOWN, false);
1568         if (!c) {
1569                 Log(LOG_ALERT,
1570                     "Can't accept connection: can't create client structure!");
1571                 Simple_Message(new_sock, "ERROR :Internal error");
1572                 io_close(new_sock);
1573                 return -1;
1574         }
1575
1576         Init_Conn_Struct(new_sock);
1577         My_Connections[new_sock].sock = new_sock;
1578         My_Connections[new_sock].addr = new_addr;
1579         My_Connections[new_sock].client = c;
1580
1581         /* Set initial hostname to IP address. This becomes overwritten when
1582          * the DNS lookup is enabled and succeeds, but is used otherwise. */
1583         if (ng_ipaddr_af(&new_addr) != AF_INET)
1584                 snprintf(My_Connections[new_sock].host,
1585                          sizeof(My_Connections[new_sock].host), "[%s]", ip_str);
1586         else
1587                 strlcpy(My_Connections[new_sock].host, ip_str,
1588                         sizeof(My_Connections[new_sock].host));
1589
1590         Client_SetHostname(c, My_Connections[new_sock].host);
1591
1592         Log(LOG_INFO, "Accepted connection %d from \"%s:%d\" on socket %d.",
1593             new_sock, My_Connections[new_sock].host,
1594             ng_ipaddr_getport(&new_addr), Sock);
1595         Account_Connection();
1596
1597 #ifdef SSL_SUPPORT
1598         /* Delay connection initalization until SSL handshake is finished */
1599         if (!IsSSL)
1600 #endif
1601                 Conn_StartLogin(new_sock);
1602
1603         return new_sock;
1604 } /* New_Connection */
1605
1606
1607 /**
1608  * Finish connection initialization, start resolver subprocess.
1609  *
1610  * @param Idx Connection index.
1611  */
1612 GLOBAL void
1613 Conn_StartLogin(CONN_ID Idx)
1614 {
1615         int ident_sock = -1;
1616
1617         assert(Idx >= 0);
1618
1619         /* Nothing to do if DNS (and resolver subprocess) is disabled */
1620         if (!Conf_DNS)
1621                 return;
1622
1623 #ifdef IDENTAUTH
1624         /* Should we make an IDENT request? */
1625         if (Conf_Ident)
1626                 ident_sock = My_Connections[Idx].sock;
1627 #endif
1628
1629         if (Conf_NoticeAuth) {
1630                 /* Send "NOTICE AUTH" messages to the client */
1631 #ifdef IDENTAUTH
1632                 if (Conf_Ident)
1633                         (void)Conn_WriteStr(Idx,
1634                                 "NOTICE AUTH :*** Looking up your hostname and checking ident");
1635                 else
1636 #endif
1637                         (void)Conn_WriteStr(Idx,
1638                                 "NOTICE AUTH :*** Looking up your hostname");
1639                 (void)Handle_Write(Idx);
1640         }
1641
1642         Resolve_Addr(&My_Connections[Idx].proc_stat, &My_Connections[Idx].addr,
1643                      ident_sock, cb_Read_Resolver_Result);
1644 }
1645
1646
1647 /**
1648  * Update global connection counters.
1649  */
1650 static void
1651 Account_Connection(void)
1652 {
1653         NumConnections++;
1654         idle_t = 0;
1655         if (NumConnections > NumConnectionsMax)
1656                 NumConnectionsMax = NumConnections;
1657         LogDebug("Total number of connections now %lu (max %lu).",
1658                  NumConnections, NumConnectionsMax);
1659 } /* Account_Connection */
1660
1661
1662 /**
1663  * Translate socket handle into connection index.
1664  *
1665  * @param Sock  Socket handle.
1666  * @returns     Connecion index or NONE, if no connection could be found.
1667  */
1668 static CONN_ID
1669 Socket2Index( int Sock )
1670 {
1671         assert( Sock >= 0 );
1672
1673         if( Sock >= Pool_Size || My_Connections[Sock].sock != Sock ) {
1674                 /* the Connection was already closed again, likely due to
1675                  * an error. */
1676                 LogDebug("Socket2Index: can't get connection for socket %d!", Sock);
1677                 return NONE;
1678         }
1679         return Sock;
1680 } /* Socket2Index */
1681
1682
1683 /**
1684  * Read data from the network to the read buffer. If an error occures,
1685  * the socket of this connection will be shut down.
1686  *
1687  * @param Idx   Connection index.
1688  */
1689 static void
1690 Read_Request( CONN_ID Idx )
1691 {
1692         ssize_t len;
1693         static const unsigned int maxbps = COMMAND_LEN / 2;
1694         char readbuf[READBUFFER_LEN];
1695         time_t t;
1696         CLIENT *c;
1697         assert( Idx > NONE );
1698         assert( My_Connections[Idx].sock > NONE );
1699
1700 #ifdef ZLIB
1701         if ((array_bytes(&My_Connections[Idx].rbuf) >= READBUFFER_LEN) ||
1702                 (array_bytes(&My_Connections[Idx].zip.rbuf) >= READBUFFER_LEN))
1703 #else
1704         if (array_bytes(&My_Connections[Idx].rbuf) >= READBUFFER_LEN)
1705 #endif
1706         {
1707                 /* Read buffer is full */
1708                 Log(LOG_ERR,
1709                     "Receive buffer space exhausted (connection %d): %d bytes",
1710                     Idx, array_bytes(&My_Connections[Idx].rbuf));
1711                 Conn_Close(Idx, "Receive buffer space exhausted", NULL, false);
1712                 return;
1713         }
1714
1715 #ifdef SSL_SUPPORT
1716         if (Conn_OPTION_ISSET(&My_Connections[Idx], CONN_SSL))
1717                 len = ConnSSL_Read( &My_Connections[Idx], readbuf, sizeof(readbuf));
1718         else
1719 #endif
1720         len = read(My_Connections[Idx].sock, readbuf, sizeof(readbuf));
1721         if (len == 0) {
1722                 LogDebug("Client \"%s:%u\" is closing connection %d ...",
1723                          My_Connections[Idx].host,
1724                          ng_ipaddr_tostr(&My_Connections[Idx].addr), Idx);
1725                 Conn_Close(Idx, NULL, "Client closed connection", false);
1726                 return;
1727         }
1728
1729         if (len < 0) {
1730                 if( errno == EAGAIN ) return;
1731                 Log(LOG_ERR, "Read error on connection %d (socket %d): %s!",
1732                     Idx, My_Connections[Idx].sock, strerror(errno));
1733                 Conn_Close(Idx, "Read error", "Client closed connection",
1734                            false);
1735                 return;
1736         }
1737 #ifdef ZLIB
1738         if (Conn_OPTION_ISSET(&My_Connections[Idx], CONN_ZIP)) {
1739                 if (!array_catb(&My_Connections[Idx].zip.rbuf, readbuf,
1740                                 (size_t) len)) {
1741                         Log(LOG_ERR,
1742                             "Could not append received data to zip input buffer (connection %d): %d bytes!",
1743                             Idx, len);
1744                         Conn_Close(Idx, "Receive buffer space exhausted", NULL,
1745                                    false);
1746                         return;
1747                 }
1748         } else
1749 #endif
1750         {
1751                 if (!array_catb( &My_Connections[Idx].rbuf, readbuf, len)) {
1752                         Log(LOG_ERR,
1753                             "Could not append received data to input buffer (connection %d): %d bytes!",
1754                             Idx, len);
1755                         Conn_Close(Idx, "Receive buffer space exhausted", NULL, false );
1756                 }
1757         }
1758
1759         /* Update connection statistics */
1760         My_Connections[Idx].bytes_in += len;
1761         My_Connections[Idx].bps += Handle_Buffer(Idx);
1762
1763         /* Make sure that there is still a valid client registered */
1764         c = Conn_GetClient(Idx);
1765         if (!c)
1766                 return;
1767
1768         /* Update timestamp of last data received if this connection is
1769          * registered as a user, server or service connection. Don't update
1770          * otherwise, so users have at least Conf_PongTimeout seconds time to
1771          * register with the IRC server -- see Check_Connections().
1772          * Update "lastping", too, if time shifted backwards ... */
1773         if (Client_Type(c) == CLIENT_USER
1774             || Client_Type(c) == CLIENT_SERVER
1775             || Client_Type(c) == CLIENT_SERVICE) {
1776                 t = time(NULL);
1777                 if (My_Connections[Idx].lastdata != t)
1778                         My_Connections[Idx].bps = 0;
1779
1780                 My_Connections[Idx].lastdata = t;
1781                 if (My_Connections[Idx].lastping > t)
1782                         My_Connections[Idx].lastping = t;
1783         }
1784
1785         /* Look at the data in the (read-) buffer of this connection */
1786         if (Client_Type(c) != CLIENT_SERVER
1787             && Client_Type(c) != CLIENT_UNKNOWNSERVER
1788             && Client_Type(c) != CLIENT_SERVICE
1789             && My_Connections[Idx].bps >= maxbps) {
1790                 LogDebug("Throttling connection %d: BPS exceeded! (%u >= %u)",
1791                          Idx, My_Connections[Idx].bps, maxbps);
1792                 Conn_SetPenalty(Idx, 1);
1793         }
1794 } /* Read_Request */
1795
1796
1797 /**
1798  * Handle all data in the connection read-buffer.
1799  *
1800  * Data is processed until no complete command is left in the read buffer,
1801  * or MAX_COMMANDS[_SERVER|_SERVICE] commands were processed.
1802  * When a fatal error occurs, the connection is shut down.
1803  *
1804  * @param Idx   Index of the connection.
1805  * @returns     Number of bytes processed.
1806  */
1807 static unsigned int
1808 Handle_Buffer(CONN_ID Idx)
1809 {
1810 #ifndef STRICT_RFC
1811         char *ptr1, *ptr2, *first_eol;
1812 #endif
1813         char *ptr;
1814         size_t len, delta;
1815         time_t starttime;
1816 #ifdef ZLIB
1817         bool old_z;
1818 #endif
1819         unsigned int i, maxcmd = MAX_COMMANDS, len_processed = 0;
1820         CLIENT *c;
1821
1822         c = Conn_GetClient(Idx);
1823         starttime = time(NULL);
1824
1825         assert(c != NULL);
1826
1827         /* Servers get special command limits that depend on the user count */
1828         switch (Client_Type(c)) {
1829             case CLIENT_SERVER:
1830                 maxcmd = (int)(Client_UserCount() / 5)
1831                        + MAX_COMMANDS_SERVER_MIN;
1832                 /* Allow servers to handle even more commands while peering
1833                  * to speed up server login and network synchronisation. */
1834                 if (Conn_LastPing(Idx) == 0)
1835                         maxcmd *= 5;
1836                 break;
1837             case CLIENT_SERVICE:
1838                 maxcmd = MAX_COMMANDS_SERVICE; break;
1839         }
1840
1841         for (i=0; i < maxcmd; i++) {
1842                 /* Check penalty */
1843                 if (My_Connections[Idx].delaytime > starttime)
1844                         return 0;
1845 #ifdef ZLIB
1846                 /* Unpack compressed data, if compression is in use */
1847                 if (Conn_OPTION_ISSET(&My_Connections[Idx], CONN_ZIP)) {
1848                         /* When unzipping fails, Unzip_Buffer() shuts
1849                          * down the connection itself */
1850                         if (!Unzip_Buffer(Idx))
1851                                 return 0;
1852                 }
1853 #endif
1854
1855                 if (0 == array_bytes(&My_Connections[Idx].rbuf))
1856                         break;
1857
1858                 /* Make sure that the buffer is NULL terminated */
1859                 if (!array_cat0_temporary(&My_Connections[Idx].rbuf)) {
1860                         Conn_Close(Idx, NULL,
1861                                    "Can't allocate memory [Handle_Buffer]",
1862                                    true);
1863                         return 0;
1864                 }
1865
1866                 /* RFC 2812, section "2.3 Messages", 5th paragraph:
1867                  * "IRC messages are always lines of characters terminated
1868                  * with a CR-LF (Carriage Return - Line Feed) pair [...]". */
1869                 delta = 2;
1870                 ptr = strstr(array_start(&My_Connections[Idx].rbuf), "\r\n");
1871
1872 #ifndef STRICT_RFC
1873                 /* Check for non-RFC-compliant request (only CR or LF)?
1874                  * Unfortunately, there are quite a few clients out there
1875                  * that do this -- e. g. mIRC, BitchX, and Trillian :-( */
1876                 ptr1 = strchr(array_start(&My_Connections[Idx].rbuf), '\r');
1877                 ptr2 = strchr(array_start(&My_Connections[Idx].rbuf), '\n');
1878                 if (ptr) {
1879                         /* Check if there is a single CR or LF _before_ the
1880                          * corerct CR+LF line terminator:  */
1881                         first_eol = ptr1 < ptr2 ? ptr1 : ptr2;
1882                         if (first_eol < ptr) {
1883                                 /* Single CR or LF before CR+LF found */
1884                                 ptr = first_eol;
1885                                 delta = 1;
1886                         }
1887                 } else if (ptr1 || ptr2) {
1888                         /* No CR+LF terminated command found, but single
1889                          * CR or LF found ... */
1890                         if (ptr1 && ptr2)
1891                                 ptr = ptr1 < ptr2 ? ptr1 : ptr2;
1892                         else
1893                                 ptr = ptr1 ? ptr1 : ptr2;
1894                         delta = 1;
1895                 }
1896 #endif
1897
1898                 if (!ptr)
1899                         break;
1900
1901                 /* Complete (=line terminated) request found, handle it! */
1902                 *ptr = '\0';
1903
1904                 len = ptr - (char *)array_start(&My_Connections[Idx].rbuf) + delta;
1905
1906                 if (len > (COMMAND_LEN - 1)) {
1907                         /* Request must not exceed 512 chars (incl. CR+LF!),
1908                          * see RFC 2812. Disconnect Client if this happens. */
1909                         Log(LOG_ERR,
1910                             "Request too long (connection %d): %d bytes (max. %d expected)!",
1911                             Idx, array_bytes(&My_Connections[Idx].rbuf),
1912                             COMMAND_LEN - 1);
1913                         Conn_Close(Idx, NULL, "Request too long", true);
1914                         return 0;
1915                 }
1916
1917                 len_processed += (unsigned int)len;
1918                 if (len <= delta) {
1919                         /* Request is empty (only '\r\n', '\r' or '\n');
1920                          * delta is 2 ('\r\n') or 1 ('\r' or '\n'), see above */
1921                         array_moveleft(&My_Connections[Idx].rbuf, 1, len);
1922                         continue;
1923                 }
1924 #ifdef ZLIB
1925                 /* remember if stream is already compressed */
1926                 old_z = My_Connections[Idx].options & CONN_ZIP;
1927 #endif
1928
1929                 My_Connections[Idx].msg_in++;
1930                 if (!Parse_Request
1931                     (Idx, (char *)array_start(&My_Connections[Idx].rbuf)))
1932                         return 0; /* error -> connection has been closed */
1933
1934                 array_moveleft(&My_Connections[Idx].rbuf, 1, len);
1935 #ifdef DEBUG_BUFFER
1936                 LogDebug("Connection %d: %d bytes left in read buffer.",
1937                          Idx, array_bytes(&My_Connections[Idx].rbuf));
1938 #endif
1939 #ifdef ZLIB
1940                 if ((!old_z) && (My_Connections[Idx].options & CONN_ZIP) &&
1941                     (array_bytes(&My_Connections[Idx].rbuf) > 0)) {
1942                         /* The last command activated socket compression.
1943                          * Data that was read after that needs to be copied
1944                          * to the unzip buffer for decompression: */
1945                         if (!array_copy
1946                             (&My_Connections[Idx].zip.rbuf,
1947                              &My_Connections[Idx].rbuf)) {
1948                                 Conn_Close(Idx, NULL,
1949                                            "Can't allocate memory [Handle_Buffer]",
1950                                            true);
1951                                 return 0;
1952                         }
1953
1954                         array_trunc(&My_Connections[Idx].rbuf);
1955                         LogDebug
1956                             ("Moved already received data (%u bytes) to uncompression buffer.",
1957                              array_bytes(&My_Connections[Idx].zip.rbuf));
1958                 }
1959 #endif
1960         }
1961         return len_processed;
1962 } /* Handle_Buffer */
1963
1964
1965 /**
1966  * Check whether established connections are still alive or not.
1967  * If not, play PING-PONG first; and if that doesn't help either,
1968  * disconnect the respective peer.
1969  */
1970 static void
1971 Check_Connections(void)
1972 {
1973         CLIENT *c;
1974         CONN_ID i;
1975         char msg[64];
1976
1977         for (i = 0; i < Pool_Size; i++) {
1978                 if (My_Connections[i].sock < 0)
1979                         continue;
1980
1981                 c = Conn_GetClient(i);
1982                 if (c && ((Client_Type(c) == CLIENT_USER)
1983                           || (Client_Type(c) == CLIENT_SERVER)
1984                           || (Client_Type(c) == CLIENT_SERVICE))) {
1985                         /* connected User, Server or Service */
1986                         if (My_Connections[i].lastping >
1987                             My_Connections[i].lastdata) {
1988                                 /* We already sent a ping */
1989                                 if (My_Connections[i].lastping <
1990                                     time(NULL) - Conf_PongTimeout) {
1991                                         /* Timeout */
1992                                         snprintf(msg, sizeof(msg),
1993                                                  "Ping timeout: %d seconds",
1994                                                  Conf_PongTimeout);
1995                                         LogDebug("Connection %d: %s.", i, msg);
1996                                         Conn_Close(i, NULL, msg, true);
1997                                 }
1998                         } else if (My_Connections[i].lastdata <
1999                                    time(NULL) - Conf_PingTimeout) {
2000                                 /* We need to send a PING ... */
2001                                 LogDebug("Connection %d: sending PING ...", i);
2002                                 Conn_UpdatePing(i);
2003                                 Conn_WriteStr(i, "PING :%s",
2004                                               Client_ID(Client_ThisServer()));
2005                         }
2006                 } else {
2007                         /* The connection is not fully established yet, so
2008                          * we don't do the PING-PONG game here but instead
2009                          * disconnect the client after "a short time" if it's
2010                          * still not registered. */
2011
2012                         if (My_Connections[i].lastdata <
2013                             time(NULL) - Conf_PongTimeout) {
2014                                 LogDebug
2015                                     ("Unregistered connection %d timed out ...",
2016                                      i);
2017                                 Conn_Close(i, NULL, "Timeout", false);
2018                         }
2019                 }
2020         }
2021 } /* Check_Connections */
2022
2023
2024 /**
2025  * Check if further server links should be established.
2026  */
2027 static void
2028 Check_Servers(void)
2029 {
2030         int i, n;
2031         time_t time_now;
2032
2033         time_now = time(NULL);
2034
2035         /* Check all configured servers */
2036         for (i = 0; i < MAX_SERVERS; i++) {
2037                 if (Conf_Server[i].conn_id != NONE)
2038                         continue;       /* Already establishing or connected */
2039                 if (!Conf_Server[i].host[0] || !Conf_Server[i].port > 0)
2040                         continue;       /* No host and/or port configured */
2041                 if (Conf_Server[i].flags & CONF_SFLAG_DISABLED)
2042                         continue;       /* Disabled configuration entry */
2043                 if (Conf_Server[i].lasttry > (time_now - Conf_ConnectRetry))
2044                         continue;       /* We have to wait a little bit ... */
2045
2046                 /* Is there already a connection in this group? */
2047                 if (Conf_Server[i].group > NONE) {
2048                         for (n = 0; n < MAX_SERVERS; n++) {
2049                                 if (n == i)
2050                                         continue;
2051                                 if ((Conf_Server[n].conn_id != NONE) &&
2052                                     (Conf_Server[n].group == Conf_Server[i].group))
2053                                         break;
2054                         }
2055                         if (n < MAX_SERVERS)
2056                                 continue;
2057                 }
2058
2059                 /* Okay, try to connect now */
2060                 Log(LOG_NOTICE,
2061                     "Preparing to establish a new server link for \"%s\" ...",
2062                     Conf_Server[i].name);
2063                 Conf_Server[i].lasttry = time_now;
2064                 Conf_Server[i].conn_id = SERVER_WAIT;
2065                 assert(Proc_GetPipeFd(&Conf_Server[i].res_stat) < 0);
2066                 Resolve_Name(&Conf_Server[i].res_stat, Conf_Server[i].host,
2067                              cb_Connect_to_Server);
2068         }
2069 } /* Check_Servers */
2070
2071
2072 /**
2073  * Establish a new outgoing server connection.
2074  *
2075  * @param Server        Configuration index of the server.
2076  * @param dest          Destination IP address to connect to.
2077  */
2078 static void
2079 New_Server( int Server , ng_ipaddr_t *dest)
2080 {
2081         /* Establish new server link */
2082         char ip_str[NG_INET_ADDRSTRLEN];
2083         int af_dest, res, new_sock;
2084         CLIENT *c;
2085
2086         assert( Server > NONE );
2087
2088         /* Make sure that the remote server hasn't re-linked to this server
2089          * asynchronously on its own */
2090         if (Conf_Server[Server].conn_id > NONE) {
2091                 Log(LOG_INFO,
2092                         "Connection to \"%s\" meanwhile re-established, aborting preparation.");
2093                 return;
2094         }
2095
2096         if (!ng_ipaddr_tostr_r(dest, ip_str)) {
2097                 Log(LOG_WARNING, "New_Server: Could not convert IP to string");
2098                 return;
2099         }
2100
2101         af_dest = ng_ipaddr_af(dest);
2102         new_sock = socket(af_dest, SOCK_STREAM, 0);
2103
2104         Log(LOG_INFO,
2105             "Establishing connection for \"%s\" to \"%s:%d\" (%s), socket %d ...",
2106             Conf_Server[Server].name, Conf_Server[Server].host,
2107             Conf_Server[Server].port, ip_str, new_sock);
2108
2109         if (new_sock < 0) {
2110                 Log(LOG_CRIT, "Can't create socket (af %d): %s!",
2111                     af_dest, strerror(errno));
2112                 return;
2113         }
2114
2115         if (!Init_Socket(new_sock))
2116                 return;
2117
2118         /* is a bind address configured? */
2119         res = ng_ipaddr_af(&Conf_Server[Server].bind_addr);
2120         /* if yes, bind now. If it fails, warn and let connect() pick a source address */
2121         if (res && bind(new_sock, (struct sockaddr *) &Conf_Server[Server].bind_addr,
2122                                 ng_ipaddr_salen(&Conf_Server[Server].bind_addr)))
2123         {
2124                 ng_ipaddr_tostr_r(&Conf_Server[Server].bind_addr, ip_str);
2125                 Log(LOG_WARNING, "Can't bind socket to %s: %s!", ip_str, strerror(errno));
2126         }
2127         ng_ipaddr_setport(dest, Conf_Server[Server].port);
2128         res = connect(new_sock, (struct sockaddr *) dest, ng_ipaddr_salen(dest));
2129         if(( res != 0 ) && ( errno != EINPROGRESS )) {
2130                 Log( LOG_CRIT, "Can't connect socket: %s!", strerror( errno ));
2131                 close( new_sock );
2132                 return;
2133         }
2134
2135         if (!array_alloc(&My_ConnArray, sizeof(CONNECTION), (size_t)new_sock)) {
2136                 Log(LOG_ALERT,
2137                     "Cannot allocate memory for server connection (socket %d)",
2138                     new_sock);
2139                 close( new_sock );
2140                 return;
2141         }
2142
2143         if (!io_event_create( new_sock, IO_WANTWRITE, cb_connserver)) {
2144                 Log(LOG_ALERT, "io_event_create(): could not add fd %d", strerror(errno));
2145                 close(new_sock);
2146                 return;
2147         }
2148
2149         My_Connections = array_start(&My_ConnArray);
2150
2151         assert(My_Connections[new_sock].sock <= 0);
2152
2153         Init_Conn_Struct(new_sock);
2154
2155         ng_ipaddr_tostr_r(dest, ip_str);
2156         c = Client_NewLocal(new_sock, ip_str, CLIENT_UNKNOWNSERVER, false);
2157         if (!c) {
2158                 Log( LOG_ALERT, "Can't establish connection: can't create client structure!" );
2159                 io_close(new_sock);
2160                 return;
2161         }
2162
2163         /* Conn_Close() decrements this counter again */
2164         Account_Connection();
2165         Client_SetIntroducer( c, c );
2166         Client_SetToken( c, TOKEN_OUTBOUND );
2167
2168         /* Register connection */
2169         if (!Conf_SetServer(Server, new_sock))
2170                 return;
2171         My_Connections[new_sock].sock = new_sock;
2172         My_Connections[new_sock].addr = *dest;
2173         My_Connections[new_sock].client = c;
2174         strlcpy( My_Connections[new_sock].host, Conf_Server[Server].host,
2175                                 sizeof(My_Connections[new_sock].host ));
2176
2177 #ifdef SSL_SUPPORT
2178         if (Conf_Server[Server].SSLConnect && !ConnSSL_PrepareConnect( &My_Connections[new_sock],
2179                                                                 &Conf_Server[Server] ))
2180         {
2181                 Log(LOG_ALERT, "Could not initialize SSL for outgoing connection");
2182                 Conn_Close( new_sock, "Could not initialize SSL for outgoing connection", NULL, false );
2183                 Init_Conn_Struct( new_sock );
2184                 Conf_Server[Server].conn_id = NONE;
2185                 return;
2186         }
2187 #endif
2188         LogDebug("Registered new connection %d on socket %d (%ld in total).",
2189                  new_sock, My_Connections[new_sock].sock, NumConnections);
2190         Conn_OPTION_ADD( &My_Connections[new_sock], CONN_ISCONNECTING );
2191 } /* New_Server */
2192
2193
2194 /**
2195  * Initialize connection structure.
2196  *
2197  * @param Idx   Connection index.
2198  */
2199 static void
2200 Init_Conn_Struct(CONN_ID Idx)
2201 {
2202         time_t now = time(NULL);
2203
2204         memset(&My_Connections[Idx], 0, sizeof(CONNECTION));
2205         My_Connections[Idx].sock = -1;
2206         My_Connections[Idx].signon = now;
2207         My_Connections[Idx].lastdata = now;
2208         My_Connections[Idx].lastprivmsg = now;
2209         Proc_InitStruct(&My_Connections[Idx].proc_stat);
2210
2211 #ifdef ICONV
2212         My_Connections[Idx].iconv_from = (iconv_t)(-1);
2213         My_Connections[Idx].iconv_to = (iconv_t)(-1);
2214 #endif
2215 } /* Init_Conn_Struct */
2216
2217
2218 /**
2219  * Initialize options of a new socket.
2220  *
2221  * For example, we try to set socket options SO_REUSEADDR and IPTOS_LOWDELAY.
2222  * The socket is automatically closed if a fatal error is encountered.
2223  *
2224  * @param Sock  Socket handle.
2225  * @returns false if socket was closed due to fatal error.
2226  */
2227 static bool
2228 Init_Socket( int Sock )
2229 {
2230         int value;
2231
2232         if (!io_setnonblock(Sock)) {
2233                 Log( LOG_CRIT, "Can't enable non-blocking mode for socket: %s!", strerror( errno ));
2234                 close( Sock );
2235                 return false;
2236         }
2237
2238         /* Don't block this port after socket shutdown */
2239         value = 1;
2240         if( setsockopt( Sock, SOL_SOCKET, SO_REUSEADDR, &value, (socklen_t)sizeof( value )) != 0 )
2241         {
2242                 Log( LOG_ERR, "Can't set socket option SO_REUSEADDR: %s!", strerror( errno ));
2243                 /* ignore this error */
2244         }
2245
2246         /* Set type of service (TOS) */
2247 #if defined(IPPROTO_IP) && defined(IPTOS_LOWDELAY)
2248         value = IPTOS_LOWDELAY;
2249         if (setsockopt(Sock, IPPROTO_IP, IP_TOS, &value,
2250                        (socklen_t) sizeof(value))) {
2251                 LogDebug("Can't set socket option IP_TOS: %s!",
2252                          strerror(errno));
2253                 /* ignore this error */
2254         } else
2255                 LogDebug("IP_TOS on socket %d has been set to IPTOS_LOWDELAY.",
2256                          Sock);
2257 #endif
2258
2259         return true;
2260 } /* Init_Socket */
2261
2262
2263 /**
2264  * Read results of a resolver sub-process and try to initiate a new server
2265  * connection.
2266  *
2267  * @param fd            File descriptor of the pipe to the sub-process.
2268  * @param events        (ignored IO specification)
2269  */
2270 static void
2271 cb_Connect_to_Server(int fd, UNUSED short events)
2272 {
2273         /* Read result of resolver sub-process from pipe and start connection */
2274         int i;
2275         size_t len;
2276         ng_ipaddr_t dest_addrs[4];      /* we can handle at most 3; but we read up to
2277                                            four so we can log the 'more than we can handle'
2278                                            condition. First result is tried immediately, rest
2279                                            is saved for later if needed. */
2280
2281         LogDebug("Resolver: Got forward lookup callback on fd %d, events %d", fd, events);
2282
2283         for (i=0; i < MAX_SERVERS; i++) {
2284                   if (Proc_GetPipeFd(&Conf_Server[i].res_stat) == fd )
2285                           break;
2286         }
2287
2288         if( i >= MAX_SERVERS) {
2289                 /* Ops, no matching server found?! */
2290                 io_close( fd );
2291                 LogDebug("Resolver: Got Forward Lookup callback for unknown server!?");
2292                 return;
2293         }
2294
2295         /* Read result from pipe */
2296         len = Proc_Read(&Conf_Server[i].res_stat, dest_addrs, sizeof(dest_addrs));
2297         Proc_Close(&Conf_Server[i].res_stat);
2298         if (len == 0) {
2299                 /* Error resolving hostname: reset server structure */
2300                 Conf_Server[i].conn_id = NONE;
2301                 return;
2302         }
2303
2304         assert((len % sizeof(ng_ipaddr_t)) == 0);
2305
2306         LogDebug("Got result from resolver: %u structs (%u bytes).", len/sizeof(ng_ipaddr_t), len);
2307
2308         memset(&Conf_Server[i].dst_addr, 0, sizeof(Conf_Server[i].dst_addr));
2309         if (len > sizeof(ng_ipaddr_t)) {
2310                 /* more than one address for this hostname, remember them
2311                  * in case first address is unreachable/not available */
2312                 len -= sizeof(ng_ipaddr_t);
2313                 if (len > sizeof(Conf_Server[i].dst_addr)) {
2314                         len = sizeof(Conf_Server[i].dst_addr);
2315                         Log(LOG_NOTICE,
2316                                 "Notice: Resolver returned more IP Addresses for host than we can handle, additional addresses dropped.");
2317                 }
2318                 memcpy(&Conf_Server[i].dst_addr, &dest_addrs[1], len);
2319         }
2320         /* connect() */
2321         New_Server(i, dest_addrs);
2322 } /* cb_Read_Forward_Lookup */
2323
2324
2325 /**
2326  * Read results of a resolver sub-process from the pipe and update the
2327  * apropriate connection/client structure(s): hostname and/or IDENT user name.
2328  *
2329  * @param r_fd          File descriptor of the pipe to the sub-process.
2330  * @param events        (ignored IO specification)
2331  */
2332 static void
2333 cb_Read_Resolver_Result( int r_fd, UNUSED short events )
2334 {
2335         CLIENT *c;
2336         CONN_ID i;
2337         size_t len;
2338         char *identptr;
2339 #ifdef IDENTAUTH
2340         char readbuf[HOST_LEN + 2 + CLIENT_USER_LEN];
2341         char *ptr;
2342 #else
2343         char readbuf[HOST_LEN + 1];
2344 #endif
2345
2346         LogDebug("Resolver: Got callback on fd %d, events %d", r_fd, events );
2347         i = Conn_GetFromProc(r_fd);
2348         if (i == NONE) {
2349                 /* Ops, none found? Probably the connection has already
2350                  * been closed!? We'll ignore that ... */
2351                 io_close( r_fd );
2352                 LogDebug("Resolver: Got callback for unknown connection!?");
2353                 return;
2354         }
2355
2356         /* Read result from pipe */
2357         len = Proc_Read(&My_Connections[i].proc_stat, readbuf, sizeof readbuf -1);
2358         Proc_Close(&My_Connections[i].proc_stat);
2359         if (len == 0)
2360                 return;
2361
2362         readbuf[len] = '\0';
2363         identptr = strchr(readbuf, '\n');
2364         assert(identptr != NULL);
2365         if (!identptr) {
2366                 Log( LOG_CRIT, "Resolver: Got malformed result!");
2367                 return;
2368         }
2369
2370         *identptr = '\0';
2371         LogDebug("Got result from resolver: \"%s\" (%u bytes read).", readbuf, len);
2372         /* Okay, we got a complete result: this is a host name for outgoing
2373          * connections and a host name and IDENT user name (if enabled) for
2374          * incoming connections.*/
2375         assert ( My_Connections[i].sock >= 0 );
2376         /* Incoming connection. Search client ... */
2377         c = Conn_GetClient( i );
2378         assert( c != NULL );
2379
2380         /* Only update client information of unregistered clients.
2381          * Note: user commands (e. g. WEBIRC) are always read _after_ reading
2382          * the resolver results, so we don't have to worry to override settings
2383          * from these commands here. */
2384         if(Client_Type(c) == CLIENT_UNKNOWN) {
2385                 strlcpy(My_Connections[i].host, readbuf,
2386                         sizeof(My_Connections[i].host));
2387                 Client_SetHostname(c, readbuf);
2388                 if (Conf_NoticeAuth)
2389                         (void)Conn_WriteStr(i,
2390                                         "NOTICE AUTH :*** Found your hostname: %s",
2391                                         My_Connections[i].host);
2392 #ifdef IDENTAUTH
2393                 ++identptr;
2394                 if (*identptr) {
2395                         ptr = identptr;
2396                         while (*ptr) {
2397                                 if ((*ptr < '0' || *ptr > '9') &&
2398                                     (*ptr < 'A' || *ptr > 'Z') &&
2399                                     (*ptr < 'a' || *ptr > 'z'))
2400                                         break;
2401                                 ptr++;
2402                         }
2403                         if (*ptr) {
2404                                 /* Erroneous IDENT reply */
2405                                 Log(LOG_NOTICE,
2406                                     "Got invalid IDENT reply for connection %d! Ignored.",
2407                                     i);
2408                         } else {
2409                                 Log(LOG_INFO,
2410                                     "IDENT lookup for connection %d: \"%s\".",
2411                                     i, identptr);
2412                                 Client_SetUser(c, identptr, true);
2413                         }
2414                         if (Conf_NoticeAuth) {
2415                                 (void)Conn_WriteStr(i,
2416                                         "NOTICE AUTH :*** Got %sident response%s%s",
2417                                         *ptr ? "invalid " : "",
2418                                         *ptr ? "" : ": ",
2419                                         *ptr ? "" : identptr);
2420                         }
2421                 } else {
2422                         Log(LOG_INFO, "IDENT lookup for connection %d: no result.", i);
2423                         if (Conf_NoticeAuth && Conf_Ident)
2424                                 (void)Conn_WriteStr(i,
2425                                         "NOTICE AUTH :*** No ident response");
2426                 }
2427 #endif
2428
2429                 if (Conf_NoticeAuth)
2430                         (void)Handle_Write(i);
2431
2432                 Class_HandleServerBans(c);
2433         }
2434 #ifdef DEBUG
2435                 else Log( LOG_DEBUG, "Resolver: discarding result for already registered connection %d.", i );
2436 #endif
2437 } /* cb_Read_Resolver_Result */
2438
2439
2440 /**
2441  * Write a "simple" (error) message to a socket.
2442  *
2443  * The message is sent without using the connection write buffers, without
2444  * compression/encryption, and even without any error reporting. It is
2445  * designed for error messages of e.g. New_Connection().
2446  *
2447  * @param Sock  Socket handle.
2448  * @param Msg   Message string to send.
2449  */
2450 static void
2451 Simple_Message(int Sock, const char *Msg)
2452 {
2453         char buf[COMMAND_LEN];
2454         size_t len;
2455
2456         assert(Sock > NONE);
2457         assert(Msg != NULL);
2458
2459         strlcpy(buf, Msg, sizeof buf - 2);
2460         len = strlcat(buf, "\r\n", sizeof buf);
2461         if (write(Sock, buf, len) < 0) {
2462                 /* Because this function most probably got called to log
2463                  * an error message, any write error is ignored here to
2464                  * avoid an endless loop. But casting the result of write()
2465                  * to "void" doesn't satisfy the GNU C code attribute
2466                  * "warn_unused_result" which is used by some versions of
2467                  * glibc (e.g. 2.11.1), therefore this silly error
2468                  * "handling" code here :-( */
2469                 return;
2470         }
2471 } /* Simple_Error */
2472
2473
2474 /**
2475  * Get CLIENT structure that belongs to a local connection identified by its
2476  * index number. Each connection belongs to a client by definition, so it is
2477  * not required that the caller checks for NULL return values.
2478  *
2479  * @param Idx   Connection index number.
2480  * @returns     Pointer to CLIENT structure.
2481  */
2482 GLOBAL CLIENT *
2483 Conn_GetClient( CONN_ID Idx ) 
2484 {
2485         CONNECTION *c;
2486
2487         assert(Idx >= 0);
2488         c = array_get(&My_ConnArray, sizeof (CONNECTION), (size_t)Idx);
2489         assert(c != NULL);
2490         return c ? c->client : NULL;
2491 }
2492
2493 /**
2494  * Get PROC_STAT sub-process structure of a connection.
2495  *
2496  * @param Idx   Connection index number.
2497  * @returns     PROC_STAT structure.
2498  */
2499 GLOBAL PROC_STAT *
2500 Conn_GetProcStat(CONN_ID Idx)
2501 {
2502         CONNECTION *c;
2503
2504         assert(Idx >= 0);
2505         c = array_get(&My_ConnArray, sizeof (CONNECTION), (size_t)Idx);
2506         assert(c != NULL);
2507         return &c->proc_stat;
2508 } /* Conn_GetProcStat */
2509
2510
2511 /**
2512  * Get CONN_ID from file descriptor associated to a subprocess structure.
2513  *
2514  * @param fd    File descriptor.
2515  * @returns     CONN_ID or NONE (-1).
2516  */
2517 GLOBAL CONN_ID
2518 Conn_GetFromProc(int fd)
2519 {
2520         int i;
2521
2522         assert(fd > 0);
2523         for (i = 0; i < Pool_Size; i++) {
2524                 if ((My_Connections[i].sock != NONE)
2525                     && (Proc_GetPipeFd(&My_Connections[i].proc_stat) == fd))
2526                         return i;
2527         }
2528         return NONE;
2529 } /* Conn_GetFromProc */
2530
2531
2532 #ifndef STRICT_RFC
2533
2534 GLOBAL long
2535 Conn_GetAuthPing(CONN_ID Idx)
2536 {
2537         assert (Idx != NONE);
2538         return My_Connections[Idx].auth_ping;
2539 } /* Conn_GetAuthPing */
2540
2541 GLOBAL void
2542 Conn_SetAuthPing(CONN_ID Idx, long ID)
2543 {
2544         assert (Idx != NONE);
2545         My_Connections[Idx].auth_ping = ID;
2546 } /* Conn_SetAuthPing */
2547
2548 #endif
2549
2550
2551 #ifdef SSL_SUPPORT
2552
2553 /**
2554  * Get information about used SSL chiper.
2555  *
2556  * @param Idx   Connection index number.
2557  * @param buf   Buffer for returned information text.
2558  * @param len   Size of return buffer "buf".
2559  * @returns     true on success, false otherwise.
2560  */
2561 GLOBAL bool
2562 Conn_GetCipherInfo(CONN_ID Idx, char *buf, size_t len)
2563 {
2564         if (Idx < 0)
2565                 return false;
2566         assert(Idx < (int) array_length(&My_ConnArray, sizeof(CONNECTION)));
2567         return ConnSSL_GetCipherInfo(&My_Connections[Idx], buf, len);
2568 }
2569
2570
2571 /**
2572  * Check if a connection is SSL-enabled or not.
2573  *
2574  * @param Idx   Connection index number.
2575  * @return      true if connection is SSL-enabled, false otherwise.
2576  */
2577 GLOBAL bool
2578 Conn_UsesSSL(CONN_ID Idx)
2579 {
2580         if (Idx < 0)
2581                 return false;
2582         assert(Idx < (int) array_length(&My_ConnArray, sizeof(CONNECTION)));
2583         return Conn_OPTION_ISSET(&My_Connections[Idx], CONN_SSL);
2584 }
2585
2586 #endif
2587
2588
2589 #ifdef DEBUG
2590
2591 /**
2592  * Dump internal state of the "connection module".
2593  */
2594 GLOBAL void
2595 Conn_DebugDump(void)
2596 {
2597         int i;
2598
2599         Log(LOG_DEBUG, "Connection status:");
2600         for (i = 0; i < Pool_Size; i++) {
2601                 if (My_Connections[i].sock == NONE)
2602                         continue;
2603                 Log(LOG_DEBUG,
2604                     " - %d: host=%s, lastdata=%ld, lastping=%ld, delaytime=%ld, flag=%d, options=%d, bps=%d, client=%s",
2605                     My_Connections[i].sock, My_Connections[i].host,
2606                     My_Connections[i].lastdata, My_Connections[i].lastping,
2607                     My_Connections[i].delaytime, My_Connections[i].flag,
2608                     My_Connections[i].options, My_Connections[i].bps,
2609                     My_Connections[i].client ? Client_ID(My_Connections[i].client) : "-");
2610         }
2611 } /* Conn_DumpClients */
2612
2613 #endif
2614
2615
2616 /* -eof- */