X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=blobdiff_plain;f=src%2Fngircd%2Fconn.c;h=4b48ffb842288c62f1265ef3ea7507debb3e89e4;hp=1819e36f62eb70105ed76a002471dd492769f5db;hb=439c945d56ecba14cce789c5725575667c066502;hpb=9eee0c883b22fef4c21dda6ffdabd41b58634527 diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c index 1819e36f..4b48ffb8 100644 --- a/src/ngircd/conn.c +++ b/src/ngircd/conn.c @@ -1,6 +1,6 @@ /* * ngIRCd -- The Next Generation IRC Daemon - * Copyright (c)2001,2002 by Alexander Barton (alex@barton.de) + * Copyright (c)2001-2003 by Alexander Barton (alex@barton.de) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: conn.c,v 1.115 2003/01/15 14:28:59 alex Exp $"; +static char UNUSED id[] = "$Id: conn.c,v 1.118 2003/03/07 14:35:52 alex Exp $"; #include "imp.h" #include @@ -40,7 +40,11 @@ static char UNUSED id[] = "$Id: conn.c,v 1.115 2003/01/15 14:28:59 alex Exp $"; #endif #ifdef HAVE_STDINT_H -#include /* u.a. fuer Mac OS X */ +#include /* e.g. for Mac OS X */ +#endif + +#ifdef USE_TCPWRAP +#include /* for TCP Wrappers */ #endif #include "defines.h" @@ -59,6 +63,10 @@ static char UNUSED id[] = "$Id: conn.c,v 1.115 2003/01/15 14:28:59 alex Exp $"; #include "parse.h" #include "tool.h" +#ifdef RENDEZVOUS +#include "rendezvous.h" +#endif + #include "exp.h" @@ -83,6 +91,11 @@ LOCAL fd_set My_Listeners; LOCAL fd_set My_Sockets; LOCAL fd_set My_Connects; +#ifdef USE_TCPWRAP +INT allow_severity = LOG_INFO; +INT deny_severity = LOG_ERR; +#endif + GLOBAL VOID Conn_Init( VOID ) @@ -132,8 +145,13 @@ Conn_Exit( VOID ) CONN_ID idx; INT i; - /* Sockets schliessen */ Log( LOG_DEBUG, "Shutting down all connections ..." ); + +#ifdef RENDEZVOUS + Rendezvous_UnregisterListeners( ); +#endif + + /* Sockets schliessen */ for( i = 0; i < Conn_MaxFD + 1; i++ ) { if( FD_ISSET( i, &My_Sockets )) @@ -195,6 +213,10 @@ Conn_ExitListeners( VOID ) INT i; +#ifdef RENDEZVOUS + Rendezvous_UnregisterListeners( ); +#endif + Log( LOG_INFO, "Shutting down all listening sockets ..." ); for( i = 0; i < Conn_MaxFD + 1; i++ ) { @@ -214,7 +236,10 @@ Conn_NewListener( CONST UINT Port ) struct sockaddr_in addr; INT sock; - +#ifdef RENDEZVOUS + CHAR name[CLIENT_ID_LEN], *info; +#endif + /* Server-"Listen"-Socket initialisieren */ memset( &addr, 0, sizeof( addr )); addr.sin_family = AF_INET; @@ -255,6 +280,34 @@ Conn_NewListener( CONST UINT Port ) Log( LOG_INFO, "Now listening on port %d (socket %d).", Port, sock ); +#ifdef RENDEZVOUS + /* Get best server description text */ + if( ! Conf_ServerInfo[0] ) info = Conf_ServerName; + else + { + /* Use server info string */ + info = NULL; + if( Conf_ServerInfo[0] == '[' ) + { + /* Cut off leading hostname part in "[]" */ + info = strchr( Conf_ServerInfo, ']' ); + if( info ) + { + info++; + while( *info == ' ' ) info++; + } + } + if( ! info ) info = Conf_ServerInfo; + } + + /* Add port number to description if non-standard */ + if( Port != 6667 ) snprintf( name, sizeof( name ), "%s (port %u)", info, Port ); + else strlcpy( name, info, sizeof( name )); + + /* Register service */ + Rendezvous_Register( name, RENDEZVOUS_TYPE, Port ); +#endif + return TRUE; } /* Conn_NewListener */ @@ -285,6 +338,10 @@ Conn_Handler( VOID ) { timeout = TRUE; +#ifdef RENDEZVOUS + Rendezvous_Handler( ); +#endif + /* Should the configuration be reloaded? */ if( NGIRCd_SignalRehash ) NGIRCd_Rehash( ); @@ -529,6 +586,17 @@ Conn_Close( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformClient ) assert( Idx > NONE ); assert( My_Connections[Idx].sock > NONE ); + /* Is this link already shutting down? */ + if( My_Connections[Idx].options & CONN_ISCLOSING ) + { + /* Conn_Close() has been called recursively for this link; + * probabe reason: Try_Write() failed -- see below. */ + return; + } + + /* Mark link as "closing" */ + My_Connections[Idx].options |= CONN_ISCLOSING; + /* Search client, if any */ c = Client_GetFromConn( Idx ); @@ -550,7 +618,7 @@ Conn_Close( CONN_ID Idx, CHAR *LogMsg, CHAR *FwdMsg, BOOLEAN InformClient ) } /* Try to write out the write buffer */ - Try_Write( Idx ); + (VOID)Try_Write( Idx ); /* Shut down socket */ if( close( My_Connections[Idx].sock ) != 0 ) @@ -777,6 +845,9 @@ New_Connection( INT Sock ) /* Neue Client-Verbindung von Listen-Socket annehmen und * CLIENT-Struktur anlegen. */ +#ifdef USE_TCPWRAP + struct request_info req; +#endif struct sockaddr_in new_addr; INT new_sock, new_sock_len; RES_STAT *s; @@ -795,6 +866,18 @@ New_Connection( INT Sock ) Log( LOG_CRIT, "Can't accept connection: %s!", strerror( errno )); return; } + +#ifdef USE_TCPWRAP + /* Validate socket using TCP Wrappers */ + request_init( &req, RQ_DAEMON, PACKAGE, RQ_FILE, new_sock, RQ_CLIENT_SIN, &new_addr, NULL ); + if( ! hosts_access( &req )) + { + /* Access denied! */ + Log( deny_severity, "Refused connection from %s (by TCP Wrappers)!", inet_ntoa( new_addr.sin_addr )); + close( new_sock ); + return; + } +#endif /* Socket initialisieren */ Init_Socket( new_sock );