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");