commit - 158bf554c3c56a8f1478297c7d3d04918e90180b
commit + 8ac701d6c8be4bc1866645a5c28f562d968a2d07
blob - f076d232b5309550412dea6da68fbb06fd25d101
blob + f5d4967b1eb302dcd6b58e016e2bed0fe7dd5587
--- src/ngircd/conn.c
+++ src/ngircd/conn.c
#include "portab.h"
-static char UNUSED id[] = "$Id: conn.c,v 1.150 2005/05/22 23:55:58 alex Exp $";
+static char UNUSED id[] = "$Id: conn.c,v 1.151 2005/06/01 21:28:50 fw Exp $";
#include "imp.h"
#include <assert.h>
int deny_severity = LOG_ERR;
#endif
+LOCAL void
+FreeRes_stat( CONNECTION *c )
+{
+ assert( c != NULL );
+ assert( c->res_stat != NULL );
+ if (!c->res_stat) return;
+
+ FD_CLR( c->res_stat->pipe[0], &Resolver_FDs );
+
+ close( c->res_stat->pipe[0] );
+ close( c->res_stat->pipe[1] );
+
+ free( c->res_stat );
+ c->res_stat = NULL;
+}
+
+
GLOBAL void
Conn_Init( void )
{
for( i = 0; i < Pool_Size; i++ )
{
if ( My_Connections[i].sock > NONE ) {
- if ( My_Connections[i].host[0] == '\0' ) {
+ if ( My_Connections[i].res_stat ) {
/* wait for completion of Resolver Sub-Process */
FD_CLR( My_Connections[i].sock, &read_sockets );
continue;
/* Is there a resolver sub-process running? */
if( My_Connections[Idx].res_stat )
- {
- /* Free resolver structures */
- FD_CLR( My_Connections[Idx].res_stat->pipe[0], &Resolver_FDs );
- close( My_Connections[Idx].res_stat->pipe[0] );
- close( My_Connections[Idx].res_stat->pipe[1] );
- free( My_Connections[Idx].res_stat );
- }
+ FreeRes_stat( &My_Connections[Idx] );
/* Servers: Modify time of next connect attempt? */
Conf_UnsetServer( Idx );
assert( My_Connections[Idx].wdatalen > 0 );
/* Daten schreiben */
- len = send( My_Connections[Idx].sock, My_Connections[Idx].wbuf, My_Connections[Idx].wdatalen, 0 );
+ len = write( My_Connections[Idx].sock, My_Connections[Idx].wbuf, My_Connections[Idx].wdatalen );
if( len < 0 )
{
/* Operation haette Socket "nur" blockiert ... */
#else
s = Resolve_Addr( &new_addr );
#endif
- if( s )
- {
- /* Sub-Prozess wurde asyncron gestartet */
- My_Connections[idx].res_stat = s;
- }
+ /* resolver process has been started */
+ if( s ) My_Connections[idx].res_stat = s;
/* Penalty-Zeit setzen */
Conn_SetPenalty( idx, 4 );
strlcpy( Conf_Server[i].ip, Conf_Server[i].host, sizeof( Conf_Server[i].ip ));
strlcpy( My_Connections[idx].host, Conf_Server[i].host, sizeof( My_Connections[idx].host ));
s = Resolve_Name( Conf_Server[i].host );
- if( s )
- {
- /* Sub-Prozess wurde asyncron gestartet */
- My_Connections[idx].res_stat = s;
- }
+
+ /* resolver process running? */
+ if( s ) My_Connections[idx].res_stat = s;
}
} /* Check_Servers */
if( len < 0 )
{
/* Error! */
- close( r_fd );
Log( LOG_CRIT, "Resolver: Can't read result: %s!", strerror( errno ));
+ FreeRes_stat( &My_Connections[i] );
return;
}
s->bufpos += len;
/* Okay, we got a complete result: this is a host name for outgoing
* connections and a host name or IDENT user name (if enabled) for
- * incoming conneciions.*/
+ * incoming connections.*/
if( My_Connections[i].sock > NONE )
{
- /* Incoming connection */
-
- /* Search client ... */
+ /* Incoming connection. Search client ... */
c = Client_GetFromConn( i );
assert( c != NULL );
/* Only update client information of unregistered clients */
if( Client_Type( c ) == CLIENT_UNKNOWN )
{
- if( s->stage == 0 )
- {
- /* host name */
+ switch(s->stage) {
+ case 0: /* host name */
strlcpy( My_Connections[i].host, s->buffer, sizeof( My_Connections[i].host ));
Client_SetHostname( c, s->buffer );
-
#ifdef IDENTAUTH
/* clean up buffer for IDENT result */
len = strlen( s->buffer ) + 1;
+ assert(len <= sizeof( s->buffer ));
memmove( s->buffer, s->buffer + len, sizeof( s->buffer ) - len );
+ assert(len <= s->bufpos );
s->bufpos -= len;
/* Don't close pipe and clean up, but
* instead wait for IDENT result */
s->stage = 1;
goto try_resolve;
- }
- else if( s->stage == 1 )
- {
- /* IDENT user name */
+
+ case 1: /* IDENT user name */
if( s->buffer[0] )
{
Log( LOG_INFO, "IDENT lookup for connection %ld: \"%s\".", i, s->buffer );
}
else Log( LOG_INFO, "IDENT lookup for connection %ld: no result.", i );
#endif
+ break;
+ default:
+ Log( LOG_ERR, "Resolver: got result for unknown stage %d!?", s->stage );
}
- else Log( LOG_ERR, "Resolver: got result for unknown stage %d!?", s->stage );
}
#ifdef DEBUG
else Log( LOG_DEBUG, "Resolver: discarding result for already registered connection %d.", i );
}
/* Clean up ... */
- FD_CLR( r_fd, &Resolver_FDs );
- close( My_Connections[i].res_stat->pipe[0] );
- close( My_Connections[i].res_stat->pipe[1] );
- free( My_Connections[i].res_stat );
- My_Connections[i].res_stat = NULL;
+ FreeRes_stat( &My_Connections[i] );
/* Reset penalty time */
Conn_ResetPenalty( i );
assert( Sock > NONE );
assert( Msg != NULL );
- (void)send( Sock, Msg, strlen( Msg ), 0 );
- (void)send( Sock, "\r\n", 2, 0 );
+ (void)write( Sock, Msg, strlen( Msg ) );
+ (void)write( Sock, "\r\n", 2 );
} /* Simple_Error */