1
0
mirror of https://github.com/osmarks/ngircd.git synced 2025-04-07 16:26:38 +00:00

changed connection structure to array-api

This commit is contained in:
Florian Westphal 2006-02-16 19:21:57 +00:00
parent 66060dbce9
commit 93df629b69

@ -17,7 +17,7 @@
#include "portab.h"
#include "io.h"
static char UNUSED id[] = "$Id: conn.c,v 1.189 2006/02/08 17:33:28 fw Exp $";
static char UNUSED id[] = "$Id: conn.c,v 1.190 2006/02/16 19:21:57 fw Exp $";
#include "imp.h"
#include <assert.h>
@ -97,6 +97,7 @@ static int Count_Connections PARAMS(( struct sockaddr_in addr ));
static int NewListener PARAMS(( const UINT16 Port ));
static array My_Listeners;
static array My_ConnArray;
#ifdef TCPWRAP
int allow_severity = LOG_INFO;
@ -214,16 +215,20 @@ Conn_Init( void )
/* konfiguriertes Limit beachten */
if( Pool_Size > Conf_MaxConnections ) Pool_Size = Conf_MaxConnections;
}
My_Connections = (CONNECTION *) calloc( Pool_Size, sizeof( CONNECTION ) );
if( ! My_Connections )
{
/* Speicher konnte nicht alloziert werden! */
if (!array_alloc(&My_ConnArray, sizeof(CONNECTION), Pool_Size)) {
Log( LOG_EMERG, "Can't allocate memory! [Conn_Init]" );
exit( 1 );
}
LogDebug("Allocated connection pool for %d items (%ld bytes).", Pool_Size,
sizeof( CONNECTION ) * Pool_Size );
/* XXX: My_Connetions/Pool_Size are needed by other parts of the code; remove them */
My_Connections = (CONNECTION*) array_start(&My_ConnArray);
LogDebug("Allocated connection pool for %d items (%ld bytes).",
array_length(&My_ConnArray, sizeof( CONNECTION )), array_bytes(&My_ConnArray));
assert( array_length(&My_ConnArray, sizeof( CONNECTION )) >= (size_t) Pool_Size);
array_free( &My_Listeners );
/* Connection-Struktur initialisieren */
@ -251,11 +256,10 @@ Conn_Exit( void )
if( My_Connections[idx].sock > NONE ) {
Conn_Close( idx, NULL, NGIRCd_SignalRestart ?
"Server going down (restarting)":"Server going down", true );
continue;
}
}
free( My_Connections );
array_free(&My_ConnArray);
My_Connections = NULL;
Pool_Size = 0;
io_library_shutdown();
@ -783,9 +787,7 @@ Conn_Close( CONN_ID Idx, char *LogMsg, char *FwdMsg, bool InformClient )
/* Clean up connection structure (=free it) */
Init_Conn_Struct( Idx );
#ifdef DEBUG
LogDebug("Shutdown of connection %d completed.", Idx );
#endif
} /* Conn_Close */
@ -889,10 +891,9 @@ New_Connection( int Sock )
struct request_info req;
#endif
struct sockaddr_in new_addr;
int i, new_sock, new_sock_len;
int new_sock, new_sock_len, new_Pool_Size;
CLIENT *c;
POINTER *ptr;
long new_size, cnt;
long cnt;
assert( Sock > NONE );
/* Connection auf Listen-Socket annehmen */
@ -919,7 +920,8 @@ New_Connection( int Sock )
#endif
/* Socket initialisieren */
Init_Socket( new_sock );
if (!Init_Socket( new_sock ))
return -1;
/* Check IP-based connection limit */
cnt = Count_Connections( new_addr );
@ -932,59 +934,32 @@ New_Connection( int Sock )
return -1;
}
#ifdef DEBUG
if (new_sock < Pool_Size)
assert(My_Connections[new_sock].sock == NONE );
#endif
if( new_sock >= Pool_Size ) {
new_size = Pool_Size + CONNECTION_POOL;
/* Im bisherigen Pool wurde keine freie Connection-Struktur mehr gefunden.
* Wenn erlaubt und moeglich muss nun der Pool vergroessert werden: */
if( Conf_MaxConnections > 0 )
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))
{
/* Es ist ein Limit konfiguriert */
if( Pool_Size >= Conf_MaxConnections )
{
/* Mehr Verbindungen duerfen wir leider nicht mehr annehmen ... */
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( new_size > Conf_MaxConnections ) new_size = Conf_MaxConnections;
}
if( new_size < Pool_Size )
{
Log( LOG_ALERT, "Can't accept connection: limit (%d) reached -- overflow!", 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;
}
ptr = (POINTER *)realloc( My_Connections, sizeof( CONNECTION ) * new_size );
if( ! ptr ) {
if (!array_alloc(&My_ConnArray, sizeof( CONNECTION ), new_sock)) {
Log( LOG_EMERG, "Can't allocate memory! [New_Connection]" );
Simple_Message( new_sock, "ERROR: Internal error" );
close( new_sock );
return -1;
}
LogDebug("Allocated new connection pool for %ld items (%ld bytes). [realloc()]",
new_size, sizeof( CONNECTION ) * new_size );
LogDebug("Bumped connection pool to %ld items (internal: %ld items, %ld bytes)",
new_sock, array_length(&My_ConnArray, sizeof(CONNECTION)), array_bytes(&My_ConnArray));
/* Adjust pointer to new block */
My_Connections = (CONNECTION *)ptr;
/* Initialize new items */
for( i = Pool_Size; i < new_size; i++ )
Init_Conn_Struct( i );
/* Adjust new pool size */
Pool_Size = new_size;
My_Connections = array_start(&My_ConnArray);
Pool_Size = new_Pool_Size;
}
/* Client-Struktur initialisieren */
c = Client_NewLocal( new_sock, inet_ntoa( new_addr.sin_addr ), CLIENT_UNKNOWN, false );
if( ! c ) {
Log( LOG_ALERT, "Can't accept connection: can't create client structure!" );
@ -993,19 +968,18 @@ New_Connection( int Sock )
return -1;
}
/* Verbindung registrieren */
Init_Conn_Struct( new_sock );
My_Connections[new_sock].sock = new_sock;
My_Connections[new_sock].addr = new_addr;
/* Neuen Socket registrieren */
/* register callback */
if (!io_event_create( new_sock, IO_WANTREAD, cb_clientserver)) {
Simple_Message( new_sock, "ERROR :Internal error" );
Conn_Close( new_sock, "io_event_create() failed", NULL, false );
return -1;
}
LogDebug( "Accepted connection %d from %s:%d on socket %d.", new_sock,
Log( LOG_INFO, "Accepted connection %d from %s:%d on socket %d.", new_sock,
inet_ntoa( new_addr.sin_addr ), ntohs( new_addr.sin_port), Sock );
/* Hostnamen ermitteln */
@ -1033,8 +1007,7 @@ Socket2Index( int Sock )
if( Sock >= Pool_Size || My_Connections[Sock].sock != Sock ) {
/* die Connection wurde vermutlich (wegen eines
* Fehlers) bereits wieder abgebaut ... */
LogDebug( "Socket2Index: can't get connection for socket %d!", Sock );
LogDebug("Socket2Index: can't get connection for socket %d!", Sock);
return NONE;
}
return Sock;
@ -1200,9 +1173,8 @@ Handle_Buffer( CONN_ID Idx )
result = true;
array_moveleft(&My_Connections[Idx].rbuf, 1, len);
LogDebug("Connection %d: %d bytes left in read buffer.", Idx,
array_bytes(&My_Connections[Idx].rbuf));
LogDebug("Connection %d: %d bytes left in read buffer.",
Idx, array_bytes(&My_Connections[Idx].rbuf));
#ifdef ZLIB
if(( ! old_z ) && ( My_Connections[Idx].options & CONN_ZIP ) &&
( array_bytes(&My_Connections[Idx].rbuf) > 0 ))
@ -1219,13 +1191,11 @@ Handle_Buffer( CONN_ID Idx )
return false;
array_trunc(&My_Connections[Idx].rbuf);
LogDebug("Moved already received data (%u bytes) to uncompression buffer.",
array_bytes(&My_Connections[Idx].zip.rbuf));
}
#endif /* ZLIB */
}
return result;
} /* Handle_Buffer */
@ -1250,9 +1220,8 @@ Check_Connections( void )
/* we already sent a ping */
if( My_Connections[i].lastping < time( NULL ) - Conf_PongTimeout ) {
/* Timeout */
LogDebug("Connection %d: Ping timeout: %d seconds.", i,
Conf_PongTimeout );
LogDebug("Connection %d: Ping timeout: %d seconds.",
i, Conf_PongTimeout );
Conn_Close( i, NULL, "Ping timeout", true );
}
}
@ -1366,14 +1335,16 @@ New_Server( int Server )
close( new_sock );
return;
}
if (new_sock >= Pool_Size) {
Log( LOG_ALERT, "Can't establist server connection: connection limit reached (%d)!",
Pool_Size );
if (!array_alloc(&My_ConnArray, sizeof(CONNECTION), new_sock)) {
Log( LOG_ALERT, "Cannot allocate memory for server connection (socket %d)", new_sock);
close( new_sock );
return;
}
assert(My_Connections[new_sock].sock < 0 );
My_Connections = array_start(&My_ConnArray);
assert(My_Connections[new_sock].sock <= 0);
Init_Conn_Struct(new_sock);
@ -1402,7 +1373,8 @@ New_Server( int Server )
Conf_Server[Server].conn_id = NONE;
}
LogDebug("Registered new connection %d on socket %d.", new_sock, My_Connections[new_sock].sock );
LogDebug("Registered new connection %d on socket %d.",
new_sock, My_Connections[new_sock].sock );
Conn_OPTION_ADD( &My_Connections[new_sock], CONN_ISCONNECTING );
} /* New_Server */
@ -1445,7 +1417,6 @@ Init_Socket( int Sock )
/* Set type of service (TOS) */
#if defined(IP_TOS) && defined(IPTOS_LOWDELAY)
value = IPTOS_LOWDELAY;
LogDebug("Setting option IP_TOS on socket %d to IPTOS_LOWDELAY (%d).", Sock, value );
if( setsockopt( Sock, SOL_IP, IP_TOS, &value, (socklen_t)sizeof( value )) != 0 )
{
@ -1477,7 +1448,7 @@ cb_Connect_to_Server(int fd, UNUSED short events)
if( i >= MAX_SERVERS) {
/* Ops, no matching server found?! */
io_close( fd );
LogDebug("Resolver: Got Forward Lookup callback for unknown server!?" );
LogDebug("Resolver: Got Forward Lookup callback for unknown server!?");
return;
}
@ -1542,9 +1513,7 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events )
}
*identptr = '\0';
LogDebug( "Got result from resolver: \"%s\" (%u bytes read).", readbuf, len);
LogDebug("Got result from resolver: \"%s\" (%u bytes read).", readbuf, len);
/* Okay, we got a complete result: this is a host name for outgoing
* connections and a host name and IDENT user name (if enabled) for
* incoming connections.*/