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