svn commit: r326574 - head/usr.bin/logger

Gleb Smirnoff glebius at FreeBSD.org
Tue Dec 5 19:55:56 UTC 2017


Author: glebius
Date: Tue Dec  5 19:55:53 2017
New Revision: 326574
URL: https://svnweb.freebsd.org/changeset/base/326574

Log:
  Generate fully RFC3164 compliant messages, with timestamp and hostname.
  Allow to set hostname to any string with -H.
  
  MFC after:	2 months

Modified:
  head/usr.bin/logger/logger.1
  head/usr.bin/logger/logger.c

Modified: head/usr.bin/logger/logger.1
==============================================================================
--- head/usr.bin/logger/logger.1	Tue Dec  5 19:54:55 2017	(r326573)
+++ head/usr.bin/logger/logger.1	Tue Dec  5 19:55:53 2017	(r326574)
@@ -28,7 +28,7 @@
 .\"	@(#)logger.1	8.1 (Berkeley) 6/6/93
 .\" $FreeBSD$
 .\"
-.Dd December 23, 2016
+.Dd December 5, 2017
 .Dt LOGGER 1
 .Os
 .Sh NAME
@@ -38,6 +38,7 @@
 .Nm
 .Op Fl 46Ais
 .Op Fl f Ar file
+.Op Fl H Ar hostname
 .Op Fl h Ar host
 .Op Fl P Ar port
 .Op Fl p Ar pri
@@ -77,6 +78,11 @@ Log the message to standard error, as well as the syst
 .It Fl f Ar file
 Read the contents of the specified file into syslog.
 This option is ignored when a message is also specified.
+.It Fl H Ar hostname
+Set the hostname in the header of the message to specified value.
+If not specified, host part of
+.Xr gethostname 3
+will be used.
 .It Fl h Ar host
 Send the message to the remote system
 .Ar host

Modified: head/usr.bin/logger/logger.c
==============================================================================
--- head/usr.bin/logger/logger.c	Tue Dec  5 19:54:55 2017	(r326573)
+++ head/usr.bin/logger/logger.c	Tue Dec  5 19:55:53 2017	(r326574)
@@ -44,7 +44,7 @@ static char sccsid[] = "@(#)logger.c	8.1 (Berkeley) 6/
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
-#include <sys/types.h>
+#include <sys/param.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 
@@ -54,6 +54,7 @@ __FBSDID("$FreeBSD$");
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <time.h>
 #include <unistd.h>
 
 #define	SYSLOG_NAMES
@@ -71,8 +72,8 @@ static int	decode(char *, const CODE *);
 static int	pencode(char *);
 static ssize_t	socksetup(const char *, const char *, const char *,
 		    struct socks **);
-static void	logmessage(int, const char *, struct socks *, ssize_t,
-			   const char *);
+static void	logmessage(int, const char *, const char *, const char *,
+		    struct socks *, ssize_t, const char *);
 static void	usage(void);
 
 #ifdef INET6
@@ -93,19 +94,22 @@ main(int argc, char *argv[])
 {
 	struct socks *socks;
 	ssize_t nsock;
+	time_t now;
 	int ch, logflags, pri;
-	char *tag, *host, buf[1024];
+	char *tag, *host, buf[1024], *timestamp, tbuf[26],
+	    *hostname, hbuf[MAXHOSTNAMELEN];
 	const char *svcname, *src;
 
 	tag = NULL;
 	host = NULL;
+	hostname = NULL;
 	svcname = "syslog";
 	src = NULL;
 	socks = NULL;
 	pri = LOG_USER | LOG_NOTICE;
 	logflags = 0;
 	unsetenv("TZ");
-	while ((ch = getopt(argc, argv, "46Af:h:iP:p:S:st:")) != -1)
+	while ((ch = getopt(argc, argv, "46Af:H:h:iP:p:S:st:")) != -1)
 		switch((char)ch) {
 		case '4':
 			family = PF_INET;
@@ -123,6 +127,9 @@ main(int argc, char *argv[])
 				err(1, "%s", optarg);
 			setvbuf(stdin, 0, _IONBF, 0);
 			break;
+		case 'H':		/* hostname to set in message header */
+			hostname = optarg;
+			break;
 		case 'h':		/* hostname to deliver to */
 			host = optarg;
 			break;
@@ -168,6 +175,17 @@ main(int argc, char *argv[])
 		openlog(tag, logflags, 0);
 	(void) fclose(stdout);
 
+	(void )time(&now);
+	(void )ctime_r(&now, tbuf);
+	tbuf[19] = '\0';
+	timestamp = tbuf + 4;
+
+	if (hostname == NULL) {
+		hostname = hbuf;
+		(void )gethostname(hbuf, MAXHOSTNAMELEN);
+		*strchr(hostname, '.') = '\0';
+	}
+
 	/* log input line if appropriate */
 	if (argc > 0) {
 		char *p, *endp;
@@ -176,11 +194,13 @@ main(int argc, char *argv[])
 		for (p = buf, endp = buf + sizeof(buf) - 2; *argv;) {
 			len = strlen(*argv);
 			if (p + len > endp && p > buf) {
-				logmessage(pri, tag, socks, nsock, buf);
+				logmessage(pri, timestamp, hostname, tag,
+				    socks, nsock, buf);
 				p = buf;
 			}
 			if (len > sizeof(buf) - 1)
-				logmessage(pri, tag, socks, nsock, *argv++);
+				logmessage(pri, timestamp, hostname, tag,
+				    socks, nsock, *argv++);
 			else {
 				if (p != buf)
 					*p++ = ' ';
@@ -189,10 +209,12 @@ main(int argc, char *argv[])
 			}
 		}
 		if (p != buf)
-			logmessage(pri, tag, socks, nsock, buf);
+			logmessage(pri, timestamp, hostname, tag, socks, nsock,
+			    buf);
 	} else
 		while (fgets(buf, sizeof(buf), stdin) != NULL)
-			logmessage(pri, tag, socks, nsock, buf);
+			logmessage(pri, timestamp, hostname, tag, socks, nsock,
+			    buf);
 	exit(0);
 }
 
@@ -320,8 +342,8 @@ socksetup(const char *src, const char *dst, const char
  *  Send the message to syslog, either on the local host, or on a remote host
  */
 static void
-logmessage(int pri, const char *tag, struct socks *sk, ssize_t nsock,
-	const char *buf)
+logmessage(int pri, const char *timestamp, const char *hostname,
+    const char *tag, struct socks *sk, ssize_t nsock, const char *buf)
 {
 	char *line;
 	int len, i, lsent;
@@ -330,7 +352,8 @@ logmessage(int pri, const char *tag, struct socks *sk,
 		syslog(pri, "%s", buf);
 		return;
 	}
-	if ((len = asprintf(&line, "<%d>%s: %s", pri, tag, buf)) == -1)
+	if ((len = asprintf(&line, "<%d>%s %s %s: %s", pri, timestamp,
+	    hostname, tag, buf)) == -1)
 		errx(1, "asprintf");
 
 	lsent = -1;


More information about the svn-src-all mailing list