From owner-svn-src-head@freebsd.org Mon Apr 16 11:48:03 2018 Return-Path: Delivered-To: svn-src-head@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 3A001FA2C98 for ; Mon, 16 Apr 2018 11:48:03 +0000 (UTC) (envelope-from oliver.pinter@balabit.com) Received: from mail-io0-x244.google.com (mail-io0-x244.google.com [IPv6:2607:f8b0:4001:c06::244]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id BDCE668615 for ; Mon, 16 Apr 2018 11:48:02 +0000 (UTC) (envelope-from oliver.pinter@balabit.com) Received: by mail-io0-x244.google.com with SMTP id c26so5061731iob.3 for ; Mon, 16 Apr 2018 04:48:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=balabit-com.20150623.gappssmtp.com; s=20150623; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=6slhwknvG3Q2AIfsHxRZJ7lB59sPa8abXvYaYlgyFlc=; b=i/Y2w5eG57GmtqbdZi0Jd75r1HJMnCPJ1lS1OLQYfHLLsfeTVRGB09KC5pQmGD6JqN w+KXYnvwJRcgYEOlD23r90CEA85MdqKr4wjuq8Z6YxEtYTAIxAqleo+OQ2ym4IXh2jEz 9xzktW/Iazd3SioYpVMUV0a1h1BGCenImU4BgXmLLfjpR97q6+ga7/fcVFJEUAlQnywJ d4wF9+FWNSal20eJCFWuJzte2zo+idmsO6AbXv0OcvB7ppMYjFJpgGXd+ulSRIPneN20 f0LRFW7jRdVCqod32wlB8CqrbkGQhMwe6UIp9rFhgmQ7Ty/cEBAxXNlkEXhwYHqWEcjg XLEQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=6slhwknvG3Q2AIfsHxRZJ7lB59sPa8abXvYaYlgyFlc=; b=KQoXm84x9gGVd0tDvf7JQ1oNrN1kek/Mp8w/ev8Ys+3BwNpUxqPCPqAvK4uPlw4ruz rN/Rrg63+yl2DONIiAEPznP/sWCwfMkX/byTcG8Kl4FtJOsRB4yPjrz5QcpmPeNh6c0Q WV0P57AVHmZ7ey4mAsZS1gLxZk/LqvoibH97UKjwWZ/BUiBwFfRxMAL8KFHK51HFC1o/ nUPNSCBw3yCGy+WtqiEfGL+sFPnr0hRF8zFbWXnTIHE5W2MbJHR3ZzZM9EcjdjIDqiHz Pkb5rO9CPpv1ly/R+S4UFfl9Y6DbOXKP20boV9gmtDAGm6dPP7myUbsfCwuxA9dz82YO 9hgw== X-Gm-Message-State: ALQs6tAwunRL9P3wgV0QlygDO8IAOav4mugZd6QT3vC/BPVEvXvlQfQs 2kdpgeY+XS3AzPb26NUwvsub/tYmCvGmVcG2kQVIQE3g X-Google-Smtp-Source: AIpwx49+plWXrqDwidS5U3V8W6CFYjSbZooHLwEgIhkv38sGfkwEJ5eLhCITAFo5u1LAQsHiD9OLz9UJbN87/ODJmQM= X-Received: by 10.107.6.31 with SMTP id 31mr5990760iog.80.1523879281964; Mon, 16 Apr 2018 04:48:01 -0700 (PDT) MIME-Version: 1.0 Received: by 10.192.128.68 with HTTP; Mon, 16 Apr 2018 04:48:01 -0700 (PDT) In-Reply-To: <201804150834.w3F8YGO3038226@repo.freebsd.org> References: <201804150834.w3F8YGO3038226@repo.freebsd.org> From: =?UTF-8?B?UGludMOpciwgT2xpdsOpcg==?= Date: Mon, 16 Apr 2018 13:48:01 +0200 Message-ID: Subject: Re: svn commit: r332510 - in head: usr.bin/wall usr.sbin/syslogd To: Ed Schouten Cc: src-committers , svn-src-all@freebsd.org, svn-src-head@freebsd.org Content-Type: text/plain; charset="UTF-8" X-Content-Filtered-By: Mailman/MimeDel 2.1.25 X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 16 Apr 2018 11:48:03 -0000 On Sun, Apr 15, 2018 at 10:34 AM, Ed Schouten 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 > #include > #include > +#include > #include > #include > #include > @@ -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-head@freebsd.org mailing list > https://lists.freebsd.org/mailman/listinfo/svn-src-head > To unsubscribe, send any mail to "svn-src-head-unsubscribe@freebsd.org" >