Author: olli
Date: Sat Aug  7 16:20:12 2010
New Revision: 211023
URL: http://svn.freebsd.org/changeset/base/211023

Log:
  syslogd(8) already supports *sending* log messages to non-
  standard ports, but it can't *receive* them (port 514 is
  hardcoded).  This commit adds that missing feature.
  
  (NB:  I actually needed this feature for a server farm where
  multiple jails run with shared IP addresses, and every jail
  should have its own syslogd process.)
  
  As a side effect, syslogd now compiles with WARNS=6.
  
  Approved by:  des (mentor)
  MFC after:    3 weeks

Modified:
  head/usr.sbin/syslogd/Makefile
  head/usr.sbin/syslogd/syslogd.8
  head/usr.sbin/syslogd/syslogd.c

Modified: head/usr.sbin/syslogd/Makefile
==============================================================================
--- head/usr.sbin/syslogd/Makefile      Sat Aug  7 16:14:40 2010        
(r211022)
+++ head/usr.sbin/syslogd/Makefile      Sat Aug  7 16:20:12 2010        
(r211023)
@@ -12,7 +12,7 @@ SRCS= syslogd.c ttymsg.c
 DPADD= ${LIBUTIL}
 LDADD= -lutil
 
-WARNS?=        3
+WARNS?=        6
 
 .if ${MK_INET6_SUPPORT} != "no"
 CFLAGS+= -DINET6

Modified: head/usr.sbin/syslogd/syslogd.8
==============================================================================
--- head/usr.sbin/syslogd/syslogd.8     Sat Aug  7 16:14:40 2010        
(r211022)
+++ head/usr.sbin/syslogd/syslogd.8     Sat Aug  7 16:20:12 2010        
(r211023)
@@ -171,10 +171,29 @@ The
 options are ignored if the
 .Fl s
 option is also specified.
-.It Fl b Ar bind_address
-Specify one specific IP address or hostname to bind to.
-If a hostname is specified,
-the IPv4 or IPv6 address which corresponds to it is used.
+.It Xo
+.Fl b
+.Sm off
+.Ar bind_address Op : Ar service
+.Sm on
+.Xc
+.It Xo
+.Fl b
+.Sm off
+.Li : Ar service
+.Sm on
+.Xc
+Bind to a specific address and/or port.
+The address can be specified as a hostname,
+and the port as a service name.
+If an IPv6 address is specified, it should be enclosed with
+.Ql \&[
+and
+.Ql \&] .
+The default
+.Ar service
+is
+.Ql syslog .
 .It Fl C
 Create log files that do not exist (permission is set to
 .Li 0600 ) .

Modified: head/usr.sbin/syslogd/syslogd.c
==============================================================================
--- head/usr.sbin/syslogd/syslogd.c     Sat Aug  7 16:14:40 2010        
(r211022)
+++ head/usr.sbin/syslogd/syslogd.c     Sat Aug  7 16:20:12 2010        
(r211023)
@@ -317,7 +317,7 @@ static void dodie(int);
 static void    dofsync(void);
 static void    domark(int);
 static void    fprintlog(struct filed *, int, const char *);
-static int     *socksetup(int, const char *);
+static int     *socksetup(int, char *);
 static void    init(int);
 static void    logerror(const char *);
 static void    logmsg(int, const char *, const char *, int);
@@ -345,7 +345,8 @@ main(int argc, char *argv[])
        struct sockaddr_storage frominet;
        fd_set *fdsr = NULL;
        char line[MAXLINE + 1];
-       const char *bindhostname, *hname;
+       char *bindhostname;
+       const char *hname;
        struct timeval tv, *tvp;
        struct sigaction sact;
        struct funix *fx, *fx1;
@@ -2605,16 +2606,47 @@ log_deadchild(pid_t pid, int status, con
 }
 
 static int *
-socksetup(int af, const char *bindhostname)
+socksetup(int af, char *bindhostname)
 {
        struct addrinfo hints, *res, *r;
+       const char *bindservice;
+       char *cp;
        int error, maxs, *s, *socks;
 
+       /*
+        * We have to handle this case for backwards compatibility:
+        * If there are two (or more) colons but no '[' and ']',
+        * assume this is an inet6 address without a service.
+        */
+       bindservice = "syslog";
+       if (bindhostname != NULL) {
+#ifdef INET6
+               if (*bindhostname == '[' &&
+                   (cp = strchr(bindhostname + 1, ']')) != NULL) {
+                       ++bindhostname;
+                       *cp = '\0';
+                       if (cp[1] == ':' && cp[2] != '\0')
+                               bindservice = cp + 2;
+               } else {
+#endif
+                       cp = strchr(bindhostname, ':');
+                       if (cp != NULL && strchr(cp + 1, ':') == NULL) {
+                               *cp = '\0';
+                               if (cp[1] != '\0')
+                                       bindservice = cp + 1;
+                               if (cp == bindhostname)
+                                       bindhostname = NULL;
+                       }
+#ifdef INET6
+               }
+#endif
+       }
+
        memset(&hints, 0, sizeof(hints));
        hints.ai_flags = AI_PASSIVE;
        hints.ai_family = af;
        hints.ai_socktype = SOCK_DGRAM;
-       error = getaddrinfo(bindhostname, "syslog", &hints, &res);
+       error = getaddrinfo(bindhostname, bindservice, &hints, &res);
        if (error) {
                logerror(gai_strerror(error));
                errno = 0;
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to