X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Fconn.c;h=d2479db52a8310eca4961e89a938ae61f5358f94;hp=d22b0237f4ed09c16ea8094dc94ec0e9c0d29605;hb=bc140df80ba49e0cd148a0f1e502529bceab61e0;hpb=b9728ba2eac5d5d4669a1d8a0cc3d87d0a2a7247 diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c index d22b0237..d2479db5 100644 --- a/src/ngircd/conn.c +++ b/src/ngircd/conn.c @@ -9,11 +9,17 @@ * Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste * der an comBase beteiligten Autoren finden Sie in der Datei AUTHORS. * - * $Id: conn.c,v 1.19 2001/12/29 21:53:57 alex Exp $ + * $Id: conn.c,v 1.21 2001/12/29 22:33:36 alex Exp $ * * connect.h: Verwaltung aller Netz-Verbindungen ("connections") * * $Log: conn.c,v $ + * Revision 1.21 2001/12/29 22:33:36 alex + * - bessere Dokumentation des Modules bzw. der Funktionen. + * + * Revision 1.20 2001/12/29 22:09:43 alex + * - kleinere Aenderungen ("clean-ups") bei Logging (Resolver). + * * Revision 1.19 2001/12/29 21:53:57 alex * - Da hatte ich mich wohl ein wenig verrannt; jetzt sollte der Resolver * aber tatsaechlich funktionieren. @@ -175,6 +181,8 @@ LOCAL CONNECTION My_Connections[MAX_CONNECTIONS]; GLOBAL VOID Conn_Init( VOID ) { + /* Modul initialisieren: statische Strukturen "ausnullen". */ + CONN_ID i; /* zu Beginn haben wir keine Verbindungen */ @@ -191,6 +199,9 @@ GLOBAL VOID Conn_Init( VOID ) GLOBAL VOID Conn_Exit( VOID ) { + /* Modul abmelden: alle noch offenen Connections + * schliessen und freigeben. */ + CONN_ID idx; INT i; @@ -221,8 +232,9 @@ GLOBAL VOID Conn_Exit( VOID ) GLOBAL BOOLEAN Conn_NewListener( CONST INT Port ) { - /* Neuen Listen-Socket erzeugen: der Server wartet dann - * auf dem angegebenen Port auf Verbindungen. */ + /* Neuen Listen-Socket erzeugen: der Server wartet dann auf + * dem angegebenen Port auf Verbindungen. Kann der Listen- + * Socket nicht erteugt werden, so wird NULL geliefert.*/ struct sockaddr_in addr; INT sock, on = 1; @@ -284,6 +296,16 @@ GLOBAL BOOLEAN Conn_NewListener( CONST INT Port ) GLOBAL VOID Conn_Handler( INT Timeout ) { + /* Aktive Verbindungen ueberwachen. Mindestens alle "Timeout" + * Sekunden wird die Funktion verlassen. Folgende Aktionen + * werden durchgefuehrt: + * - neue Verbindungen annehmen, + * - geschlossene Verbindungen loeschen, + * - volle Schreibpuffer versuchen zu schreiben, + * - volle Lesepuffer versuchen zu verarbeiten, + * - Antworten von Resolver Sub-Prozessen annehmen. + */ + fd_set read_sockets, write_sockets; struct timeval tv; time_t start; @@ -432,7 +454,8 @@ GLOBAL BOOLEAN Conn_Write( CONN_ID Idx, CHAR *Data, INT Len ) GLOBAL VOID Conn_Close( CONN_ID Idx, CHAR *Msg ) { - /* Verbindung schliessen */ + /* Verbindung schliessen. Evtl. noch von Resolver + * Sub-Prozessen offene Pipes werden geschlossen. */ assert( Idx >= 0 ); assert( My_Connections[Idx].sock >= 0 ); @@ -496,7 +519,10 @@ LOCAL BOOLEAN Try_Write( CONN_ID Idx ) LOCAL VOID Handle_Read( INT Sock ) { - /* Aktivitaet auf einem Socket verarbeiten */ + /* Aktivitaet auf einem Socket verarbeiten: + * - neue Clients annehmen, + * - Daten von Clients verarbeiten, + * - Resolver-Rueckmeldungen annehmen. */ CONN_ID idx; @@ -684,6 +710,8 @@ LOCAL VOID Read_Request( CONN_ID Idx ) LOCAL VOID Handle_Buffer( CONN_ID Idx ) { + /* Daten im Lese-Puffer einer Verbindung verarbeiten. */ + CHAR *ptr, *ptr1, *ptr2; INT len, delta; @@ -724,7 +752,9 @@ LOCAL VOID Handle_Buffer( CONN_ID Idx ) LOCAL VOID Check_Connections( VOID ) { - /* Pruefen, ob Verbindungen noch "alive" sind */ + /* Pruefen, ob Verbindungen noch "alive" sind. Ist dies + * nicht der Fall, zunaechst PING-PONG spielen und, wenn + * auch das nicht "hilft", Client disconnectieren. */ INT i; @@ -779,6 +809,7 @@ LOCAL RES_STAT *Resolve( struct sockaddr_in *Addr ) RES_STAT *s; INT pid; + /* Speicher anfordern */ s = malloc( sizeof( RES_STAT )); if( ! s ) { @@ -786,6 +817,7 @@ LOCAL RES_STAT *Resolve( struct sockaddr_in *Addr ) return NULL; } + /* Pipe fuer Antwort initialisieren */ if( pipe( s->pipe ) != 0 ) { free( s ); @@ -793,11 +825,12 @@ LOCAL RES_STAT *Resolve( struct sockaddr_in *Addr ) return NULL; } + /* Sub-Prozess erzeugen */ pid = fork( ); if( pid > 0 ) { /* Haupt-Prozess */ - Log( LOG_DEBUG, "Resolver process for %s (PID %d) created.", inet_ntoa( Addr->sin_addr ), pid ); + Log( LOG_DEBUG, "Resolver for %s created (PID %d).", inet_ntoa( Addr->sin_addr ), pid ); FD_SET( s->pipe[0], &My_Resolvers ); if( s->pipe[0] > My_Max_Fd ) My_Max_Fd = s->pipe[0]; s->pid = pid; @@ -841,9 +874,9 @@ LOCAL VOID Read_Resolver_Result( INT r_fd ) return; } + /* zugehoerige Connection suchen */ for( i = 0; i < MAX_CONNECTIONS; i++ ) { - /* zugehoerige Connection suchen */ if(( My_Connections[i].sock >= 0 ) && ( My_Connections[i].res_stat ) && ( My_Connections[i].res_stat->pipe[0] == r_fd )) break; } @@ -864,11 +897,7 @@ LOCAL VOID Read_Resolver_Result( INT r_fd ) /* Hostnamen setzen */ strcpy( My_Connections[i].host, hostname ); c = Client_GetFromConn( i ); - if( c ) - { - Log( LOG_DEBUG, "Set hostname: \"%s\".", hostname ); - Client_SetHostname( c, hostname ); - } + if( c ) Client_SetHostname( c, hostname ); } /* Read_Resolver_Result */ @@ -887,7 +916,7 @@ LOCAL VOID Do_Resolve( struct sockaddr_in *Addr, INT w_fd ) if( h ) strcpy( hostname, h->h_name ); else { - Log_Resolver( LOG_WARNING, "Can't resolce host name (code %d)!", h_errno ); + Log_Resolver( LOG_WARNING, "Resolver: Can't resolve host name (code %d)!", h_errno ); strcpy( hostname, inet_ntoa( Addr->sin_addr )); }