http://cvsweb.openwall.com/cgi/cvsweb.cgi/~checkout~/Owl/packages/sysklogd/sysklogd-1.4.2-caen-owl-syslogd-bind.diff?rev=1.1;content-type=text%2Fplain diff -upk.orig sysklogd-1.4.2.orig/sysklogd.8 sysklogd-1.4.2/sysklogd.8 --- sysklogd-1.4.2.orig/sysklogd.8 2004-07-09 17:33:32 +0000 +++ sysklogd-1.4.2/sysklogd.8 2005-08-18 14:40:25 +0000 @@ -15,6 +15,9 @@ sysklogd \- Linux system logging utiliti .I config file ] .RB [ " \-h " ] +.RB [ " \-i " +.I IP address +] .RB [ " \-l " .I hostlist ] @@ -104,6 +107,13 @@ Specifying this switch on the command li This can cause syslog loops that fill up hard disks quite fast and thus needs to be used with caution. .TP +.BI "\-i " "IP address" +If +.B syslogd +is configured to accept log input from a UDP port, specify an IP address +to bind to, rather than the default of INADDR_ANY. The address must be in +dotted quad notation, DNS host names are not allowed. +.TP .BI "\-l " "hostlist" Specify a hostname that should be logged only with its simple hostname and not the fqdn. Multiple hosts may be specified using the colon diff -upk.orig sysklogd-1.4.2.orig/syslogd.c sysklogd-1.4.2/syslogd.c --- sysklogd-1.4.2.orig/syslogd.c 2005-08-18 14:33:22 +0000 +++ sysklogd-1.4.2/syslogd.c 2005-08-18 14:40:25 +0000 @@ -774,6 +774,8 @@ char **LocalHosts = NULL; /* these hosts int NoHops = 1; /* Can we bounce syslog messages through an intermediate host. */ +char *bind_addr = NULL; /* bind UDP port to this interface only */ + extern int errno; /* Function prototypes. */ @@ -878,7 +880,7 @@ int main(argc, argv) funix[i] = -1; } - while ((ch = getopt(argc, argv, "a:dhf:l:m:np:rs:v")) != EOF) + while ((ch = getopt(argc, argv, "a:dhf:i:l:m:np:rs:v")) != EOF) switch((char)ch) { case 'a': if (nfunix < MAXFUNIX) @@ -895,9 +897,17 @@ int main(argc, argv) case 'h': NoHops = 0; break; + case 'i': + if (bind_addr) { + fprintf(stderr, "Only one -i argument allowed, " + "the first one is taken.\n"); + break; + } + bind_addr = optarg; + break; case 'l': if (LocalHosts) { - fprintf (stderr, "Only one -l argument allowed," \ + fprintf(stderr, "Only one -l argument allowed, " "the first one is taken.\n"); break; } @@ -1244,7 +1254,7 @@ int main(argc, argv) int usage() { fprintf(stderr, "usage: syslogd [-drvh] [-l hostlist] [-m markinterval] [-n] [-p path]\n" \ - " [-s domainlist] [-f conffile]\n"); + " [-s domainlist] [-f conffile] [-i IP address]\n"); exit(1); } @@ -1286,15 +1296,22 @@ static int create_inet_socket() int fd, on = 1; struct sockaddr_in sin; + memset(&sin, 0, sizeof(sin)); + sin.sin_family = AF_INET; + sin.sin_port = LogPort; + if (bind_addr) { + if (!inet_aton(bind_addr, &sin.sin_addr)) { + logerror("syslog: not a valid IP address to bind to."); + return -1; + } + } + fd = socket(AF_INET, SOCK_DGRAM, 0); if (fd < 0) { logerror("syslog: Unknown protocol, suspending inet service."); return fd; } - memset(&sin, 0, sizeof(sin)); - sin.sin_family = AF_INET; - sin.sin_port = LogPort; if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, \ (char *) &on, sizeof(on)) < 0 ) { logerror("setsockopt(REUSEADDR), suspending inet");