]> arthur.barton.de Git - ngircd-alex.git/blobdiff - src/ngircd/conn.c
Update #include's: remove unused and add missing ones
[ngircd-alex.git] / src / ngircd / conn.c
index 8d72c1c3253ef9ecb2cea8fb6e3521ee72306fbb..75b77942d966858da2200fd6e7cb660b981b141b 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * ngIRCd -- The Next Generation IRC Daemon
- * Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
+ * Copyright (c)2001-2014 Alexander Barton (alex@barton.de) and Contributors.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 #define CONN_MODULE
 
 #include "portab.h"
-#include "conf-ssl.h"
-#include "io.h"
 
 /**
  * @file
  * Connection management
  */
 
-#include "imp.h"
 #include <assert.h>
 #ifdef PROTOTYPES
 # include <stdarg.h>
@@ -34,8 +31,9 @@
 #include <unistd.h>
 #include <errno.h>
 #include <string.h>
+#include <strings.h>
 #include <sys/socket.h>
-#include <sys/time.h>
+#include <sys/stat.h>
 #include <sys/types.h>
 #include <time.h>
 #include <netinet/in.h>
 # include <tcpd.h>                     /* for TCP Wrappers */
 #endif
 
-#include "array.h"
-#include "defines.h"
-
-#include "exp.h"
 #include "conn.h"
 
-#include "imp.h"
 #include "ngircd.h"
-#include "array.h"
-#include "client.h"
 #include "class.h"
-#include "conf.h"
-#include "conn-encoding.h"
+#ifdef ICONV
+# include "conn-encoding.h"
+#endif
 #include "conn-ssl.h"
 #include "conn-zip.h"
 #include "conn-func.h"
+#include "io.h"
 #include "log.h"
 #include "ng_ipaddr.h"
 #include "parse.h"
 #include "resolve.h"
-#include "tool.h"
-
-#include "exp.h"
-
 
 #define SERVER_WAIT (NONE - 1)
 
@@ -84,7 +73,6 @@
 
 #define SD_LISTEN_FDS_START 3
 
-
 static bool Handle_Write PARAMS(( CONN_ID Idx ));
 static bool Conn_Write PARAMS(( CONN_ID Idx, char *Data, size_t Len ));
 static int New_Connection PARAMS(( int Sock, bool IsSSL ));
@@ -100,7 +88,6 @@ static void Simple_Message PARAMS(( int Sock, const char *Msg ));
 static int NewListener PARAMS(( const char *listen_addr, UINT16 Port ));
 static void Account_Connection PARAMS((void));
 
-
 static array My_Listeners;
 static array My_ConnArray;
 static size_t NumConnections, NumConnectionsMax, NumConnectionsAccepted;
@@ -152,7 +139,9 @@ my_sd_listen_fds(void)
        if (!e || !*e)
                return -1;
        count = atoi(e);
+#ifdef HAVE_UNSETENV
        unsetenv("LISTEN_FDS");
+#endif
 
        return count;
 }
@@ -809,16 +798,6 @@ SSL_WantWrite(const CONNECTION *c)
        return false;
 }
 
-#else
-
-static inline bool
-SSL_WantRead(UNUSED const CONNECTION *c)
-{ return false; }
-
-static inline bool
-SSL_WantWrite(UNUSED const CONNECTION *c)
-{ return false; }
-
 #endif
 
 
@@ -881,8 +860,10 @@ Conn_Handler(void)
                        if (wdatalen > 0)
 #endif
                        {
+#ifdef SSL_SUPPORT
                                if (SSL_WantRead(&My_Connections[i]))
                                        continue;
+#endif
                                io_event_add(My_Connections[i].sock,
                                             IO_WANTWRITE);
                        }
@@ -982,6 +963,7 @@ va_dcl
        size_t len;
        bool ok;
        va_list ap;
+       int r;
 
        assert( Idx > NONE );
        assert( Format != NULL );
@@ -991,7 +973,8 @@ va_dcl
 #else
        va_start( ap );
 #endif
-       if (vsnprintf( buffer, COMMAND_LEN - 2, Format, ap ) >= COMMAND_LEN - 2 ) {
+       r = vsnprintf(buffer, COMMAND_LEN - 2, Format, ap);
+       if (r >= COMMAND_LEN - 2 || r == -1) {
                /*
                 * The string that should be written to the socket is longer
                 * than the allowed size of COMMAND_LEN bytes (including both
@@ -1012,6 +995,13 @@ va_dcl
                 * an other server only routing the message!), so the only
                 * option left is to shorten the string and to hope that the
                 * result is still somewhat useful ...
+                *
+                * Note:
+                * C99 states that vsnprintf() "returns the number of characters
+                * that would have been printed if the n were unlimited"; but
+                * according to the Linux manual page "glibc until 2.0.6 would
+                * return -1 when the output was truncated" -- so we have to
+                * handle both cases ...
                 *                                                   -alex-
                 */
 
@@ -1913,7 +1903,7 @@ Handle_Buffer(CONN_ID Idx)
                ptr2 = strchr(array_start(&My_Connections[Idx].rbuf), '\n');
                if (ptr) {
                        /* Check if there is a single CR or LF _before_ the
-                        * corerct CR+LF line terminator:  */
+                        * correct CR+LF line terminator:  */
                        first_eol = ptr1 < ptr2 ? ptr1 : ptr2;
                        if (first_eol < ptr) {
                                /* Single CR or LF before CR+LF found */
@@ -2131,6 +2121,7 @@ New_Server( int Server , ng_ipaddr_t *dest)
 
        if (!ng_ipaddr_tostr_r(dest, ip_str)) {
                Log(LOG_WARNING, "New_Server: Could not convert IP to string");
+               Conf_Server[Server].conn_id = NONE;
                return;
        }
 
@@ -2145,11 +2136,14 @@ New_Server( int Server , ng_ipaddr_t *dest)
        if (new_sock < 0) {
                Log(LOG_CRIT, "Can't create socket (af %d): %s!",
                    af_dest, strerror(errno));
+               Conf_Server[Server].conn_id = NONE;
                return;
        }
 
-       if (!Init_Socket(new_sock))
+       if (!Init_Socket(new_sock)) {
+               Conf_Server[Server].conn_id = NONE;
                return;
+       }
 
        /* is a bind address configured? */
        res = ng_ipaddr_af(&Conf_Server[Server].bind_addr);
@@ -2165,6 +2159,7 @@ New_Server( int Server , ng_ipaddr_t *dest)
        if(( res != 0 ) && ( errno != EINPROGRESS )) {
                Log( LOG_CRIT, "Can't connect socket: %s!", strerror( errno ));
                close( new_sock );
+               Conf_Server[Server].conn_id = NONE;
                return;
        }
 
@@ -2173,12 +2168,14 @@ New_Server( int Server , ng_ipaddr_t *dest)
                    "Cannot allocate memory for server connection (socket %d)",
                    new_sock);
                close( new_sock );
+               Conf_Server[Server].conn_id = NONE;
                return;
        }
 
        if (!io_event_create( new_sock, IO_WANTWRITE, cb_connserver)) {
                Log(LOG_ALERT, "io_event_create(): could not add fd %d", strerror(errno));
                close(new_sock);
+               Conf_Server[Server].conn_id = NONE;
                return;
        }
 
@@ -2193,6 +2190,7 @@ New_Server( int Server , ng_ipaddr_t *dest)
        if (!c) {
                Log( LOG_ALERT, "Can't establish connection: can't create client structure!" );
                io_close(new_sock);
+               Conf_Server[Server].conn_id = NONE;
                return;
        }
 
@@ -2454,9 +2452,9 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events )
                                        *ptr ? "" : ": ",
                                        *ptr ? "" : identptr);
                        }
-               } else {
+               } else if(Conf_Ident) {
                        Log(LOG_INFO, "IDENT lookup for connection %d: no result.", i);
-                       if (Conf_NoticeAuth && Conf_Ident)
+                       if (Conf_NoticeAuth)
                                (void)Conn_WriteStr(i,
                                        "NOTICE AUTH :*** No ident response");
                }