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