From: Alexander Barton Date: Thu, 11 Sep 2003 12:05:28 +0000 (+0000) Subject: New configuration option "Listen" to bind the server to a specific ip. X-Git-Tag: rel-0-8-0-pre1~77 X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd-alex.git;a=commitdiff_plain;h=e33ab90379240cc99f0790d5d68a688ea32d4d9a New configuration option "Listen" to bind the server to a specific ip. --- diff --git a/ChangeLog b/ChangeLog index 111dad27..fc3767a2 100644 --- a/ChangeLog +++ b/ChangeLog @@ -12,6 +12,8 @@ ngIRCd CVS-HEAD + - Added new configuration variable "Listen" to bind all listening + sockets of the server to a single IP address. - Suppress misleading error message of diff during make run. - Enhanced test-suite and made it work on GNU/Hurd. - Fixed minor typo in debug output :-) @@ -464,4 +466,4 @@ ngIRCd 0.0.1, 31.12.2001 -- -$Id: ChangeLog,v 1.210 2003/09/09 13:24:41 alex Exp $ +$Id: ChangeLog,v 1.211 2003/09/11 12:05:28 alex Exp $ diff --git a/NEWS b/NEWS index 4ace4102..c55b2b4e 100644 --- a/NEWS +++ b/NEWS @@ -10,6 +10,11 @@ -- NEWS -- +ngIRCd CVS-HEAD + + - Added new configuration variable "Listen" to bind all listening + sockets of the server to a single IP address. + ngIRCd 0.7.1 (2003-07-18) - Added support for GNU/Hurd. @@ -165,4 +170,4 @@ ngIRCd 0.0.1, 31.12.2001 -- -$Id: NEWS,v 1.57 2003/08/30 20:37:15 alex Exp $ +$Id: NEWS,v 1.58 2003/09/11 12:05:28 alex Exp $ diff --git a/doc/sample-ngircd.conf b/doc/sample-ngircd.conf index ca5c2992..354b54ef 100644 --- a/doc/sample-ngircd.conf +++ b/doc/sample-ngircd.conf @@ -1,4 +1,4 @@ -# $Id: sample-ngircd.conf,v 1.22 2003/04/29 12:36:09 alex Exp $ +# $Id: sample-ngircd.conf,v 1.23 2003/09/11 12:05:28 alex Exp $ # # This is a sample configuration file for the ngIRCd, which must adept to @@ -36,6 +36,10 @@ # Ports on which the server should listen. There may be more than # one port, separated with ";". (Default: 6667) ;Ports = 6667, 6668, 66694 + + # IP address on which the server should listen. (Default: empty, + # so the server listens on all IP addresses of the system) + ;Listen = 1.2.3.4 # Text file with the "message of the day" (MOTD). This message will # be shown to all users connecting to the server: diff --git a/man/ngircd.conf.5 b/man/ngircd.conf.5 index 56a0e594..773287a7 100644 --- a/man/ngircd.conf.5 +++ b/man/ngircd.conf.5 @@ -1,5 +1,5 @@ .\" -.\" $Id: ngircd.conf.5,v 1.10 2003/05/02 20:51:42 alex Exp $ +.\" $Id: ngircd.conf.5,v 1.11 2003/09/11 12:05:28 alex Exp $ .\" .TH ngircd.conf 5 "Mai 2003" ngircd "ngIRCd Manual" .SH NAME @@ -67,6 +67,10 @@ command. Ports on which the server should listen. There may be more than one port, separated with ';'. Default: 6667. .TP +\fBListen\fR +The ip address on which the server should listen. Default is empty, so +the server listens on all configured ip addresses and interfaces. +.TP \fBMotdFile\fR Text file with the "message of the day" (MOTD). This message will be shown to all users connecting to the server. diff --git a/src/ngircd/conf.c b/src/ngircd/conf.c index 00b5bb79..0abb3c81 100644 --- a/src/ngircd/conf.c +++ b/src/ngircd/conf.c @@ -14,7 +14,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: conf.c,v 1.59 2003/04/29 12:36:09 alex Exp $"; +static char UNUSED id[] = "$Id: conf.c,v 1.60 2003/09/11 12:05:28 alex Exp $"; #include "imp.h" #include @@ -120,6 +120,7 @@ Conf_Test( VOID ) printf( "%u", Conf_ListenPorts[i] ); } puts( "" ); + printf( " Listen = %s\n", Conf_ListenAddress ); pwd = getpwuid( Conf_UID ); if( pwd ) printf( " ServerUID = %s\n", pwd->pw_name ); else printf( " ServerUID = %ld\n", (LONG)Conf_UID ); @@ -340,6 +341,7 @@ Set_Defaults( BOOLEAN InitServers ) strlcat( Conf_MotdFile, MOTD_FILE, sizeof( Conf_MotdFile )); Conf_ListenPorts_Count = 0; + strcpy( Conf_ListenAddress, "" ); Conf_UID = Conf_GID = 0; @@ -699,6 +701,15 @@ Handle_GLOBAL( INT Line, CHAR *Var, CHAR *Arg ) Conf_MaxJoins = atoi( Arg ); return; } + if( strcasecmp( Var, "Listen" ) == 0 ) + { + /* IP-Address to bind sockets */ + if( strlcpy( Conf_ListenAddress, Arg, sizeof( Conf_ListenAddress )) >= sizeof( Conf_ListenAddress )) + { + Config_Error( LOG_WARNING, "%s, line %d: Value of \"Listen\" too long!", NGIRCd_ConfFile, Line ); + return; + } + } Config_Error( LOG_ERR, "%s, line %d (section \"Global\"): Unknown variable \"%s\"!", NGIRCd_ConfFile, Line, Var ); } /* Handle_GLOBAL */ diff --git a/src/ngircd/conf.h b/src/ngircd/conf.h index 47784ba4..15a7093d 100644 --- a/src/ngircd/conf.h +++ b/src/ngircd/conf.h @@ -8,7 +8,7 @@ * (at your option) any later version. * Please read the file COPYING, README and AUTHORS for more information. * - * $Id: conf.h,v 1.26 2002/12/31 16:12:50 alex Exp $ + * $Id: conf.h,v 1.27 2003/09/11 12:05:28 alex Exp $ * * Configuration management (header) */ @@ -76,6 +76,9 @@ GLOBAL CHAR Conf_MotdFile[FNAME_LEN]; GLOBAL UINT Conf_ListenPorts[MAX_LISTEN_PORTS]; GLOBAL INT Conf_ListenPorts_Count; +/* Address to which the socket should be bound or empty (=all) */ +GLOBAL CHAR Conf_ListenAddress[16]; + /* User and group ID the server should run with */ GLOBAL UINT Conf_UID; GLOBAL UINT Conf_GID; diff --git a/src/ngircd/conn.c b/src/ngircd/conn.c index 1c16b5da..56824594 100644 --- a/src/ngircd/conn.c +++ b/src/ngircd/conn.c @@ -16,7 +16,7 @@ #include "portab.h" -static char UNUSED id[] = "$Id: conn.c,v 1.124 2003/08/30 20:28:54 alex Exp $"; +static char UNUSED id[] = "$Id: conn.c,v 1.125 2003/09/11 12:05:28 alex Exp $"; #include "imp.h" #include @@ -236,6 +236,7 @@ Conn_NewListener( CONST UINT Port ) /* Create new listening socket on specified port */ struct sockaddr_in addr; + struct in_addr inaddr; INT sock; #ifdef RENDEZVOUS CHAR name[CLIENT_ID_LEN], *info; @@ -243,9 +244,24 @@ Conn_NewListener( CONST UINT Port ) /* Server-"Listen"-Socket initialisieren */ memset( &addr, 0, sizeof( addr )); + memset( &inaddr, 0, sizeof( inaddr )); addr.sin_family = AF_INET; addr.sin_port = htons( Port ); - addr.sin_addr.s_addr = htonl( INADDR_ANY ); + if( Conf_ListenAddress[0] ) + { +#ifdef HAVE_INET_ATON + if( inet_aton( Conf_ListenAddress, &inaddr ) == 0 ) +#else + inaddr.s_addr = inet_addr( Conf_ListenAddress ); + if( inaddr.s_addr == (unsigned)-1 ) +#endif + { + Log( LOG_CRIT, "Can't listen on %s:%u: can't convert ip address %s!", Conf_ListenAddress, Port, Conf_ListenAddress ); + return FALSE; + } + } + else inaddr.s_addr = htonl( INADDR_ANY ); + addr.sin_addr = inaddr; /* Socket erzeugen */ sock = socket( PF_INET, SOCK_STREAM, 0); @@ -279,7 +295,8 @@ Conn_NewListener( CONST UINT Port ) if( sock > Conn_MaxFD ) Conn_MaxFD = sock; - Log( LOG_INFO, "Now listening on port %d (socket %d).", Port, sock ); + if( Conf_ListenAddress[0]) Log( LOG_INFO, "Now listening on %s:%d (socket %d).", Conf_ListenAddress, Port, sock ); + else Log( LOG_INFO, "Now listening on 0.0.0.0:%d (socket %d).", Port, sock ); #ifdef RENDEZVOUS /* Get best server description text */