X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fngircd%2Fresolve.c;h=a5ba32e4cd5cc32ca1bf83725702e98b013fd58c;hb=77f54693ef258b1fe65ee105fc026dfb2c6257dc;hp=14d53804853e281cfc6cb219cafbcbe890d30ae5;hpb=158bf554c3c56a8f1478297c7d3d04918e90180b;p=ngircd-alex.git diff --git a/src/ngircd/resolve.c b/src/ngircd/resolve.c index 14d53804..a5ba32e4 100644 --- a/src/ngircd/resolve.c +++ b/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.17 2005/07/31 20:13:08 alex Exp $"; #include "imp.h" #include @@ -39,30 +39,29 @@ static char UNUSED id[] = "$Id: resolve.c,v 1.12 2005/05/28 10:46:50 fw Exp $"; #include "exp.h" #include "resolve.h" +#include "io.h" #ifdef IDENTAUTH -LOCAL void Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, int Sock, int w_fd )); +static void Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, int Sock, int w_fd )); #else -LOCAL void Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, int w_fd )); +static void Do_ResolveAddr PARAMS(( struct sockaddr_in *Addr, int w_fd )); #endif -LOCAL void Do_ResolveName PARAMS(( char *Host, int w_fd )); +static void Do_ResolveName PARAMS(( char *Host, int w_fd )); #ifdef h_errno -LOCAL char *Get_Error PARAMS(( int H_Error )); +static char *Get_Error PARAMS(( int H_Error )); #endif -LOCAL RES_STAT *New_Res_Stat PARAMS(( void )); +static RES_STAT *New_Res_Stat PARAMS(( void )); -GLOBAL void -Resolve_Init( void ) -{ - /* Initialize module */ - - FD_ZERO( &Resolver_FDs ); -} /* Resolve_Init */ +static void +cb_resolver(int fd, short unused) { + (void) unused; /* shut up compiler warning */ + Read_Resolver_Result(fd); +} #ifdef IDENTAUTH @@ -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,36 +139,45 @@ 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 */ #ifdef IDENTAUTH -LOCAL void +static void Do_ResolveAddr( struct sockaddr_in *Addr, int Sock, int w_fd ) #else -LOCAL void +static void Do_ResolveAddr( struct sockaddr_in *Addr, int w_fd ) #endif { @@ -168,24 +185,46 @@ Do_ResolveAddr( struct sockaddr_in *Addr, int w_fd ) * pipe to parent. */ char hostname[HOST_LEN]; + char ipstr[HOST_LEN]; struct hostent *h; size_t len; + struct in_addr *addr; + char *ntoaptr; #ifdef IDENTAUTH char *res; #endif /* Resolve IP address */ +#ifdef DEBUG Log_Resolver( LOG_DEBUG, "Now resolving %s ...", inet_ntoa( Addr->sin_addr )); +#endif h = gethostbyaddr( (char *)&Addr->sin_addr, sizeof( Addr->sin_addr ), AF_INET ); - if( h ) strlcpy( hostname, h->h_name, sizeof( hostname )); - else - { + if (!h) { #ifdef h_errno Log_Resolver( LOG_WARNING, "Can't resolve address \"%s\": %s!", inet_ntoa( Addr->sin_addr ), Get_Error( h_errno )); #else Log_Resolver( LOG_WARNING, "Can't resolve address \"%s\"!", inet_ntoa( Addr->sin_addr )); #endif strlcpy( hostname, inet_ntoa( Addr->sin_addr ), sizeof( hostname )); + } else { + strlcpy( hostname, h->h_name, sizeof( hostname )); + + h = gethostbyname( hostname ); + if ( h ) { + if (memcmp(h->h_addr, &Addr->sin_addr, sizeof (struct in_addr))) { + addr = (struct in_addr*) h->h_addr; + strlcpy(ipstr, inet_ntoa(*addr), sizeof ipstr); + ntoaptr = inet_ntoa( Addr->sin_addr ); + Log(LOG_WARNING,"Possible forgery: %s resolved to %s (which is at ip %s!)", + ntoaptr, hostname, ipstr); + strlcpy( hostname, ntoaptr, sizeof hostname); + } + } else { + ntoaptr = inet_ntoa( Addr->sin_addr ); + Log(LOG_WARNING, "Possible forgery: %s resolved to %s (which has no ip address)", + ntoaptr, hostname); + strlcpy( hostname, ntoaptr, sizeof hostname); + } } Log_Resolver( LOG_DEBUG, "Ok, translated %s to \"%s\".", inet_ntoa( Addr->sin_addr ), hostname ); @@ -222,7 +261,7 @@ Do_ResolveAddr( struct sockaddr_in *Addr, int w_fd ) } /* Do_ResolveAddr */ -LOCAL void +static void Do_ResolveName( char *Host, int w_fd ) { /* Resolver sub-process: resolve name and write result into pipe @@ -266,7 +305,7 @@ Do_ResolveName( char *Host, int w_fd ) #ifdef h_errno -LOCAL char * +static char * Get_Error( int H_Error ) { /* Get error message for H_Error */ @@ -289,7 +328,7 @@ Get_Error( int H_Error ) #endif -LOCAL RES_STAT * +static RES_STAT * New_Res_Stat( void ) { RES_STAT *s; @@ -311,7 +350,7 @@ New_Res_Stat( void ) } s->stage = 0; - s->bufpos = 0; + array_init(&s->buffer); s->pid = -1; return s;