commit - 6fd126d6f42198a47df23459c9346a3346f9def0
commit + bc140df80ba49e0cd148a0f1e502529bceab61e0
blob - 2c1a4a578d1d23d441b8eefbf81f26bf03b29aa2
blob + d2479db52a8310eca4961e89a938ae61f5358f94
--- src/ngircd/conn.c
+++ src/ngircd/conn.c
* 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.20 2001/12/29 22:09:43 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).
*
GLOBAL VOID Conn_Init( VOID )
{
+ /* Modul initialisieren: statische Strukturen "ausnullen". */
+
CONN_ID i;
/* zu Beginn haben wir keine Verbindungen */
GLOBAL VOID Conn_Exit( VOID )
{
+ /* Modul abmelden: alle noch offenen Connections
+ * schliessen und freigeben. */
+
CONN_ID idx;
INT i;
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;
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;
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 );
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;
LOCAL VOID Handle_Buffer( CONN_ID Idx )
{
+ /* Daten im Lese-Puffer einer Verbindung verarbeiten. */
+
CHAR *ptr, *ptr1, *ptr2;
INT len, delta;
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;
RES_STAT *s;
INT pid;
+ /* Speicher anfordern */
s = malloc( sizeof( RES_STAT ));
if( ! s )
{
return NULL;
}
+ /* Pipe fuer Antwort initialisieren */
if( pipe( s->pipe ) != 0 )
{
free( s );
return NULL;
}
+ /* Sub-Prozess erzeugen */
pid = fork( );
if( pid > 0 )
{
/* Haupt-Prozess */
- Log( LOG_DEBUG, "Resolver process for %s created (PID %d).", 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;
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;
}