svn commit: r332510 - in head: usr.bin/wall usr.sbin/syslogd

Ed Schouten ed at FreeBSD.org
Sun Apr 15 08:34:17 UTC 2018


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 = "";
 	}


More information about the svn-src-head mailing list