Author: ed
Date: Sun Apr 15 08:34:16 2018
New Revision: 332510
URL: https://svnweb.freebsd.org/changeset/base/332510

Log:
  Add RFC 5424 syslog message output to syslogd.
  
  - Move all of the code responsible for transmitting log messages into a
    separate function, fprintlog_write().
  - Instead of manually modifying a list of iovecs, add a structure
    iovlist with some helper functions.
  - Alter the F_FORW (UDP message forwarding) case to also use iovecs like
    the other cases. Use sendmsg() instead of sendto().
  - In the case of F_FORW, truncate the message to a size dependent on the
    address family (AF_INET, AF_INET6), as proposed by RFC 5426.
  - Move all traditional message formatting into fprintlog_bsd(). Get rid
    of some of the string copying and snprintf()'ing. Simply emit more
    iovecs to get the job done.
  - Increase ttymsg()'s limit of 7 iovecs to 32. Add a definition for this
    limit, so it can be reused by iovlist.
  - Add fprintlog_rfc5424() to emit RFC 5424 formatted log entries.
  - Add a "-O" command line option to enable RFC 5424 formatting. It would
    have been nicer if we supported "-o rfc5424", just like on NetBSD.
    Unfortunately, the "-o" flag is already used for a different purpose
    on FreeBSD.
  - Don't truncate hostnames in the RFC 5424 case, as suggested by that
    specific RFC.
  
  For people interested in using this, this feature can be enabled by
  adding the following line to /etc/rc.conf:
  
    syslogd_flags="-s -O rfc5424"
  
  Differential Revision:        https://reviews.freebsd.org/D15011

Modified:
  head/usr.bin/wall/ttymsg.c
  head/usr.bin/wall/ttymsg.h
  head/usr.sbin/syslogd/syslogd.8
  head/usr.sbin/syslogd/syslogd.c

Modified: head/usr.bin/wall/ttymsg.c
==============================================================================
--- head/usr.bin/wall/ttymsg.c  Sat Apr 14 22:14:18 2018        (r332509)
+++ head/usr.bin/wall/ttymsg.c  Sun Apr 15 08:34:16 2018        (r332510)
@@ -61,7 +61,7 @@ static const char sccsid[] = "@(#)ttymsg.c    8.2 (Berkel
 const char *
 ttymsg(struct iovec *iov, int iovcnt, const char *line, int tmout)
 {
-       struct iovec localiov[7];
+       struct iovec localiov[TTYMSG_IOV_MAX];
        ssize_t left, wret;
        int cnt, fd;
        char device[MAXNAMLEN] = _PATH_DEV;

Modified: head/usr.bin/wall/ttymsg.h
==============================================================================
--- head/usr.bin/wall/ttymsg.h  Sat Apr 14 22:14:18 2018        (r332509)
+++ head/usr.bin/wall/ttymsg.h  Sun Apr 15 08:34:16 2018        (r332510)
@@ -1,3 +1,5 @@
 /* $FreeBSD$ */
 
+#define        TTYMSG_IOV_MAX  32
+
 const char     *ttymsg(struct iovec *, int, const char *, int);

Modified: head/usr.sbin/syslogd/syslogd.8
==============================================================================
--- head/usr.sbin/syslogd/syslogd.8     Sat Apr 14 22:14:18 2018        
(r332509)
+++ head/usr.sbin/syslogd/syslogd.8     Sun Apr 15 08:34:16 2018        
(r332510)
@@ -28,7 +28,7 @@
 .\"     @(#)syslogd.8  8.1 (Berkeley) 6/6/93
 .\" $FreeBSD$
 .\"
-.Dd November 28, 2017
+.Dd April 9, 2018
 .Dt SYSLOGD 8
 .Os
 .Sh NAME
@@ -42,6 +42,7 @@
 .Op Fl f Ar config_file
 .Op Fl l Oo Ar mode Ns \&: Oc Ns Ar path
 .Op Fl m Ar mark_interval
+.Op Fl O Ar format
 .Op Fl P Ar pid_file
 .Op Fl p Ar log_socket
 .Op Fl S Ar logpriv_socket
@@ -242,6 +243,20 @@ Usually the
 .Dq kern
 facility is reserved for messages read directly from
 .Pa /dev/klog .
+.It Fl O Ar format
+Select the output format of generated log messages.
+The values
+.Ar bsd
+and
+.Ar rfc3164
+are used to generate RFC 3164 log messages.
+The values
+.Ar syslog
+and
+.Ar rfc5424
+are used to generate RFC 5424 log messages,
+having RFC 3339 timestamps with microsecond precision.
+The default is to generate RFC 3164 log messages.
 .It Fl m Ar mark_interval
 Select the number of minutes between
 .Dq mark

Modified: head/usr.sbin/syslogd/syslogd.c
==============================================================================
--- head/usr.sbin/syslogd/syslogd.c     Sat Apr 14 22:14:18 2018        
(r332509)
+++ head/usr.sbin/syslogd/syslogd.c     Sun Apr 15 08:34:16 2018        
(r332510)
@@ -136,6 +136,7 @@ __FBSDID("$FreeBSD$");
 #include <netdb.h>
 #include <paths.h>
 #include <signal.h>
+#include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -367,9 +368,12 @@ static int KeepKernFac;    /* Keep remotely logged kernel
 static int     needdofsync = 0; /* Are any file(s) waiting to be fsynced? */
 static struct pidfh *pfh;
 static int     sigpipe[2];     /* Pipe to catch a signal during select(). */
+static bool    RFC3164OutputFormat = true; /* Use legacy format by default. */
 
 static volatile sig_atomic_t MarkSet, WantDie, WantInitialize, WantReapchild;
 
+struct iovlist;
+
 static int     allowaddr(char *);
 static int     addfile(struct filed *);
 static int     addpeer(struct peer *);
@@ -386,6 +390,7 @@ static void dofsync(void);
 static void    domark(int);
 static void    fprintlog_first(struct filed *, const char *, const char *,
     const char *, const char *, const char *, const char *, int);
+static void    fprintlog_write(struct filed *, struct iovlist *, int);
 static void    fprintlog_successive(struct filed *, int);
 static void    init(int);
 static void    logerror(const char *);
@@ -498,7 +503,7 @@ main(int argc, char *argv[])
        if (madvise(NULL, 0, MADV_PROTECT) != 0)
                dprintf("madvise() failed: %s\n", strerror(errno));
 
-       while ((ch = getopt(argc, argv, "468Aa:b:cCdf:FHkl:m:nNop:P:sS:Tuv"))
+       while ((ch = getopt(argc, argv, "468Aa:b:cCdf:FHkl:m:nNoO:p:P:sS:Tuv"))
            != -1)
                switch (ch) {
 #ifdef INET
@@ -621,6 +626,16 @@ main(int argc, char *argv[])
                case 'n':
                        resolve = 0;
                        break;
+               case 'O':
+                       if (strcmp(optarg, "bsd") == 0 ||
+                           strcmp(optarg, "rfc3164") == 0)
+                               RFC3164OutputFormat = true;
+                       else if (strcmp(optarg, "syslog") == 0 ||
+                           strcmp(optarg, "rfc5424") == 0)
+                               RFC3164OutputFormat = false;
+                       else
+                               usage();
+                       break;
                case 'o':
                        use_bootfile = 1;
                        break;
@@ -880,12 +895,12 @@ static void
 usage(void)
 {
 
-       fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n",
-               "usage: syslogd [-468ACcdFHknosTuv] [-a allowed_peer]",
-               "               [-b bind_address] [-f config_file]",
-               "               [-l [mode:]path] [-m mark_interval]",
-               "               [-P pid_file] [-p log_socket]",
-               "               [-S logpriv_socket]");
+       fprintf(stderr,
+               "usage: syslogd [-468ACcdFHknosTuv] [-a allowed_peer]\n"
+               "               [-b bind_address] [-f config_file]\n"
+               "               [-l [mode:]path] [-m mark_interval]\n"
+               "               [-O format] [-P pid_file] [-p log_socket]\n"
+               "               [-S logpriv_socket]\n");
        exit(1);
 }
 
@@ -1558,177 +1573,114 @@ dofsync(void)
        }
 }
 
-#define IOV_SIZE 7
+/*
+ * List of iovecs to which entries can be appended.
+ * Used for constructing the message to be logged.
+ */
+struct iovlist {
+       struct iovec    iov[TTYMSG_IOV_MAX];
+       size_t          iovcnt;
+       size_t          totalsize;
+};
+
 static void
-fprintlog_first(struct filed *f, const char *hostname, const char *app_name,
-    const char *procid, const char *msgid __unused,
-    const char *structured_data __unused, const char *msg, int flags)
+iovlist_init(struct iovlist *il)
 {
-       struct iovec iov[IOV_SIZE];
-       struct addrinfo *r;
-       int l, lsent = 0;
-       char tagged_msg[MAXLINE + 1], line[MAXLINE + 1], greetings[200];
-       char nul[] = "", space[] = " ", lf[] = "\n", crlf[] = "\r\n";
-       char timebuf[RFC3164_DATELEN + 1];
-       const char *msgret;
 
-       if (strftime(timebuf, sizeof(timebuf), RFC3164_DATEFMT,
-           &f->f_lasttime.tm) == 0)
-               timebuf[0] = '\0';
-       if (f->f_type == F_WALL) {
-               /* The time displayed is not synchornized with the other log
-                * destinations (like messages).  Following fragment was using
-                * ctime(&now), which was updating the time every 30 sec.
-                * With f_lasttime, time is synchronized correctly.
-                */
-               iov[0] = (struct iovec){
-                       .iov_base = greetings,
-                       .iov_len = snprintf(greetings, sizeof(greetings),
-                                   "\r\n\7Message from syslogd@%s "
-                                   "at %.24s ...\r\n", hostname, timebuf)
+       il->iovcnt = 0;
+       il->totalsize = 0;
+}
+
+static void
+iovlist_append(struct iovlist *il, const char *str)
+{
+       size_t size;
+
+       /* Discard components if we've run out of iovecs. */
+       if (il->iovcnt < nitems(il->iov)) {
+               size = strlen(str);
+               il->iov[il->iovcnt++] = (struct iovec){
+                       .iov_base       = __DECONST(char *, str),
+                       .iov_len        = size,
                };
-               if (iov[0].iov_len >= sizeof(greetings))
-                       iov[0].iov_len = sizeof(greetings) - 1;
-               iov[1] = (struct iovec){
-                       .iov_base = nul,
-                       .iov_len = 0
-               };
-       } else {
-               iov[0] = (struct iovec){
-                       .iov_base = timebuf,
-                       .iov_len = strlen(timebuf)
-               };
-               iov[1] = (struct iovec){
-                       .iov_base = space,
-                       .iov_len = 1
-               };
+               il->totalsize += size;
        }
+}
 
-       if (LogFacPri) {
-               static char fp_buf[30]; /* Hollow laugh */
-               int fac = f->f_prevpri & LOG_FACMASK;
-               int pri = LOG_PRI(f->f_prevpri);
-               const char *f_s = NULL;
-               char f_n[5];    /* Hollow laugh */
-               const char *p_s = NULL;
-               char p_n[5];    /* Hollow laugh */
+static void
+iovlist_truncate(struct iovlist *il, size_t size)
+{
+       struct iovec *last;
+       size_t diff;
 
-               if (LogFacPri > 1) {
-                 const CODE *c;
-
-                 for (c = facilitynames; c->c_name; c++) {
-                   if (c->c_val == fac) {
-                     f_s = c->c_name;
-                     break;
-                   }
-                 }
-                 for (c = prioritynames; c->c_name; c++) {
-                   if (c->c_val == pri) {
-                     p_s = c->c_name;
-                     break;
-                   }
-                 }
+       while (size > il->totalsize) {
+               diff = size - il->totalsize;
+               last = &il->iov[il->iovcnt - 1];
+               if (diff >= last->iov_len) {
+                       /* Remove the last iovec entirely. */
+                       --il->iovcnt;
+                       il->totalsize -= last->iov_len;
+               } else {
+                       /* Remove the last iovec partially. */
+                       last->iov_len -= diff;
+                       il->totalsize -= diff;
                }
-               if (!f_s) {
-                 snprintf(f_n, sizeof f_n, "%d", LOG_FAC(fac));
-                 f_s = f_n;
-               }
-               if (!p_s) {
-                 snprintf(p_n, sizeof p_n, "%d", pri);
-                 p_s = p_n;
-               }
-               snprintf(fp_buf, sizeof fp_buf, "<%s.%s> ", f_s, p_s);
-               iov[2] = (struct iovec){
-                       .iov_base = fp_buf,
-                       .iov_len = strlen(fp_buf)
-               };
-       } else {
-               iov[2] = (struct iovec){
-                       .iov_base = nul,
-                       .iov_len = 0
-               };
        }
-       /* Prepend the application name to the message if provided. */
-       if (app_name != NULL) {
-               if (procid != NULL)
-                       snprintf(tagged_msg, sizeof(tagged_msg),
-                           "%s[%s]: %s", app_name, procid, msg);
-               else
-                       snprintf(tagged_msg, sizeof(tagged_msg),
-                           "%s: %s", app_name, msg);
-               msg = tagged_msg;
-       }
-       iov[3] = (struct iovec){
-               .iov_base = __DECONST(char *, hostname),
-               .iov_len = strlen(hostname)
-       };
-       iov[4] = (struct iovec){
-               .iov_base = space,
-               .iov_len = 1
-       };
-       iov[5] = (struct iovec){
-               .iov_base = __DECONST(char *, msg),
-               .iov_len = strlen(msg)
-       };
-       dprintf("Logging to %s", TypeNames[f->f_type]);
-       f->f_time = now;
+}
 
-       switch (f->f_type) {
-       case F_UNUSED:
-               dprintf("\n");
-               break;
+static void
+fprintlog_write(struct filed *f, struct iovlist *il, int flags)
+{
+       struct msghdr msghdr;
+       struct addrinfo *r;
+       struct socklist *sl;
+       const char *msgret;
+       ssize_t lsent;
 
+       switch (f->f_type) {
        case F_FORW:
+               /* Truncate messages to RFC 5426 recommended size. */
                dprintf(" %s", f->fu_forw_hname);
                switch (f->fu_forw_addr->ai_addr->sa_family) {
 #ifdef INET
                case AF_INET:
                        dprintf(":%d\n",
                            ntohs(satosin(f->fu_forw_addr->ai_addr)->sin_port));
+                       iovlist_truncate(il, 480);
                        break;
 #endif
 #ifdef INET6
                case AF_INET6:
                        dprintf(":%d\n",
                            
ntohs(satosin6(f->fu_forw_addr->ai_addr)->sin6_port));
+                       iovlist_truncate(il, 1180);
                        break;
 #endif
                default:
                        dprintf("\n");
                }
-               /* check for local vs remote messages */
-               if (strcasecmp(hostname, LocalHostName))
-                       l = snprintf(line, sizeof line - 1,
-                           "<%d>%.15s Forwarded from %s: %s",
-                           f->f_prevpri, (char *)iov[0].iov_base,
-                           hostname, (char *)iov[5].iov_base);
-               else
-                       l = snprintf(line, sizeof line - 1, "<%d>%.15s %s",
-                            f->f_prevpri, (char *)iov[0].iov_base,
-                           (char *)iov[5].iov_base);
-               if (l < 0)
-                       l = 0;
-               else if (l > MAXLINE)
-                       l = MAXLINE;
 
+               lsent = 0;
                for (r = f->fu_forw_addr; r; r = r->ai_next) {
-                       struct socklist *sl;
-
+                       memset(&msghdr, 0, sizeof(msghdr));
+                       msghdr.msg_name = r->ai_addr;
+                       msghdr.msg_namelen = r->ai_addrlen;
+                       msghdr.msg_iov = il->iov;
+                       msghdr.msg_iovlen = il->iovcnt;
                        STAILQ_FOREACH(sl, &shead, next) {
                                if (sl->sl_ss.ss_family == AF_LOCAL ||
                                    sl->sl_ss.ss_family == AF_UNSPEC ||
                                    sl->sl_socket < 0)
                                        continue;
-                               lsent = sendto(sl->sl_socket, line, l, 0,
-                                   r->ai_addr, r->ai_addrlen);
-                               if (lsent == l)
+                               lsent = sendmsg(sl->sl_socket, &msghdr, 0);
+                               if (lsent == (ssize_t)il->totalsize)
                                        break;
                        }
-                       if (lsent == l && !send_to_all)
+                       if (lsent == (ssize_t)il->totalsize && !send_to_all)
                                break;
                }
-               dprintf("lsent/l: %d/%d\n", lsent, l);
-               if (lsent != l) {
+               dprintf("lsent/totalsize: %zd/%zu\n", lsent, il->totalsize);
+               if (lsent != (ssize_t)il->totalsize) {
                        int e = errno;
                        logerror("sendto");
                        errno = e;
@@ -1758,11 +1710,8 @@ fprintlog_first(struct filed *f, const char *hostname,
 
        case F_FILE:
                dprintf(" %s\n", f->fu_fname);
-               iov[6] = (struct iovec){
-                       .iov_base = lf,
-                       .iov_len = 1
-               };
-               if (writev(f->f_file, iov, nitems(iov)) < 0) {
+               iovlist_append(il, "\n");
+               if (writev(f->f_file, il->iov, il->iovcnt) < 0) {
                        /*
                         * If writev(2) fails for potentially transient errors
                         * like the filesystem being full, ignore it.
@@ -1782,10 +1731,7 @@ fprintlog_first(struct filed *f, const char *hostname,
 
        case F_PIPE:
                dprintf(" %s\n", f->fu_pipe_pname);
-               iov[6] = (struct iovec){
-                       .iov_base = lf,
-                       .iov_len = 1
-               };
+               iovlist_append(il, "\n");
                if (f->fu_pipe_pid == 0) {
                        if ((f->f_file = p_open(f->fu_pipe_pname,
                                                &f->fu_pipe_pid)) < 0) {
@@ -1793,7 +1739,7 @@ fprintlog_first(struct filed *f, const char *hostname,
                                break;
                        }
                }
-               if (writev(f->f_file, iov, nitems(iov)) < 0) {
+               if (writev(f->f_file, il->iov, il->iovcnt) < 0) {
                        int e = errno;
 
                        deadq_enter(f->fu_pipe_pid, f->fu_pipe_pname);
@@ -1812,12 +1758,9 @@ fprintlog_first(struct filed *f, const char *hostname,
 
        case F_TTY:
                dprintf(" %s%s\n", _PATH_DEV, f->fu_fname);
-               iov[6] = (struct iovec){
-                       .iov_base = crlf,
-                       .iov_len = 2
-               };
+               iovlist_append(il, "\r\n");
                errno = 0;      /* ttymsg() only sometimes returns an errno */
-               if ((msgret = ttymsg(iov, nitems(iov), f->fu_fname, 10))) {
+               if ((msgret = ttymsg(il->iov, il->iovcnt, f->fu_fname, 10))) {
                        f->f_type = F_UNUSED;
                        logerror(msgret);
                }
@@ -1826,14 +1769,190 @@ fprintlog_first(struct filed *f, const char *hostname,
        case F_USERS:
        case F_WALL:
                dprintf("\n");
-               iov[6] = (struct iovec){
-                       .iov_base = crlf,
-                       .iov_len = 2
-               };
-               wallmsg(f, iov, nitems(iov));
+               iovlist_append(il, "\r\n");
+               wallmsg(f, il->iov, il->iovcnt);
                break;
        }
+}
+
+static void
+fprintlog_rfc5424(struct filed *f, const char *hostname, const char *app_name,
+    const char *procid, const char *msgid, const char *structured_data,
+    const char *msg, int flags)
+{
+       struct iovlist il;
+       suseconds_t usec;
+       int i;
+       char timebuf[33], priority_number[5];
+
+       iovlist_init(&il);
+       if (f->f_type == F_WALL)
+               iovlist_append(&il, "\r\n\aMessage from syslogd ...\r\n");
+       iovlist_append(&il, "<");
+       snprintf(priority_number, sizeof(priority_number), "%d", f->f_prevpri);
+       iovlist_append(&il, priority_number);
+       iovlist_append(&il, ">1 ");
+       if (strftime(timebuf, sizeof(timebuf), "%FT%T.______%z",
+           &f->f_lasttime.tm) == sizeof(timebuf) - 2) {
+               /* Add colon to the time zone offset, which %z doesn't do. */
+               timebuf[32] = '\0';
+               timebuf[31] = timebuf[30];
+               timebuf[30] = timebuf[29];
+               timebuf[29] = ':';
+
+               /* Overwrite space for microseconds with actual value. */
+               usec = f->f_lasttime.usec;
+               for (i = 25; i >= 20; --i) {
+                       timebuf[i] = usec % 10 + '0';
+                       usec /= 10;
+               }
+               iovlist_append(&il, timebuf);
+       } else
+               iovlist_append(&il, "-");
+       iovlist_append(&il, " ");
+       iovlist_append(&il, hostname);
+       iovlist_append(&il, " ");
+       iovlist_append(&il, app_name == NULL ? "-" : app_name);
+       iovlist_append(&il, " ");
+       iovlist_append(&il, procid == NULL ? "-" : procid);
+       iovlist_append(&il, " ");
+       iovlist_append(&il, msgid == NULL ? "-" : msgid);
+       iovlist_append(&il, " ");
+       iovlist_append(&il, structured_data == NULL ? "-" : structured_data);
+       iovlist_append(&il, " ");
+       iovlist_append(&il, msg);
+
+       fprintlog_write(f, &il, flags);
+}
+
+static void
+fprintlog_rfc3164(struct filed *f, const char *hostname, const char *app_name,
+    const char *procid, const char *msg, int flags)
+{
+       struct iovlist il;
+       const CODE *c;
+       int facility, priority;
+       char timebuf[RFC3164_DATELEN + 1], facility_number[5],
+           priority_number[5];
+       bool facility_found, priority_found;
+
+       if (strftime(timebuf, sizeof(timebuf), RFC3164_DATEFMT,
+           &f->f_lasttime.tm) == 0)
+               timebuf[0] = '\0';
+
+       iovlist_init(&il);
+       switch (f->f_type) {
+       case F_FORW:
+               /* Message forwarded over the network. */
+               iovlist_append(&il, "<");
+               snprintf(priority_number, sizeof(priority_number), "%d",
+                   f->f_prevpri);
+               iovlist_append(&il, priority_number);
+               iovlist_append(&il, ">");
+               iovlist_append(&il, timebuf);
+               if (strcasecmp(hostname, LocalHostName) != 0) {
+                       iovlist_append(&il, " Forwarded from ");
+                       iovlist_append(&il, hostname);
+                       iovlist_append(&il, ":");
+               }
+               iovlist_append(&il, " ");
+               break;
+
+       case F_WALL:
+               /* Message written to terminals. */
+               iovlist_append(&il, "\r\n\aMessage from syslogd@");
+               iovlist_append(&il, hostname);
+               iovlist_append(&il, " at ");
+               iovlist_append(&il, timebuf);
+               iovlist_append(&il, " ...\r\n");
+               break;
+
+       default:
+               /* Message written to files. */
+               iovlist_append(&il, timebuf);
+               iovlist_append(&il, " ");
+               iovlist_append(&il, hostname);
+               iovlist_append(&il, " ");
+
+               if (LogFacPri) {
+                       iovlist_append(&il, "<");
+
+                       facility = f->f_prevpri & LOG_FACMASK;
+                       facility_found = false;
+                       if (LogFacPri > 1) {
+                               for (c = facilitynames; c->c_name; c++) {
+                                       if (c->c_val == facility) {
+                                               iovlist_append(&il, c->c_name);
+                                               facility_found = true;
+                                               break;
+                                       }
+                               }
+                       }
+                       if (!facility_found) {
+                               snprintf(facility_number,
+                                   sizeof(facility_number), "%d",
+                                   LOG_FAC(facility));
+                               iovlist_append(&il, facility_number);
+                       }
+
+                       iovlist_append(&il, ".");
+
+                       priority = LOG_PRI(f->f_prevpri);
+                       priority_found = false;
+                       if (LogFacPri > 1) {
+                               for (c = prioritynames; c->c_name; c++) {
+                                       if (c->c_val == priority) {
+                                               iovlist_append(&il, c->c_name);
+                                               priority_found = true;
+                                               break;
+                                       }
+                               }
+                       }
+                       if (!priority_found) {
+                               snprintf(priority_number,
+                                   sizeof(priority_number), "%d", priority);
+                               iovlist_append(&il, priority_number);
+                       }
+
+                       iovlist_append(&il, "> ");
+               }
+               break;
+       }
+
+       /* Message body with application name and process ID prefixed. */
+       if (app_name != NULL) {
+               iovlist_append(&il, app_name);
+               if (procid != NULL) {
+                       iovlist_append(&il, "[");
+                       iovlist_append(&il, procid);
+                       iovlist_append(&il, "]");
+               }
+               iovlist_append(&il, ": ");
+       }
+       iovlist_append(&il, msg);
+
+       fprintlog_write(f, &il, flags);
+}
+
+static void
+fprintlog_first(struct filed *f, const char *hostname, const char *app_name,
+    const char *procid, const char *msgid __unused,
+    const char *structured_data __unused, const char *msg, int flags)
+{
+
+       dprintf("Logging to %s", TypeNames[f->f_type]);
+       f->f_time = now;
        f->f_prevcount = 0;
+       if (f->f_type == F_UNUSED) {
+               dprintf("\n");
+               return;
+       }
+
+       if (RFC3164OutputFormat)
+               fprintlog_rfc3164(f, hostname, app_name, procid, msg, flags);
+       else
+               fprintlog_rfc5424(f, hostname, app_name, procid, msgid,
+                   structured_data, msg, flags);
 }
 
 /*
@@ -2229,8 +2348,10 @@ init(int signo)
        if (gethostname(LocalHostName, sizeof(LocalHostName)))
                err(EX_OSERR, "gethostname() failed");
        if ((p = strchr(LocalHostName, '.')) != NULL) {
-               *p++ = '\0';
-               LocalDomain = p;
+               /* RFC 5424 prefers logging FQDNs. */
+               if (RFC3164OutputFormat)
+                       *p = '\0';
+               LocalDomain = p + 1;
        } else {
                LocalDomain = "";
        }
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to