X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Fconn.c;h=407da1a3b0837ac2bd99c16054175a4b4070e006;hb=69803d6ff1ac8deb95e023bda6ad2aef435dc69a;hp=9d17a7382ff5283d34e5b0677790df1a5c2071f9;hpb=d29e389779dfeda52cb42e8b8f2cf36c4bd9cd56;p=ngircd-alex.git diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c index 9d17a738..407da1a3 100644 --- a/src/ngircd/conn.c +++ b/src/ngircd/conn.c @@ -9,6 +9,8 @@ * Please read the file COPYING, README and AUTHORS for more information. */ +#undef DEBUG_BUFFER + #define CONN_MODULE #include "portab.h" @@ -972,10 +974,10 @@ Conn_Write( CONN_ID Idx, char *Data, size_t Len ) if (array_bytes(&My_Connections[Idx].wbuf) + Len >= writebuf_limit) { Log(LOG_NOTICE, - "Write buffer overflow (connection %d, limit is %lu bytes, %lu bytes new, %lu bytes pending)!", + "Write buffer space exhausted (connection %d, limit is %lu bytes, %lu bytes new, %lu bytes pending)", Idx, writebuf_limit, Len, (unsigned long)array_bytes(&My_Connections[Idx].wbuf)); - Conn_Close(Idx, "Write buffer overflow!", NULL, false); + Conn_Close(Idx, "Write buffer space exhausted", NULL, false); return false; } @@ -1255,9 +1257,11 @@ Handle_Write( CONN_ID Idx ) return true; } +#ifdef DEBUG_BUFFER LogDebug ("Handle_Write() called for connection %d, %ld bytes pending ...", Idx, wdatalen); +#endif #ifdef SSL_SUPPORT if ( Conn_OPTION_ISSET( &My_Connections[Idx], CONN_SSL )) { @@ -1326,6 +1330,8 @@ New_Connection(int Sock) assert(Sock > NONE); + LogDebug("Accepting new connection on socket %d ...", Sock); + new_sock_len = (int)sizeof(new_addr); new_sock = accept(Sock, (struct sockaddr *)&new_addr, (socklen_t *)&new_sock_len); @@ -1525,9 +1531,9 @@ Read_Request( CONN_ID Idx ) { /* Read buffer is full */ Log(LOG_ERR, - "Receive buffer overflow (connection %d): %d bytes!", + "Receive buffer space exhausted (connection %d): %d bytes", Idx, array_bytes(&My_Connections[Idx].rbuf)); - Conn_Close( Idx, "Receive buffer overflow!", NULL, false ); + Conn_Close(Idx, "Receive buffer space exhausted", NULL, false); return; } @@ -1563,7 +1569,7 @@ Read_Request( CONN_ID Idx ) Log(LOG_ERR, "Could not append recieved data to zip input buffer (connn %d): %d bytes!", Idx, len); - Conn_Close(Idx, "Receive buffer overflow!", NULL, + Conn_Close(Idx, "Receive buffer space exhausted", NULL, false); return; } @@ -1572,7 +1578,7 @@ Read_Request( CONN_ID Idx ) { if (!array_catb( &My_Connections[Idx].rbuf, readbuf, len)) { Log( LOG_ERR, "Could not append recieved data to input buffer (connn %d): %d bytes!", Idx, len ); - Conn_Close( Idx, "Receive buffer overflow!", NULL, false ); + Conn_Close(Idx, "Receive buffer space exhausted", NULL, false ); } } @@ -1753,8 +1759,10 @@ Handle_Buffer(CONN_ID Idx) return 0; /* error -> connection has been closed */ array_moveleft(&My_Connections[Idx].rbuf, 1, len); +#ifdef DEBUG_BUFFER LogDebug("Connection %d: %d bytes left in read buffer.", Idx, array_bytes(&My_Connections[Idx].rbuf)); +#endif #ifdef ZLIB if ((!old_z) && (My_Connections[Idx].options & CONN_ZIP) && (array_bytes(&My_Connections[Idx].rbuf) > 0)) { @@ -1951,6 +1959,12 @@ New_Server( int Server , ng_ipaddr_t *dest) 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); + return; + } + My_Connections = array_start(&My_ConnArray); assert(My_Connections[new_sock].sock <= 0); @@ -1961,7 +1975,7 @@ New_Server( int Server , ng_ipaddr_t *dest) c = Client_NewLocal(new_sock, ip_str, CLIENT_UNKNOWNSERVER, false); if (!c) { Log( LOG_ALERT, "Can't establish connection: can't create client structure!" ); - close( new_sock ); + io_close(new_sock); return; } @@ -1978,13 +1992,6 @@ New_Server( int Server , ng_ipaddr_t *dest) strlcpy( My_Connections[new_sock].host, Conf_Server[Server].host, sizeof(My_Connections[new_sock].host )); - /* Register new socket */ - if (!io_event_create( new_sock, IO_WANTWRITE, cb_connserver)) { - Log( LOG_ALERT, "io_event_create(): could not add fd %d", strerror(errno)); - Conn_Close( new_sock, "io_event_create() failed", NULL, false ); - Init_Conn_Struct( new_sock ); - Conf_Server[Server].conn_id = NONE; - } #ifdef SSL_SUPPORT if (Conf_Server[Server].SSLConnect && !ConnSSL_PrepareConnect( &My_Connections[new_sock], &Conf_Server[Server] )) @@ -2025,9 +2032,10 @@ Init_Conn_Struct(CONN_ID Idx) * Initialize options of a new socket. * * For example, we try to set socket options SO_REUSEADDR and IPTOS_LOWDELAY. - * Errors shouldn't be fatal and therefore are ignored. + * The socket is automatically closed if a fatal error is encountered. * * @param Sock Socket handle. + * @returns false if socket was closed due to fatal error. */ static bool Init_Socket( int Sock ) @@ -2051,13 +2059,14 @@ Init_Socket( int Sock ) /* Set type of service (TOS) */ #if defined(IPPROTO_IP) && defined(IPTOS_LOWDELAY) value = IPTOS_LOWDELAY; - LogDebug("Setting IP_TOS on socket %d to IPTOS_LOWDELAY.", Sock); if (setsockopt(Sock, IPPROTO_IP, IP_TOS, &value, (socklen_t) sizeof(value))) { LogDebug("Can't set socket option IP_TOS: %s!", strerror(errno)); /* ignore this error */ - } + } else + LogDebug("IP_TOS on socket %d has been set to IPTOS_LOWDELAY.", + Sock); #endif return true; @@ -2098,6 +2107,7 @@ cb_Connect_to_Server(int fd, UNUSED short events) /* Read result from pipe */ len = Proc_Read(&Conf_Server[i].res_stat, dest_addrs, sizeof(dest_addrs)); + Proc_Close(&Conf_Server[i].res_stat); if (len == 0) { /* Error resolving hostname: reset server structure */ Conf_Server[i].conn_id = NONE; @@ -2157,6 +2167,7 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events ) /* Read result from pipe */ len = Proc_Read(&My_Connections[i].proc_stat, readbuf, sizeof readbuf -1); + Proc_Close(&My_Connections[i].proc_stat); if (len == 0) return; @@ -2303,6 +2314,25 @@ Conn_GetFromProc(int fd) } /* Conn_GetFromProc */ +#ifndef STRICT_RFC + +GLOBAL long +Conn_GetAuthPing(CONN_ID Idx) +{ + assert (Idx != NONE); + return My_Connections[Idx].auth_ping; +} /* Conn_GetAuthPing */ + +GLOBAL void +Conn_SetAuthPing(CONN_ID Idx, long ID) +{ + assert (Idx != NONE); + My_Connections[Idx].auth_ping = ID; +} /* Conn_SetAuthPing */ + +#endif + + #ifdef SSL_SUPPORT /**