Commit Diff


commit - 7eca418465cf3c74c7aee6dfc9a2ab9ba7fbfcfe
commit + afef7dee82264a5c0981ac66584c8888a1329827
blob - 14d53804853e281cfc6cb219cafbcbe890d30ae5
blob + d261fd0a5873c2c7242b01d190d6bddc7dde7428
--- src/ngircd/resolve.c
+++ src/ngircd/resolve.c
@@ -14,7 +14,7 @@
 
 #include "portab.h"
 
-static char UNUSED id[] = "$Id: resolve.c,v 1.12 2005/05/28 10:46:50 fw Exp $";
+static char UNUSED id[] = "$Id: resolve.c,v 1.13 2005/07/07 18:39:08 fw Exp $";
 
 #include "imp.h"
 #include <assert.h>
@@ -39,6 +39,7 @@ static char UNUSED id[] = "$Id: resolve.c,v 1.12 2005/
 
 #include "exp.h"
 #include "resolve.h"
+#include "io.h"
 
 
 #ifdef IDENTAUTH
@@ -56,15 +57,13 @@ LOCAL char *Get_Error PARAMS(( int H_Error ));
 LOCAL RES_STAT *New_Res_Stat PARAMS(( void ));
 
 
-GLOBAL void
-Resolve_Init( void )
-{
-	/* Initialize module */
+static void
+cb_resolver(int fd, short unused) {
+	(void) unused;	/* shut up compiler warning */
+	Read_Resolver_Result(fd);
+}
 
-	FD_ZERO( &Resolver_FDs );
-} /* Resolve_Init */
 
-
 #ifdef IDENTAUTH
 GLOBAL RES_STAT *
 Resolve_Addr( struct sockaddr_in *Addr, int Sock )
@@ -86,15 +85,24 @@ Resolve_Addr( struct sockaddr_in *Addr )
 	pid = fork( );
 	if( pid > 0 )
 	{
+		close( s->pipe[1] );
 		/* Main process */
 		Log( LOG_DEBUG, "Resolver for %s created (PID %d).", inet_ntoa( Addr->sin_addr ), pid );
-		FD_SET( s->pipe[0], &Resolver_FDs );
-		if( s->pipe[0] > Conn_MaxFD ) Conn_MaxFD = s->pipe[0];
+		if (!io_setnonblock( s->pipe[0] )) {
+			Log( LOG_DEBUG, "Could not set Non-Blocking mode for pipefd %d", s->pipe[0] );
+			goto out;
+		}
+		if (!io_event_create( s->pipe[0], IO_WANTREAD, cb_resolver )) {
+			Log( LOG_DEBUG, "Could not add pipefd %dto event watchlist: %s",
+								s->pipe[0], strerror(errno) );
+			goto out;
+		}
 		s->pid = pid;
 		return s;
 	}
 	else if( pid == 0 )
 	{
+		close( s->pipe[0] );
 		/* Sub process */
 		Log_Init_Resolver( );
 #ifdef IDENTAUTH
@@ -105,13 +113,13 @@ Resolve_Addr( struct sockaddr_in *Addr )
 		Log_Exit_Resolver( );
 		exit( 0 );
 	}
-	else
-	{
-		/* Error! */
-		free( s );
-		Log( LOG_CRIT, "Resolver: Can't fork: %s!", strerror( errno ));
-		return NULL;
-	}
+	
+	Log( LOG_CRIT, "Resolver: Can't fork: %s!", strerror( errno ));
+
+out: /* Error! */
+	close( s->pipe[0] );
+	free( s );
+return NULL;
 } /* Resolve_Addr */
 
 
@@ -131,28 +139,37 @@ Resolve_Name( char *Host )
 	pid = fork( );
 	if( pid > 0 )
 	{
+		close( s->pipe[1] );
 		/* Main process */
 		Log( LOG_DEBUG, "Resolver for \"%s\" created (PID %d).", Host, pid );
-		FD_SET( s->pipe[0], &Resolver_FDs );
-		if( s->pipe[0] > Conn_MaxFD ) Conn_MaxFD = s->pipe[0];
+		if (!io_setnonblock( s->pipe[0] )) {
+			Log( LOG_DEBUG, "Could not set Non-Blocking mode for pipefd %d", s->pipe[0] );
+			goto out;
+		}
+		if (!io_event_create( s->pipe[0], IO_WANTREAD, cb_resolver )) {
+			Log( LOG_DEBUG, "Could not add pipefd %dto event watchlist: %s",
+								s->pipe[0], strerror(errno) );
+			goto out;
+		}
 		s->pid = pid;
 		return s;
 	}
 	else if( pid == 0 )
 	{
+		close( s->pipe[0] );
 		/* Sub process */
 		Log_Init_Resolver( );
 		Do_ResolveName( Host, s->pipe[1] );
 		Log_Exit_Resolver( );
 		exit( 0 );
 	}
-	else
-	{
-		/* Error! */
-		free( s );
-		Log( LOG_CRIT, "Resolver: Can't fork: %s!", strerror( errno ));
-		return NULL;
-	}
+
+	Log( LOG_CRIT, "Resolver: Can't fork: %s!", strerror( errno ));
+
+out: /* Error! */
+	close( s->pipe[0] );
+	free( s );
+	return NULL;
 } /* Resolve_Name */