static array My_Listeners;
static array My_ConnArray;
+static size_t NumConnections;
#ifdef TCPWRAP
int allow_severity = LOG_INFO;
cb_listen(int sock, short irrelevant)
{
(void) irrelevant;
- New_Connection( sock );
+ if (New_Connection( sock ) >= 0)
+ NumConnections++;
}
/* Speicher fuer Verbindungs-Pool anfordern */
Pool_Size = CONNECTION_POOL;
- if( Conf_MaxConnections > 0 )
- {
- /* konfiguriertes Limit beachten */
- if( Pool_Size > Conf_MaxConnections ) Pool_Size = Conf_MaxConnections;
- }
-
+ if ((Conf_MaxConnections > 0) &&
+ (Pool_Size > Conf_MaxConnections))
+ Pool_Size = Conf_MaxConnections;
+
if (!array_alloc(&My_ConnArray, sizeof(CONNECTION), (size_t)Pool_Size)) {
Log( LOG_EMERG, "Can't allocate memory! [Conn_Init]" );
exit( 1 );
/* Clean up connection structure (=free it) */
Init_Conn_Struct( Idx );
- LogDebug("Shutdown of connection %d completed.", Idx );
+ assert(NumConnections > 0);
+ if (NumConnections)
+ NumConnections--;
+ LogDebug("Shutdown of connection %d completed", Idx );
} /* Conn_Close */
#endif
ng_ipaddr_t new_addr;
char ip_str[NG_INET_ADDRSTRLEN];
- int new_sock, new_sock_len, new_Pool_Size;
+ int new_sock, new_sock_len;
CLIENT *c;
long cnt;
Log(LOG_CRIT, "fd %d: Can't convert IP address!", new_sock);
Simple_Message(new_sock, "ERROR :Internal Server Error");
close(new_sock);
+ return -1;
}
#ifdef TCPWRAP
return -1;
}
- if( new_sock >= Pool_Size ) {
- new_Pool_Size = new_sock + 1;
- /* No free Connection Structures, check if we may accept further connections */
- if ((( Conf_MaxConnections > 0) && Pool_Size >= Conf_MaxConnections) ||
- (new_Pool_Size < Pool_Size))
- {
- Log( LOG_ALERT, "Can't accept connection: limit (%d) reached!", Pool_Size );
- Simple_Message( new_sock, "ERROR :Connection limit reached" );
- close( new_sock );
- return -1;
- }
+ if ((Conf_MaxConnections > 0) &&
+ (NumConnections >= (size_t) Conf_MaxConnections))
+ {
+ Log( LOG_ALERT, "Can't accept connection: limit (%d) reached!", Conf_MaxConnections);
+ Simple_Message( new_sock, "ERROR :Connection limit reached" );
+ close( new_sock );
+ return -1;
+ }
+ if( new_sock >= Pool_Size ) {
if (!array_alloc(&My_ConnArray, sizeof(CONNECTION),
(size_t)new_sock)) {
Log( LOG_EMERG, "Can't allocate memory! [New_Connection]" );
/* Adjust pointer to new block */
My_Connections = array_start(&My_ConnArray);
- while (Pool_Size < new_Pool_Size)
+ while (Pool_Size <= new_sock)
Init_Conn_Struct(Pool_Size++);
}
/* Handle Data in Connections Read-Buffer.
* Return true if a reuqest was handled, false otherwise (also returned on errors). */
#ifndef STRICT_RFC
- char *ptr1, *ptr2;
+ char *ptr1, *ptr2, *first_eol;
#endif
char *ptr;
size_t len, delta;
return false;
/* A Complete Request end with CR+LF, see RFC 2812. */
+ delta = 2;
ptr = strstr( array_start(&My_Connections[Idx].rbuf), "\r\n" );
- if( ptr ) delta = 2; /* complete request */
#ifndef STRICT_RFC
- else {
- /* Check for non-RFC-compliant request (only CR or LF)? Unfortunately,
- * there are quite a few clients that do this (incl. "mIRC" :-( */
- ptr1 = strchr( array_start(&My_Connections[Idx].rbuf), '\r' );
- ptr2 = strchr( array_start(&My_Connections[Idx].rbuf), '\n' );
+ /* Check for non-RFC-compliant request (only CR or LF)?
+ * Unfortunately, there are quite a few clients out there
+ * that do this -- e. g. mIRC, BitchX, and Trillian :-( */
+ ptr1 = strchr(array_start(&My_Connections[Idx].rbuf), '\r');
+ 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: */
+ first_eol = ptr1 < ptr2 ? ptr1 : ptr2;
+ if (first_eol < ptr) {
+ /* Single CR or LF before CR+LF found */
+ ptr = first_eol;
+ delta = 1;
+ }
+ } else if (ptr1 || ptr2) {
+ /* No CR+LF terminated command found, but single
+ * CR or LF found ... */
+ if (ptr1 && ptr2)
+ ptr = ptr1 < ptr2 ? ptr1 : ptr2;
+ else
+ ptr = ptr1 ? ptr1 : ptr2;
delta = 1;
- if( ptr1 && ptr2 ) ptr = ptr1 > ptr2 ? ptr2 : ptr1;
- else if( ptr1 ) ptr = ptr1;
- else if( ptr2 ) ptr = ptr2;
}
#endif