X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Fconn.c;h=d35a091791893ac6eb071c3b9f3a1a326ca69c95;hp=4b48ffb842288c62f1265ef3ea7507debb3e89e4;hb=7deacbaa11e237c987ba7d379a3162846cda8f2d;hpb=439c945d56ecba14cce789c5725575667c066502 diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c index 4b48ffb8..d35a0917 100644 --- a/src/ngircd/conn.c +++ b/src/ngircd/conn.c @@ -16,7 +16,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: conn.c,v 1.118 2003/03/07 14:35:52 alex Exp $"; +static char UNUSED id[] = "$Id: conn.c,v 1.122 2003/04/21 10:52:26 alex Exp $"; #include "imp.h" #include @@ -86,6 +86,7 @@ LOCAL VOID Init_Conn_Struct PARAMS(( CONN_ID Idx )); LOCAL BOOLEAN Init_Socket PARAMS(( INT Sock )); LOCAL VOID New_Server PARAMS(( INT Server, CONN_ID Idx )); LOCAL VOID Read_Resolver_Result PARAMS(( INT r_fd )); +LOCAL VOID Simple_Message PARAMS(( INT Sock, CHAR *Msg )); LOCAL fd_set My_Listeners; LOCAL fd_set My_Sockets; @@ -428,7 +429,7 @@ Conn_Handler( VOID ) if( errno != EINTR ) { Log( LOG_EMERG, "Conn_Handler(): select(): %s!", strerror( errno )); - Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE ); + Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME ); exit( 1 ); } continue; @@ -625,7 +626,7 @@ Conn_Close( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformClient ) { /* Oops, we can't close the socket!? This is fatal! */ Log( LOG_EMERG, "Error closing connection %d (socket %d) with %s:%d - %s!", Idx, My_Connections[Idx].sock, My_Connections[Idx].host, ntohs( My_Connections[Idx].addr.sin_port), strerror( errno )); - Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE ); + Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME ); exit( 1 ); } @@ -682,6 +683,37 @@ Conn_Close( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformClient ) } /* Conn_Close */ +GLOBAL VOID +Conn_SyncServerStruct( VOID ) +{ + /* Synchronize server structures (connection IDs): + * connections <-> configuration */ + + CLIENT *client; + CONN_ID i; + INT c; + + for( i = 0; i < Pool_Size; i++ ) + { + /* Established connection? */ + if( My_Connections[i].sock <= NONE ) continue; + + /* Server connection? */ + client = Client_GetFromConn( i ); + if(( ! client ) || ( Client_Type( client ) != CLIENT_SERVER )) continue; + + for( c = 0; c < MAX_SERVERS; c++ ) + { + /* Configured server? */ + if( ! Conf_Server[c].host[0] ) continue; + + /* Duplicate? */ + if( strcmp( Conf_Server[c].name, Client_ID( client )) == 0 ) Conf_Server[c].conn_id = i; + } + } +} /* SyncServerStruct */ + + LOCAL BOOLEAN Try_Write( CONN_ID Idx ) { @@ -766,6 +798,7 @@ Handle_Write( CONN_ID Idx ) /* Daten aus Schreibpuffer versenden bzw. Connection aufbauen */ INT len, res, err; + socklen_t sock_len; CLIENT *c; assert( Idx > NONE ); @@ -779,9 +812,9 @@ Handle_Write( CONN_ID Idx ) FD_CLR( My_Connections[Idx].sock, &My_Connects ); /* Ergebnis des connect() ermitteln */ - len = sizeof( err ); - res = getsockopt( My_Connections[Idx].sock, SOL_SOCKET, SO_ERROR, &err, &len ); - assert( len == sizeof( err )); + sock_len = sizeof( err ); + res = getsockopt( My_Connections[Idx].sock, SOL_SOCKET, SO_ERROR, &err, &sock_len ); + assert( sock_len == sizeof( err )); /* Fehler aufgetreten? */ if(( res != 0 ) || ( err != 0 )) @@ -869,11 +902,12 @@ New_Connection( INT Sock ) #ifdef USE_TCPWRAP /* Validate socket using TCP Wrappers */ - request_init( &req, RQ_DAEMON, PACKAGE, RQ_FILE, new_sock, RQ_CLIENT_SIN, &new_addr, NULL ); + request_init( &req, RQ_DAEMON, PACKAGE_NAME, RQ_FILE, new_sock, RQ_CLIENT_SIN, &new_addr, NULL ); if( ! hosts_access( &req )) { /* Access denied! */ Log( deny_severity, "Refused connection from %s (by TCP Wrappers)!", inet_ntoa( new_addr.sin_addr )); + Simple_Message( new_sock, "ERROR :Connection refused" ); close( new_sock ); return; } @@ -898,6 +932,7 @@ New_Connection( INT Sock ) { /* 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; } @@ -906,6 +941,7 @@ New_Connection( INT Sock ) if( new_size < Pool_Size ) { Log( LOG_ALERT, "Can't accespt connection: limit (%d) reached -- overflow!", Pool_Size ); + Simple_Message( new_sock, "ERROR :Connection limit reached" ); close( new_sock ); return; } @@ -922,6 +958,7 @@ New_Connection( INT Sock ) { /* Offenbar steht kein weiterer Sepeicher zur Verfuegung :-( */ Log( LOG_EMERG, "Can't allocate memory! [New_Connection]" ); + Simple_Message( new_sock, "ERROR: Internal error" ); close( new_sock ); return; } @@ -949,6 +986,7 @@ New_Connection( INT Sock ) if( ! c ) { Log( LOG_ALERT, "Can't accept connection: can't create client structure!" ); + Simple_Message( new_sock, "ERROR :Internal error" ); close( new_sock ); return; } @@ -1521,4 +1559,19 @@ Read_Resolver_Result( INT r_fd ) } /* Read_Resolver_Result */ +LOCAL VOID +Simple_Message( INT Sock, CHAR *Msg ) +{ + /* Write "simple" message to socket, without using compression + * or even the connection write buffers. Used e.g. for error + * messages by New_Connection(). */ + + assert( Sock > NONE ); + assert( Msg != NULL ); + + (VOID)send( Sock, Msg, strlen( Msg ), 0 ); + (VOID)send( Sock, "\r\n", 2, 0 ); +} /* Simple_Error */ + + /* -eof- */