On Sun, Apr 15, 2018 at 10:34 AM, Ed Schouten <e...@freebsd.org> wrote:

> 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

Release notes: yes

>
>
> 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-h...@freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/svn-src-head
> To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"
>
_______________________________________________
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