X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Fconn.c;h=7dede7098db5c4bda65883ca40061e9a3db288df;hp=71b4da5f62de81f21fe82ff1fa03e1e69c424f98;hb=50ec7a56a4e75dad25b20fdb904545143ac19ff3;hpb=7b8b54239684cddef680254e884ca5c9cb097951 diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c index 71b4da5f..7dede709 100644 --- a/src/ngircd/conn.c +++ b/src/ngircd/conn.c @@ -9,11 +9,27 @@ * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS. * - * $Id: conn.c,v 1.46 2002/03/02 03:32:08 alex Exp $ + * $Id: conn.c,v 1.51 2002/03/11 22:04:10 alex Exp $ * * connect.h: Verwaltung aller Netz-Verbindungen ("connections") * * $Log: conn.c,v $ + * Revision 1.51 2002/03/11 22:04:10 alex + * - Client_Destroy() hat neuen Paramter: QUITs fuer Clients verschicken? + * + * Revision 1.50 2002/03/11 00:04:48 alex + * - ein sofortiger Re-Connect wird nur dann versucht, wenn die Vernindung + * "lange genug" bereits bestanden hatte. + * + * Revision 1.49 2002/03/10 18:47:02 alex + * *** empty log message *** + * + * Revision 1.48 2002/03/10 17:50:48 alex + * - Server-Gruppen implementiert. + * + * Revision 1.47 2002/03/04 23:16:23 alex + * - Logging geaendert: detaillierter im Syslog, "allgemeiner" fuer Clients. + * * Revision 1.46 2002/03/02 03:32:08 alex * - Aenderung des Idle-Verhalten revidiert: das war ein Schnellschuss :-/ * @@ -413,7 +429,7 @@ GLOBAL VOID Conn_Handler( INT Timeout ) Handle_Buffer( i ); } } - + /* noch volle Schreib-Puffer suchen */ FD_ZERO( &write_sockets ); for( i = 0; i < MAX_CONNECTIONS; i++ ) @@ -557,7 +573,7 @@ GLOBAL VOID Conn_Close( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformC * Sub-Prozessen offene Pipes werden geschlossen. */ CLIENT *c; - + assert( Idx >= 0 ); assert( My_Connections[Idx].sock > NONE ); @@ -578,7 +594,7 @@ GLOBAL VOID Conn_Close( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformC } c = Client_GetFromConn( Idx ); - if( c ) Client_Destroy( c, LogMsg, FwdMsg ); + if( c ) Client_Destroy( c, LogMsg, FwdMsg, TRUE ); if( My_Connections[Idx].res_stat ) { @@ -591,8 +607,12 @@ GLOBAL VOID Conn_Close( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformC /* Bei Server-Verbindungen lasttry-Zeitpunkt so setzen, dass * der naechste Verbindungsversuch in RECONNECT_DELAY Sekunden - * gestartet wird */ - if( My_Connections[Idx].our_server >= 0 ) Conf_Server[My_Connections[Idx].our_server].lasttry = time( NULL ) - Conf_ConnectRetry + RECONNECT_DELAY; + * gestartet wird. */ + if(( My_Connections[Idx].our_server >= 0 ) && ( Conf_Server[My_Connections[Idx].our_server].lasttry < time( NULL ))) + { + /* Okay, die Verbindung stand schon "genuegend lange" */ + Conf_Server[My_Connections[Idx].our_server].lasttry = time( NULL ) - Conf_ConnectRetry + RECONNECT_DELAY; + } FD_CLR( My_Connections[Idx].sock, &My_Sockets ); FD_CLR( My_Connections[Idx].sock, &My_Connects ); @@ -666,7 +686,7 @@ LOCAL VOID Handle_Read( INT Sock ) CONN_ID idx; assert( Sock >= 0 ); - + if( FD_ISSET( Sock, &My_Listeners )) { /* es ist einer unserer Listener-Sockets: es soll @@ -766,7 +786,7 @@ LOCAL VOID New_Connection( INT Sock ) INT new_sock, new_sock_len; RES_STAT *s; CONN_ID idx; - + assert( Sock >= 0 ); new_sock_len = sizeof( new_addr ); @@ -859,7 +879,7 @@ LOCAL VOID Read_Request( CONN_ID Idx ) { /* Socket wurde geschlossen */ Log( LOG_INFO, "%s:%d is closing the connection ...", inet_ntoa( My_Connections[Idx].addr.sin_addr ), ntohs( My_Connections[Idx].addr.sin_port)); - Conn_Close( Idx, NULL, "Client closed connection.", FALSE ); + Conn_Close( Idx, "Socket closed!", "Client closed connection", FALSE ); return; } @@ -867,7 +887,7 @@ LOCAL VOID Read_Request( CONN_ID Idx ) { /* Fehler beim Lesen */ Log( LOG_ERR, "Read error on connection %d: %s!", Idx, strerror( errno )); - Conn_Close( Idx, NULL, "Read error!", FALSE ); + Conn_Close( Idx, "Read error!", "Client closed connection", FALSE ); return; } @@ -889,7 +909,7 @@ LOCAL VOID Handle_Buffer( CONN_ID Idx ) CHAR *ptr, *ptr1, *ptr2; INT len, delta; - + /* Eine komplette Anfrage muss mit CR+LF enden, vgl. * RFC 2812. Haben wir eine? */ ptr = strstr( My_Connections[Idx].rbuf, "\r\n" ); @@ -908,7 +928,7 @@ LOCAL VOID Handle_Buffer( CONN_ID Idx ) else if( ptr2 ) ptr = ptr2; } #endif - + if( ptr ) { /* Ende der Anfrage wurde gefunden */ @@ -923,7 +943,7 @@ LOCAL VOID Handle_Buffer( CONN_ID Idx ) Conn_Close( Idx, NULL, "Request too long", TRUE ); return; } - + if( len > delta ) { /* Es wurde ein Request gelesen */ @@ -996,15 +1016,16 @@ LOCAL VOID Check_Servers( VOID ) /* Wenn "Passive-Mode" aktiv: nicht verbinden */ if( NGIRCd_Passive ) return; - + for( i = 0; i < Conf_Server_Count; i++ ) { /* Ist ein Hostname und Port definiert? */ if(( ! Conf_Server[i].host[0] ) || ( ! Conf_Server[i].port > 0 )) continue; - + /* Haben wir schon eine Verbindung? */ for( n = 0; n < MAX_CONNECTIONS; n++ ) { + /* Verbindung zu diesem Server? */ if(( My_Connections[n].sock != NONE ) && ( My_Connections[n].our_server == i )) { /* Komplett aufgebaute Verbindung? */ @@ -1013,9 +1034,15 @@ LOCAL VOID Check_Servers( VOID ) /* IP schon aufgeloest? */ if( My_Connections[n].res_stat == NULL ) New_Server( i, n ); } + + /* Verbindung in dieser Server-Gruppe? */ + if(( My_Connections[n].sock != NONE ) && ( My_Connections[n].our_server != NONE )) + { + if( Conf_Server[n].group == Conf_Server[i].group != NONE ) break; + } } if( n < MAX_CONNECTIONS ) continue; - + /* Wann war der letzte Connect-Versuch? */ if( Conf_Server[i].lasttry > time( NULL ) - Conf_ConnectRetry ) continue; @@ -1035,7 +1062,7 @@ LOCAL VOID Check_Servers( VOID ) Init_Conn_Struct( idx ); My_Connections[idx].sock = SERVER_WAIT; My_Connections[idx].our_server = i; - + /* Hostnamen in IP aufloesen */ s = ResolveName( Conf_Server[i].host ); if( s ) @@ -1072,7 +1099,7 @@ LOCAL VOID New_Server( INT Server, CONN_ID Idx ) Log( LOG_ERR, "Can't connect to \"%s\" (connection %d): ip address unknown!", Conf_Server[Server].host, Idx ); return; } - + Log( LOG_INFO, "Establishing connection to \"%s\", %s, port %d (connection %d) ... ", Conf_Server[Server].host, Conf_Server[Server].ip, Conf_Server[Server].port, Idx ); if( inet_aton( Conf_Server[Server].ip, &inaddr ) == 0 ) @@ -1101,7 +1128,7 @@ LOCAL VOID New_Server( INT Server, CONN_ID Idx ) connect( new_sock, (struct sockaddr *)&new_addr, sizeof( new_addr )); if( errno != EINPROGRESS ) { - + close( new_sock ); Init_Conn_Struct( Idx ); Log( LOG_CRIT, "Can't connect socket: %s!", strerror( errno )); @@ -1142,7 +1169,7 @@ LOCAL VOID Init_Conn_Struct( INT Idx ) My_Connections[Idx].rdatalen = 0; My_Connections[Idx].wbuf[0] = '\0'; My_Connections[Idx].wdatalen = 0; - My_Connections[Idx].our_server = -1; + My_Connections[Idx].our_server = NONE; My_Connections[Idx].lastdata = time( NULL ); My_Connections[Idx].lastping = 0; My_Connections[Idx].lastprivmsg = time( NULL );