#include "portab.h"
#include "io.h"
-static char UNUSED id[] = "$Id: conn.c,v 1.183 2005/09/24 02:48:46 fw Exp $";
+static char UNUSED id[] = "$Id: conn.c,v 1.189 2006/02/08 17:33:28 fw Exp $";
#include "imp.h"
#include <assert.h>
static void Check_Servers PARAMS(( void ));
static void Init_Conn_Struct PARAMS(( CONN_ID Idx ));
static bool Init_Socket PARAMS(( int Sock ));
-static void New_Server PARAMS(( int Server, CONN_ID Idx ));
+static void New_Server PARAMS(( int Server ));
static void Simple_Message PARAMS(( int Sock, char *Msg ));
static int Count_Connections PARAMS(( struct sockaddr_in addr ));
static int NewListener PARAMS(( const UINT16 Port ));
static void server_login PARAMS((CONN_ID idx));
static void cb_Read_Resolver_Result PARAMS(( int sock, UNUSED short what));
+static void cb_Connect_to_Server PARAMS(( int sock, UNUSED short what));
static void cb_clientserver PARAMS((int sock, short what));
static void
CLIENT *c;
CONN_ID idx = Socket2Index( sock );
if (idx <= NONE) {
-#ifdef DEBUG
- Log(LOG_DEBUG, "cb_connserver wants to write on unknown socket?!");
-#endif
+ LogDebug("cb_connserver wants to write on unknown socket?!");
io_close(sock);
return;
}
res = getsockopt( My_Connections[idx].sock, SOL_SOCKET, SO_ERROR, &err, &sock_len );
assert( sock_len == sizeof( err ));
- /* Fehler aufgetreten? */
- if(( res != 0 ) || ( err != 0 )) {
- if ( res != 0 )
- Log( LOG_CRIT, "getsockopt (connection %d): %s!", idx, strerror( errno ));
- else
- Log( LOG_CRIT, "Can't connect socket to \"%s:%d\" (connection %d): %s!",
- My_Connections[idx].host, Conf_Server[Conf_GetServer( idx )].port,
- idx, strerror( err ));
-
- /* Clean up socket, connection and client structures */
- c = Client_GetFromConn( idx );
- if( c ) Client_DestroyNow( c );
- io_close( My_Connections[idx].sock );
- Init_Conn_Struct( idx );
-
- /* Bei Server-Verbindungen lasttry-Zeitpunkt auf "jetzt" setzen */
- Conf_Server[Conf_GetServer( idx )].lasttry = time( NULL );
- Conf_UnsetServer( idx );
- return;
+ /* Error while connecting? */
+ if ((res != 0) || (err != 0)) {
+ if (res != 0)
+ Log(LOG_CRIT, "getsockopt (connection %d): %s!",
+ idx, strerror(errno));
+ else
+ Log(LOG_CRIT,
+ "Can't connect socket to \"%s:%d\" (connection %d): %s!",
+ My_Connections[idx].host,
+ Conf_Server[Conf_GetServer(idx)].port,
+ idx, strerror(err));
+
+ /* Clean up the CLIENT structure (to avoid silly log
+ * messages) and call Conn_Close() to do the rest. */
+ c = Client_GetFromConn(idx);
+ if (c)
+ Client_DestroyNow(c);
+
+ Conn_Close(idx, "Can't connect!", NULL, false);
+
+ return;
}
Conn_OPTION_DEL( &My_Connections[idx], CONN_ISCONNECTING );
Log( LOG_EMERG, "Can't allocate memory! [Conn_Init]" );
exit( 1 );
}
-#ifdef DEBUG
- Log( LOG_DEBUG, "Allocated connection pool for %d items (%ld bytes).", Pool_Size, sizeof( CONNECTION ) * Pool_Size );
-#endif
+ LogDebug("Allocated connection pool for %d items (%ld bytes).", Pool_Size,
+ sizeof( CONNECTION ) * Pool_Size );
array_free( &My_Listeners );
- /* Groesster File-Descriptor fuer select() */
- Conn_MaxFD = 0;
-
/* Connection-Struktur initialisieren */
for( i = 0; i < Pool_Size; i++ ) Init_Conn_Struct( i );
CONN_ID idx;
-#ifdef DEBUG
- Log( LOG_DEBUG, "Shutting down all connections ..." );
-#endif
+ LogDebug("Shutting down all connections ..." );
Conn_ExitListeners();
assert(fd);
assert(*fd >= 0);
io_close(*fd);
-#ifdef DEBUG
- Log( LOG_DEBUG, "Listening socket %d closed.", *fd );
-#endif
+ LogDebug("Listening socket %d closed.", *fd );
fd++;
}
array_free(&My_Listeners);
#endif
/* Should the configuration be reloaded? */
- if( NGIRCd_SignalRehash ) NGIRCd_Rehash( );
+ if (NGIRCd_SignalRehash) {
+ NGIRCd_Rehash( );
+ }
/* Check configured servers and established links */
Check_Servers( );
* "Handler-Durchlauf" kann es passieren, dass dem nicht mehr so
* ist, wenn einer von mehreren Conn_Write()'s fehlgeschlagen ist.
* In diesem Fall wird hier einfach ein Fehler geliefert. */
- if( My_Connections[Idx].sock <= NONE )
- {
-#ifdef DEBUG
- Log( LOG_DEBUG, "Skipped write on closed socket (connection %d).", Idx );
-#endif
+ if( My_Connections[Idx].sock <= NONE ) {
+ LogDebug("Skipped write on closed socket (connection %d).", Idx );
return false;
}
if( Conn_OPTION_ISSET( &My_Connections[Idx], CONN_ISCLOSING )) {
/* Conn_Close() has been called recursively for this link;
* probabe reason: Handle_Write() failed -- see below. */
-#ifdef DEBUG
- Log( LOG_DEBUG, "Recursive request to close connection: %d", Idx );
-#endif
+ LogDebug("Recursive request to close connection: %d", Idx );
return;
}
Conn_WriteStr(Idx, "ERROR :Closing connection.");
}
- /* Try to write out the write buffer */
+ /* Try to write out the write buffer. Note: Handle_Write() eventually
+ * removes the CLIENT structure associated with this connection if an
+ * error occurs! So we have to re-check if there is still an valid
+ * CLIENT structure after calling Handle_Write() ...*/
(void)Handle_Write( Idx );
+ /* Search client, if any (re-check!) */
+ c = Client_GetFromConn( Idx );
+
/* Shut down socket */
if( ! io_close( My_Connections[Idx].sock ))
{
Init_Conn_Struct( Idx );
#ifdef DEBUG
- Log( LOG_DEBUG, "Shutdown of connection %d completed.", Idx );
+ LogDebug("Shutdown of connection %d completed.", Idx );
#endif
} /* Conn_Close */
CONN_ID i;
int c;
- for( i = 0; i < Pool_Size; i++ )
- {
+ for( i = 0; i < Pool_Size; i++ ) {
/* Established connection? */
- if( My_Connections[i].sock <= NONE ) continue;
+ if (My_Connections[i].sock < 0)
+ continue;
/* Server connection? */
client = Client_GetFromConn( i );
if( ! Conf_Server[c].host[0] ) continue;
/* Duplicate? */
- if( strcmp( Conf_Server[c].name, Client_ID( client )) == 0 ) Conf_Server[c].conn_id = i;
+ if( strcmp( Conf_Server[c].name, Client_ID( client )) == 0 )
+ Conf_Server[c].conn_id = i;
}
}
} /* SyncServerStruct */
assert( Idx > NONE );
if ( My_Connections[Idx].sock < 0 ) {
-#ifdef DEBUG
- Log(LOG_DEBUG,
- "Handle_Write() on closed socket, connection %d", Idx);
-#endif
+ LogDebug("Handle_Write() on closed socket, connection %d", Idx);
return false;
}
assert( My_Connections[Idx].sock > NONE );
-#ifdef DEBUG
- Log(LOG_DEBUG, "Handle_Write() called for connection %d ...", Idx);
-#endif
+ LogDebug("Handle_Write() called for connection %d ...", Idx);
wdatalen = array_bytes(&My_Connections[Idx].wbuf );
#ifdef ZLIB
struct request_info req;
#endif
struct sockaddr_in new_addr;
- int new_sock, new_sock_len;
- CONN_ID idx;
+ int i, new_sock, new_sock_len;
CLIENT *c;
POINTER *ptr;
long new_size, cnt;
return -1;
}
- /* Freie Connection-Struktur suchen */
- for( idx = 0; idx < Pool_Size; idx++ ) if( My_Connections[idx].sock == NONE ) break;
- if( idx >= Pool_Size )
- {
+#ifdef DEBUG
+ if (new_sock < Pool_Size)
+ assert(My_Connections[new_sock].sock == NONE );
+#endif
+ if( new_sock >= Pool_Size ) {
new_size = Pool_Size + CONNECTION_POOL;
/* Im bisherigen Pool wurde keine freie Connection-Struktur mehr gefunden.
* Wenn erlaubt und moeglich muss nun der Pool vergroessert werden: */
-
if( Conf_MaxConnections > 0 )
{
/* Es ist ein Limit konfiguriert */
return -1;
}
-#ifdef DEBUG
- Log( LOG_DEBUG, "Allocated new connection pool for %ld items (%ld bytes). [realloc()]", new_size, sizeof( CONNECTION ) * new_size );
-#endif
+ LogDebug("Allocated new connection pool for %ld items (%ld bytes). [realloc()]",
+ new_size, sizeof( CONNECTION ) * new_size );
/* Adjust pointer to new block */
My_Connections = (CONNECTION *)ptr;
/* Initialize new items */
- for( idx = Pool_Size; idx < new_size; idx++ ) Init_Conn_Struct( idx );
- idx = Pool_Size;
+ for( i = Pool_Size; i < new_size; i++ )
+ Init_Conn_Struct( i );
/* Adjust new pool size */
Pool_Size = new_size;
}
/* Client-Struktur initialisieren */
- c = Client_NewLocal( idx, inet_ntoa( new_addr.sin_addr ), CLIENT_UNKNOWN, false );
+ c = Client_NewLocal( new_sock, inet_ntoa( new_addr.sin_addr ), CLIENT_UNKNOWN, false );
if( ! c ) {
Log( LOG_ALERT, "Can't accept connection: can't create client structure!" );
Simple_Message( new_sock, "ERROR :Internal error" );
}
/* Verbindung registrieren */
- Init_Conn_Struct( idx );
- My_Connections[idx].sock = new_sock;
- My_Connections[idx].addr = new_addr;
+ Init_Conn_Struct( new_sock );
+ My_Connections[new_sock].sock = new_sock;
+ My_Connections[new_sock].addr = new_addr;
/* Neuen Socket registrieren */
if (!io_event_create( new_sock, IO_WANTREAD, cb_clientserver)) {
Simple_Message( new_sock, "ERROR :Internal error" );
- Conn_Close( idx, "io_event_create() failed", NULL, false );
+ Conn_Close( new_sock, "io_event_create() failed", NULL, false );
return -1;
}
- Log( LOG_INFO, "Accepted connection %d from %s:%d on socket %d.", idx, inet_ntoa( new_addr.sin_addr ), ntohs( new_addr.sin_port), Sock );
+ LogDebug( "Accepted connection %d from %s:%d on socket %d.", new_sock,
+ inet_ntoa( new_addr.sin_addr ), ntohs( new_addr.sin_port), Sock );
/* Hostnamen ermitteln */
- strlcpy( My_Connections[idx].host, inet_ntoa( new_addr.sin_addr ), sizeof( My_Connections[idx].host ));
- Client_SetHostname( c, My_Connections[idx].host );
+ strlcpy( My_Connections[new_sock].host, inet_ntoa( new_addr.sin_addr ),
+ sizeof( My_Connections[new_sock].host ));
+
+ Client_SetHostname( c, My_Connections[new_sock].host );
- Resolve_Addr(&My_Connections[idx].res_stat, &new_addr,
- My_Connections[idx].sock, cb_Read_Resolver_Result);
+ Resolve_Addr(&My_Connections[new_sock].res_stat, &new_addr,
+ My_Connections[new_sock].sock, cb_Read_Resolver_Result);
/* Penalty-Zeit setzen */
- Conn_SetPenalty( idx, 4 );
+ Conn_SetPenalty( new_sock, 4 );
return new_sock;
} /* New_Connection */
{
/* zum Socket passende Connection suchen */
- CONN_ID idx;
-
- assert( Sock > NONE );
-
- for( idx = 0; idx < Pool_Size; idx++ ) if( My_Connections[idx].sock == Sock ) break;
+ assert( Sock >= 0 );
- if( idx >= Pool_Size )
- {
+ if( Sock >= Pool_Size || My_Connections[Sock].sock != Sock ) {
/* die Connection wurde vermutlich (wegen eines
* Fehlers) bereits wieder abgebaut ... */
-#ifdef DEBUG
- Log( LOG_DEBUG, "Socket2Index: can't get connection for socket %d!", Sock );
-#endif
+
+ LogDebug( "Socket2Index: can't get connection for socket %d!", Sock );
return NONE;
}
- else return idx;
+ return Sock;
} /* Socket2Index */
result = true;
array_moveleft(&My_Connections[Idx].rbuf, 1, len);
-#ifdef DEBUG
- Log(LOG_DEBUG,
- "Connection %d: %d bytes left in read buffer.",
- Idx, array_bytes(&My_Connections[Idx].rbuf));
-#endif
+
+ LogDebug("Connection %d: %d bytes left in read buffer.", Idx,
+ array_bytes(&My_Connections[Idx].rbuf));
#ifdef ZLIB
if(( ! old_z ) && ( My_Connections[Idx].options & CONN_ZIP ) &&
( array_bytes(&My_Connections[Idx].rbuf) > 0 ))
return false;
array_trunc(&My_Connections[Idx].rbuf);
-#ifdef DEBUG
- Log( LOG_DEBUG, "Moved already received data (%u bytes) to uncompression buffer.",
+
+ LogDebug("Moved already received data (%u bytes) to uncompression buffer.",
array_bytes(&My_Connections[Idx].zip.rbuf));
-#endif /* DEBUG */
}
#endif /* ZLIB */
}
/* we already sent a ping */
if( My_Connections[i].lastping < time( NULL ) - Conf_PongTimeout ) {
/* Timeout */
-#ifdef DEBUG
- Log( LOG_DEBUG, "Connection %d: Ping timeout: %d seconds.", i, Conf_PongTimeout );
-#endif
+
+ LogDebug("Connection %d: Ping timeout: %d seconds.", i,
+ Conf_PongTimeout );
Conn_Close( i, NULL, "Ping timeout", true );
}
}
else if( My_Connections[i].lastdata < time( NULL ) - Conf_PingTimeout ) {
/* we need to sent a PING */
-#ifdef DEBUG
- Log( LOG_DEBUG, "Connection %d: sending PING ...", i );
-#endif
+ LogDebug("Connection %d: sending PING ...", i );
My_Connections[i].lastping = time( NULL );
Conn_WriteStr( i, "PING :%s", Client_ID( Client_ThisServer( )));
}
if (My_Connections[i].lastdata <
time(NULL) - Conf_PongTimeout) {
-#ifdef DEBUG
- Log(LOG_DEBUG,
- "Unregistered connection %d timed out ...",
- i);
-#endif
+ LogDebug("Unregistered connection %d timed out ...", i);
Conn_Close(i, NULL, "Timeout", false);
}
}
{
/* Check if we can establish further server links */
- CONN_ID idx;
int i, n;
time_t time_now;
- /* Search all connections, are there results from the resolver? */
- for( idx = 0; idx < Pool_Size; idx++ ) {
- if( My_Connections[idx].sock != SERVER_WAIT ) continue;
-
- /* IP resolved? */
- if (Resolve_SUCCESS(&My_Connections[idx].res_stat))
- New_Server(Conf_GetServer( idx ), idx);
- }
-
/* Check all configured servers */
for( i = 0; i < MAX_SERVERS; i++ ) {
/* Valid outgoing server which isn't already connected or disabled? */
/* Okay, try to connect now */
Conf_Server[i].lasttry = time_now;
-
- /* Search free connection structure */
- for( idx = 0; idx < Pool_Size; idx++ ) if( My_Connections[idx].sock == NONE ) break;
- if (idx >= Pool_Size) {
- Log( LOG_ALERT, "Can't establist server connection: connection limit reached (%d)!",
- Pool_Size );
- return;
- }
-#ifdef DEBUG
- Log( LOG_DEBUG, "Preparing connection %d for \"%s\" ...", idx, Conf_Server[i].host );
-#endif
-
- Init_Conn_Struct( idx );
- My_Connections[idx].sock = SERVER_WAIT;
- Conf_Server[i].conn_id = idx;
-
- /* Resolve Hostname. If this fails, try to use it as an IP address */
- 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 ));
-
- assert(Resolve_Getfd(&My_Connections[idx].res_stat) < 0);
-
- Resolve_Name(&My_Connections[idx].res_stat, Conf_Server[i].host, cb_Read_Resolver_Result);
+ assert(Resolve_Getfd(&Conf_Server[i].res_stat) < 0);
+ Resolve_Name(&Conf_Server[i].res_stat, Conf_Server[i].host, cb_Connect_to_Server);
}
} /* Check_Servers */
static void
-New_Server( int Server, CONN_ID Idx )
+New_Server( int Server )
{
/* Establish new server link */
CLIENT *c;
assert( Server > NONE );
- assert( Idx > NONE );
Log( LOG_INFO, "Establishing connection to \"%s\", %s, port %d ... ", Conf_Server[Server].host,
Conf_Server[Server].ip, Conf_Server[Server].port );
if( inaddr.s_addr == (unsigned)-1 )
#endif
{
- /* Can't convert IP address */
- Log( LOG_ERR, "Can't connect to \"%s\" (connection %d): can't convert ip address %s!", Conf_Server[Server].host, Idx, Conf_Server[Server].ip );
- goto out;
+ Log( LOG_ERR, "Can't connect to \"%s\": can't convert ip address %s!",
+ Conf_Server[Server].host, Conf_Server[Server].ip );
+ return;
}
memset( &new_addr, 0, sizeof( new_addr ));
new_sock = socket( PF_INET, SOCK_STREAM, 0 );
if ( new_sock < 0 ) {
- /* Can't create socket */
Log( LOG_CRIT, "Can't create socket: %s!", strerror( errno ));
- goto out;
+ return;
}
if( ! Init_Socket( new_sock )) return;
res = connect( new_sock, (struct sockaddr *)&new_addr, sizeof( new_addr ));
if(( res != 0 ) && ( errno != EINPROGRESS )) {
- /* Can't connect socket */
Log( LOG_CRIT, "Can't connect socket: %s!", strerror( errno ));
close( new_sock );
- goto out;
+ return;
+ }
+ if (new_sock >= Pool_Size) {
+ Log( LOG_ALERT, "Can't establist server connection: connection limit reached (%d)!",
+ Pool_Size );
+ close( new_sock );
+ return;
}
- /* Client-Struktur initialisieren */
- c = Client_NewLocal( Idx, inet_ntoa( new_addr.sin_addr ), CLIENT_UNKNOWNSERVER, false );
+ assert(My_Connections[new_sock].sock < 0 );
+
+ Init_Conn_Struct(new_sock);
+
+ c = Client_NewLocal( new_sock, inet_ntoa( new_addr.sin_addr ), CLIENT_UNKNOWNSERVER, false );
if( ! c ) {
- /* Can't create new client structure */
Log( LOG_ALERT, "Can't establish connection: can't create client structure!" );
close( new_sock );
- goto out;
+ return;
}
Client_SetIntroducer( c, c );
Client_SetToken( c, TOKEN_OUTBOUND );
/* Register connection */
- My_Connections[Idx].sock = new_sock;
- My_Connections[Idx].addr = new_addr;
- strlcpy( My_Connections[Idx].host, Conf_Server[Server].host, sizeof( My_Connections[Idx].host ));
+ Conf_Server[Server].conn_id = new_sock;
+ My_Connections[new_sock].sock = new_sock;
+ My_Connections[new_sock].addr = new_addr;
+ strlcpy( My_Connections[new_sock].host, Conf_Server[Server].host,
+ sizeof(My_Connections[new_sock].host ));
/* Register new socket */
if (!io_event_create( new_sock, IO_WANTWRITE, cb_connserver)) {
Log( LOG_ALERT, "io_event_create(): could not add fd %d", strerror(errno));
- Conn_Close( Idx, "io_event_create() failed", NULL, false );
- goto out;
+ Conn_Close( new_sock, "io_event_create() failed", NULL, false );
+ Init_Conn_Struct( new_sock );
+ Conf_Server[Server].conn_id = NONE;
}
-#ifdef DEBUG
- Log( LOG_DEBUG, "Registered new connection %d on socket %d.", Idx, My_Connections[Idx].sock );
-#endif
- Conn_OPTION_ADD( &My_Connections[Idx], CONN_ISCONNECTING );
- return;
-out:
- Init_Conn_Struct( Idx );
- Conf_Server[Server].conn_id = NONE;
+ LogDebug("Registered new connection %d on socket %d.", new_sock, My_Connections[new_sock].sock );
+ Conn_OPTION_ADD( &My_Connections[new_sock], CONN_ISCONNECTING );
} /* New_Server */
/* Connection-Struktur initialisieren */
memset( &My_Connections[Idx], 0, sizeof ( CONNECTION ));
- My_Connections[Idx].sock = NONE;
+ My_Connections[Idx].sock = -1;
My_Connections[Idx].lastdata = now;
My_Connections[Idx].lastprivmsg = now;
Resolve_Init(&My_Connections[Idx].res_stat);
/* Set type of service (TOS) */
#if defined(IP_TOS) && defined(IPTOS_LOWDELAY)
value = IPTOS_LOWDELAY;
-#ifdef DEBUG
- Log( LOG_DEBUG, "Setting option IP_TOS on socket %d to IPTOS_LOWDELAY (%d).", Sock, value );
-#endif
+
+ LogDebug("Setting option IP_TOS on socket %d to IPTOS_LOWDELAY (%d).", Sock, value );
if( setsockopt( Sock, SOL_IP, IP_TOS, &value, (socklen_t)sizeof( value )) != 0 )
{
Log( LOG_ERR, "Can't set socket option IP_TOS: %s!", strerror( errno ));
} /* Init_Socket */
+
+static void
+cb_Connect_to_Server(int fd, UNUSED short events)
+{
+ /* Read result of resolver sub-process from pipe and start connection */
+ int i;
+ size_t len;
+ char readbuf[HOST_LEN + 1];
+
+ LogDebug("Resolver: Got forward lookup callback on fd %d, events %d", fd, events);
+
+ for (i=0; i < MAX_SERVERS; i++) {
+ if (Resolve_Getfd(&Conf_Server[i].res_stat) == fd )
+ break;
+ }
+
+ if( i >= MAX_SERVERS) {
+ /* Ops, no matching server found?! */
+ io_close( fd );
+ LogDebug("Resolver: Got Forward Lookup callback for unknown server!?" );
+ return;
+ }
+
+ /* Read result from pipe */
+ len = Resolve_Read(&Conf_Server[i].res_stat, readbuf, sizeof readbuf -1);
+ if (len == 0)
+ return;
+
+ readbuf[len] = '\0';
+ LogDebug("Got result from resolver: \"%s\" (%u bytes read).", readbuf, len);
+ strlcpy( Conf_Server[i].ip, readbuf, sizeof( Conf_Server[i].ip ));
+
+ /* connect() */
+ New_Server(i);
+} /* cb_Read_Forward_Lookup */
+
+
static void
cb_Read_Resolver_Result( int r_fd, UNUSED short events )
{
* IDENT user name.*/
CLIENT *c;
- int i, n;
+ int i;
size_t len;
char *identptr;
#ifdef IDENTAUTH
char readbuf[HOST_LEN + 1];
#endif
-#ifdef DEBUG
- Log( LOG_DEBUG, "Resolver: Got callback on fd %d, events %d", r_fd, events );
-#endif
+ LogDebug("Resolver: Got callback on fd %d, events %d", r_fd, events );
/* Search associated connection ... */
for( i = 0; i < Pool_Size; i++ ) {
/* Ops, none found? Probably the connection has already
* been closed!? We'll ignore that ... */
io_close( r_fd );
-#ifdef DEBUG
- Log( LOG_DEBUG, "Resolver: Got callback for unknown connection!?" );
-#endif
+ LogDebug("Resolver: Got callback for unknown connection!?");
return;
}
/* Read result from pipe */
len = Resolve_Read(&My_Connections[i].res_stat, readbuf, sizeof readbuf -1);
- if (len == 0)
+ if (len == 0)
return;
readbuf[len] = '\0';
}
*identptr = '\0';
-#ifdef DEBUG
- Log( LOG_DEBUG, "Got result from resolver: \"%s\" (%u bytes read).", readbuf, len);
-#endif
+
+ LogDebug( "Got result from resolver: \"%s\" (%u bytes read).", readbuf, len);
+
/* Okay, we got a complete result: this is a host name for outgoing
* connections and a host name and IDENT user name (if enabled) for
* incoming connections.*/
- if( My_Connections[i].sock > NONE ) {
- /* Incoming connection. Search client ... */
- c = Client_GetFromConn( i );
- assert( c != NULL );
-
- /* Only update client information of unregistered clients */
- if( Client_Type( c ) == CLIENT_UNKNOWN ) {
- strlcpy(My_Connections[i].host, readbuf, sizeof( My_Connections[i].host));
- Client_SetHostname( c, readbuf);
+ assert ( My_Connections[i].sock >= 0 );
+ /* Incoming connection. Search client ... */
+ c = Client_GetFromConn( i );
+ assert( c != NULL );
+
+ /* Only update client information of unregistered clients */
+ if( Client_Type( c ) == CLIENT_UNKNOWN ) {
+ strlcpy(My_Connections[i].host, readbuf, sizeof( My_Connections[i].host));
+ Client_SetHostname( c, readbuf);
#ifdef IDENTAUTH
- ++identptr;
- if (*identptr) {
- Log( LOG_INFO, "IDENT lookup for connection %ld: \"%s\".", i, identptr);
- Client_SetUser( c, identptr, true );
- } else {
- Log( LOG_INFO, "IDENT lookup for connection %ld: no result.", i );
- }
-#endif
+ ++identptr;
+ if (*identptr) {
+ Log( LOG_INFO, "IDENT lookup for connection %ld: \"%s\".", i, identptr);
+ Client_SetUser( c, identptr, true );
+ } else {
+ Log( LOG_INFO, "IDENT lookup for connection %ld: no result.", i );
}
+#endif
+ }
#ifdef DEBUG
else Log( LOG_DEBUG, "Resolver: discarding result for already registered connection %d.", i );
#endif
- } else {
- /* Outgoing connection (server link): set the IP address
- * so that we can connect to it in the main loop. */
-
- /* Search server ... */
- n = Conf_GetServer( i );
- assert( n > NONE );
-
- strlcpy( Conf_Server[n].ip, readbuf, sizeof( Conf_Server[n].ip ));
- }
-
/* Reset penalty time */
Conn_ResetPenalty( i );
} /* cb_Read_Resolver_Result */