Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F135854969
D14926.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
21 KB
Referenced Files
None
Subscribers
None
D14926.id.diff
View Options
Index: head/usr.sbin/syslogd/syslogd.c
===================================================================
--- head/usr.sbin/syslogd/syslogd.c
+++ head/usr.sbin/syslogd/syslogd.c
@@ -28,6 +28,33 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2018 Prodrive Technologies, https://prodrive-technologies.com/
+ * Author: Ed Schouten <ed@FreeBSD.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
#ifndef lint
static const char copyright[] =
@@ -71,8 +98,7 @@
*/
/* Maximum number of characters in time of last occurrence */
-#define MAXDATELEN 16
-#define MAXLINE 1024 /* maximum line length */
+#define MAXLINE 2048 /* maximum line length */
#define MAXSVLINE MAXLINE /* maximum saved line length */
#define DEFUPRI (LOG_USER|LOG_NOTICE)
#define DEFSPRI (LOG_KERN|LOG_CRIT)
@@ -97,8 +123,8 @@
#include <netinet/in.h>
#include <arpa/inet.h>
#endif
-#include <netdb.h>
+#include <assert.h>
#include <ctype.h>
#include <dirent.h>
#include <err.h>
@@ -107,6 +133,7 @@
#include <fnmatch.h>
#include <libutil.h>
#include <limits.h>
+#include <netdb.h>
#include <paths.h>
#include <signal.h>
#include <stdio.h>
@@ -174,8 +201,17 @@
#define IGN_CONS 0x001 /* don't print on console */
#define SYNC_FILE 0x002 /* do fsync on file after printing */
#define MARK 0x008 /* this message is a mark */
-#define ISKERNEL 0x010 /* kernel generated message */
+/* Timestamps of log entries. */
+struct logtime {
+ struct tm tm;
+ suseconds_t usec;
+};
+
+/* Traditional syslog timestamp format. */
+#define RFC3164_DATELEN 15
+#define RFC3164_DATEFMT "%b %e %H:%M:%S"
+
/*
* This structure represents the files that will have log
* copies printed.
@@ -215,10 +251,10 @@
#define fu_pipe_pname f_un.f_pipe.f_pname
#define fu_pipe_pid f_un.f_pipe.f_pid
char f_prevline[MAXSVLINE]; /* last message logged */
- char f_lasttime[MAXDATELEN]; /* time of last occurrence */
+ struct logtime f_lasttime; /* time of last occurrence */
char f_prevhost[MAXHOSTNAMELEN]; /* host from which recd. */
int f_prevpri; /* pri of f_prevline */
- int f_prevlen; /* length of f_prevline */
+ size_t f_prevlen; /* length of f_prevline */
int f_prevcount; /* repetition cnt of prevline */
u_int f_repeatcount; /* number of "repeated" msgs */
int f_flags; /* file-specific flags */
@@ -352,7 +388,8 @@
static void fprintlog(struct filed *, int, const char *);
static void init(int);
static void logerror(const char *);
-static void logmsg(int, const char *, const char *, const char *, int);
+static void logmsg(int, const struct logtime *, const char *, const char *,
+ const char *, const char *, const char *, const char *, int);
static void log_deadchild(pid_t, int, const char *);
static void markit(void);
static int socksetup(struct peer *);
@@ -852,17 +889,352 @@
}
/*
- * Take a raw input line, extract PRI, TIMESTAMP and HOSTNAME from the message,
- * and print the message on the appropriate log files.
+ * Removes characters from log messages that are unsafe to display.
+ * TODO: Permit UTF-8 strings that include a BOM per RFC 5424?
*/
static void
+parsemsg_remove_unsafe_characters(const char *in, char *out, size_t outlen)
+{
+ char *q;
+ int c;
+
+ q = out;
+ while ((c = (unsigned char)*in++) != '\0' && q < out + outlen - 4) {
+ if (mask_C1 && (c & 0x80) && c < 0xA0) {
+ c &= 0x7F;
+ *q++ = 'M';
+ *q++ = '-';
+ }
+ if (isascii(c) && iscntrl(c)) {
+ if (c == '\n') {
+ *q++ = ' ';
+ } else if (c == '\t') {
+ *q++ = '\t';
+ } else {
+ *q++ = '^';
+ *q++ = c ^ 0100;
+ }
+ } else {
+ *q++ = c;
+ }
+ }
+ *q = '\0';
+}
+
+/*
+ * Parses a syslog message according to RFC 5424, assuming that PRI and
+ * VERSION (i.e., "<%d>1 ") have already been parsed by parsemsg(). The
+ * parsed result is passed to logmsg().
+ */
+static void
+parsemsg_rfc5424(const char *from, int pri, char *msg)
+{
+ const struct logtime *timestamp;
+ struct logtime timestamp_remote = { 0 };
+ const char *omsg, *hostname, *app_name, *procid, *msgid,
+ *structured_data;
+ char line[MAXLINE + 1];
+
+#define FAIL_IF(field, expr) do { \
+ if (expr) { \
+ dprintf("Failed to parse " field " from %s: %s\n", \
+ from, omsg); \
+ return; \
+ } \
+} while (0)
+#define PARSE_CHAR(field, sep) do { \
+ FAIL_IF(field, *msg != sep); \
+ ++msg; \
+} while (0)
+#define IF_NOT_NILVALUE(var) \
+ if (msg[0] == '-' && msg[1] == ' ') { \
+ msg += 2; \
+ var = NULL; \
+ } else if (msg[0] == '-' && msg[1] == '\0') { \
+ ++msg; \
+ var = NULL; \
+ } else
+
+ omsg = msg;
+ IF_NOT_NILVALUE(timestamp) {
+ /* Parse RFC 3339-like timestamp. */
+#define PARSE_NUMBER(dest, length, min, max) do { \
+ int i, v; \
+ \
+ v = 0; \
+ for (i = 0; i < length; ++i) { \
+ FAIL_IF("TIMESTAMP", *msg < '0' || *msg > '9'); \
+ v = v * 10 + *msg++ - '0'; \
+ } \
+ FAIL_IF("TIMESTAMP", v < min || v > max); \
+ dest = v; \
+} while (0)
+ /* Date and time. */
+ PARSE_NUMBER(timestamp_remote.tm.tm_year, 4, 0, 9999);
+ timestamp_remote.tm.tm_year -= 1900;
+ PARSE_CHAR("TIMESTAMP", '-');
+ PARSE_NUMBER(timestamp_remote.tm.tm_mon, 2, 1, 12);
+ --timestamp_remote.tm.tm_mon;
+ PARSE_CHAR("TIMESTAMP", '-');
+ PARSE_NUMBER(timestamp_remote.tm.tm_mday, 2, 1, 31);
+ PARSE_CHAR("TIMESTAMP", 'T');
+ PARSE_NUMBER(timestamp_remote.tm.tm_hour, 2, 0, 23);
+ PARSE_CHAR("TIMESTAMP", ':');
+ PARSE_NUMBER(timestamp_remote.tm.tm_min, 2, 0, 59);
+ PARSE_CHAR("TIMESTAMP", ':');
+ PARSE_NUMBER(timestamp_remote.tm.tm_sec, 2, 0, 59);
+ /* Perform normalization. */
+ timegm(×tamp_remote.tm);
+ /* Optional: fractional seconds. */
+ if (msg[0] == '.' && msg[1] >= '0' && msg[1] <= '9') {
+ int i;
+
+ ++msg;
+ for (i = 100000; i != 0; i /= 10) {
+ if (*msg < '0' || *msg > '9')
+ break;
+ timestamp_remote.usec += (*msg++ - '0') * i;
+ }
+ }
+ /* Timezone. */
+ if (*msg == 'Z') {
+ /* UTC. */
+ ++msg;
+ } else {
+ int sign, tz_hour, tz_min;
+
+ /* Local time zone offset. */
+ FAIL_IF("TIMESTAMP", *msg != '-' && *msg != '+');
+ sign = *msg++ == '-' ? -1 : 1;
+ PARSE_NUMBER(tz_hour, 2, 0, 23);
+ PARSE_CHAR("TIMESTAMP", ':');
+ PARSE_NUMBER(tz_min, 2, 0, 59);
+ timestamp_remote.tm.tm_gmtoff =
+ sign * (tz_hour * 3600 + tz_min * 60);
+ }
+#undef PARSE_NUMBER
+ PARSE_CHAR("TIMESTAMP", ' ');
+ timestamp = RemoteAddDate ? NULL : ×tamp_remote;
+ }
+
+ /* String fields part of the HEADER. */
+#define PARSE_STRING(field, var) \
+ IF_NOT_NILVALUE(var) { \
+ var = msg; \
+ while (*msg >= '!' && *msg <= '~') \
+ ++msg; \
+ FAIL_IF(field, var == msg); \
+ PARSE_CHAR(field, ' '); \
+ msg[-1] = '\0'; \
+ }
+ PARSE_STRING("HOSTNAME", hostname);
+ PARSE_STRING("APP-NAME", app_name);
+ PARSE_STRING("PROCID", procid);
+ PARSE_STRING("MSGID", msgid);
+#undef PARSE_STRING
+
+ /* Structured data. */
+#define PARSE_SD_NAME() do { \
+ const char *start; \
+ \
+ start = msg; \
+ while (*msg >= '!' && *msg <= '~' && *msg != '=' && \
+ *msg != ']' && *msg != '"') \
+ ++msg; \
+ FAIL_IF("STRUCTURED-NAME", start == msg); \
+} while (0)
+ IF_NOT_NILVALUE(structured_data) {
+ /* SD-ELEMENT. */
+ while (*msg == '[') {
+ ++msg;
+ /* SD-ID. */
+ PARSE_SD_NAME();
+ /* SD-PARAM. */
+ while (*msg == ' ') {
+ ++msg;
+ /* PARAM-NAME. */
+ PARSE_SD_NAME();
+ PARSE_CHAR("STRUCTURED-NAME", '=');
+ PARSE_CHAR("STRUCTURED-NAME", '"');
+ while (*msg != '"') {
+ FAIL_IF("STRUCTURED-NAME",
+ *msg == '\0');
+ if (*msg++ == '\\') {
+ FAIL_IF("STRUCTURED-NAME",
+ *msg == '\0');
+ ++msg;
+ }
+ }
+ ++msg;
+ }
+ PARSE_CHAR("STRUCTURED-NAME", ']');
+ }
+ PARSE_CHAR("STRUCTURED-NAME", ' ');
+ msg[-1] = '\0';
+ }
+#undef PARSE_SD_NAME
+
+#undef FAIL_IF
+#undef PARSE_CHAR
+#undef IF_NOT_NILVALUE
+
+ parsemsg_remove_unsafe_characters(msg, line, sizeof(line));
+ logmsg(pri, timestamp, from, app_name, procid, msgid,
+ structured_data, line, 0);
+}
+
+/*
+ * Trims the application name ("TAG" in RFC 3164 terminology) and
+ * process ID from a message if present.
+ */
+static void
+parsemsg_rfc3164_app_name_procid(char **msg, const char **app_name,
+ const char **procid) {
+ char *m, *app_name_begin, *procid_begin;
+ size_t app_name_length, procid_length;
+
+ m = *msg;
+
+ /* Application name. */
+ app_name_begin = m;
+ app_name_length = strspn(m,
+ "abcdefghijklmnopqrstuvwxyz"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "0123456789"
+ "_-");
+ if (app_name_length == 0)
+ goto bad;
+ m += app_name_length;
+
+ /* Process identifier (optional). */
+ if (*m == '[') {
+ procid_begin = ++m;
+ procid_length = strspn(m, "0123456789");
+ if (procid_length == 0)
+ goto bad;
+ m += procid_length;
+ if (*m++ != ']')
+ goto bad;
+ } else {
+ procid_begin = NULL;
+ procid_length = 0;
+ }
+
+ /* Separator. */
+ if (m[0] != ':' || m[1] != ' ')
+ goto bad;
+
+ /* Split strings from input. */
+ app_name_begin[app_name_length] = '\0';
+ if (procid_begin != 0)
+ procid_begin[procid_length] = '\0';
+
+ *msg = m + 2;
+ *app_name = app_name_begin;
+ *procid = procid_begin;
+ return;
+bad:
+ *app_name = NULL;
+ *procid = NULL;
+}
+
+/*
+ * Parses a syslog message according to RFC 3164, assuming that PRI
+ * (i.e., "<%d>") has already been parsed by parsemsg(). The parsed
+ * result is passed to logmsg().
+ */
+static void
+parsemsg_rfc3164(const char *from, int pri, char *msg)
+{
+ struct tm tm_parsed;
+ const struct logtime *timestamp;
+ struct logtime timestamp_remote = { 0 };
+ const char *app_name, *procid;
+ size_t i, msglen;
+ char line[MAXLINE + 1];
+
+ /* Parse the timestamp provided by the remote side. */
+ if (strptime(msg, RFC3164_DATEFMT, &tm_parsed) !=
+ msg + RFC3164_DATELEN || msg[RFC3164_DATELEN] != ' ') {
+ dprintf("Failed to parse TIMESTAMP from %s: %s\n", from, msg);
+ return;
+ }
+ msg += RFC3164_DATELEN + 1;
+
+ if (!RemoteAddDate) {
+ struct tm tm_now;
+ time_t t_now;
+ int year;
+
+ /*
+ * As the timestamp does not contain the year number,
+ * daylight saving time information, nor a time zone,
+ * attempt to infer it. Due to clock skews, the
+ * timestamp may even be part of the next year. Use the
+ * last year for which the timestamp is at most one week
+ * in the future.
+ *
+ * This loop can only run for at most three iterations
+ * before terminating.
+ */
+ t_now = time(NULL);
+ localtime_r(&t_now, &tm_now);
+ for (year = tm_now.tm_year + 1;; --year) {
+ assert(year >= tm_now.tm_year - 1);
+ timestamp_remote.tm = tm_parsed;
+ timestamp_remote.tm.tm_year = year;
+ timestamp_remote.tm.tm_isdst = -1;
+ if (mktime(×tamp_remote.tm) <
+ t_now + 7 * 24 * 60 * 60)
+ break;
+ }
+ timestamp = ×tamp_remote;
+ } else
+ timestamp = NULL;
+
+ /*
+ * A single space character MUST also follow the HOSTNAME field.
+ */
+ msglen = strlen(msg);
+ for (i = 0; i < MIN(MAXHOSTNAMELEN, msglen); i++) {
+ if (msg[i] == ' ') {
+ if (RemoteHostname) {
+ msg[i] = '\0';
+ from = msg;
+ }
+ msg += i + 1;
+ break;
+ }
+ /*
+ * Support non RFC compliant messages, without hostname.
+ */
+ if (msg[i] == ':')
+ break;
+ }
+ if (i == MIN(MAXHOSTNAMELEN, msglen)) {
+ dprintf("Invalid HOSTNAME from %s: %s\n", from, msg);
+ return;
+ }
+
+ /* Remove the TAG, if present. */
+ parsemsg_rfc3164_app_name_procid(&msg, &app_name, &procid);
+ parsemsg_remove_unsafe_characters(msg, line, sizeof(line));
+ logmsg(pri, timestamp, from, app_name, procid, NULL, NULL, line, 0);
+}
+
+/*
+ * Takes a raw input line, extracts PRI and determines whether the
+ * message is formatted according to RFC 3164 or RFC 5424. Continues
+ * parsing of addition fields in the message according to those
+ * standards and prints the message on the appropriate log files.
+ */
+static void
parsemsg(const char *from, char *msg)
{
- const char *timestamp;
char *q;
long n;
- int i, c, pri, msglen;
- char line[MAXLINE + 1];
+ size_t i;
+ int pri;
/* Parse PRI. */
if (msg[0] != '<' || !isdigit(msg[1])) {
@@ -900,75 +1272,12 @@
if ((pri & LOG_FACMASK) == LOG_KERN && !KeepKernFac)
pri = LOG_MAKEPRI(LOG_USER, LOG_PRI(pri));
- /*
- * The TIMESTAMP field is the local time and is in the format of
- * "Mmm dd hh:mm:ss" (without the quote marks).
- * A single space character MUST follow the TIMESTAMP field.
- *
- * XXXGL: the check can be improved.
- */
+ /* Parse VERSION. */
msg += i + 1;
- msglen = strlen(msg);
- if (msglen < MAXDATELEN || msg[3] != ' ' || msg[6] != ' ' ||
- msg[9] != ':' || msg[12] != ':' || msg[15] != ' ') {
- dprintf("Invalid TIMESTAMP from %s: %s\n", from, msg);
- return;
- }
-
- if (!RemoteAddDate)
- timestamp = msg;
+ if (msg[0] == '1' && msg[1] == ' ')
+ parsemsg_rfc5424(from, pri, msg + 2);
else
- timestamp = NULL;
- msg += MAXDATELEN;
- msglen -= MAXDATELEN;
-
- /*
- * A single space character MUST also follow the HOSTNAME field.
- */
- for (i = 0; i < MIN(MAXHOSTNAMELEN, msglen); i++) {
- if (msg[i] == ' ') {
- if (RemoteHostname) {
- msg[i] = '\0';
- from = msg;
- }
- msg += i + 1;
- break;
- }
- /*
- * Support non RFC compliant messages, without hostname.
- */
- if (msg[i] == ':')
- break;
- }
- if (i == MIN(MAXHOSTNAMELEN, msglen)) {
- dprintf("Invalid HOSTNAME from %s: %s\n", from, msg);
- return;
- }
-
- q = line;
- while ((c = (unsigned char)*msg++) != '\0' &&
- q < &line[sizeof(line) - 4]) {
- if (mask_C1 && (c & 0x80) && c < 0xA0) {
- c &= 0x7F;
- *q++ = 'M';
- *q++ = '-';
- }
- if (isascii(c) && iscntrl(c)) {
- if (c == '\n') {
- *q++ = ' ';
- } else if (c == '\t') {
- *q++ = '\t';
- } else {
- *q++ = '^';
- *q++ = c ^ 0100;
- }
- } else {
- *q++ = c;
- }
- }
- *q = '\0';
-
- logmsg(pri, timestamp, line, from, 0);
+ parsemsg_rfc3164(from, pri, msg);
}
/*
@@ -1022,7 +1331,7 @@
long n;
int flags, isprintf, pri;
- flags = ISKERNEL | SYNC_FILE; /* fsync after write */
+ flags = SYNC_FILE; /* fsync after write */
p = msg;
pri = DEFSPRI;
isprintf = 1;
@@ -1043,7 +1352,7 @@
flags |= IGN_CONS;
if (pri &~ (LOG_FACMASK|LOG_PRIMASK))
pri = DEFSPRI;
- logmsg(pri, NULL, p, LocalHostName, flags);
+ logmsg(pri, NULL, LocalHostName, "kernel", NULL, NULL, NULL, p, flags);
}
static time_t now;
@@ -1094,24 +1403,33 @@
}
/*
- * Log a message to the appropriate log files, users, etc. based on
- * the priority.
+ * Logs a message to the appropriate log files, users, etc. based on the
+ * priority. Log messages are always formatted according to RFC 3164,
+ * even if they were in RFC 5424 format originally, The MSGID and
+ * STRUCTURED-DATA fields are thus discarded for the time being.
*/
static void
-logmsg(int pri, const char *timestamp, const char *msg, const char *from,
- int flags)
+logmsg(int pri, const struct logtime *timestamp, const char *from,
+ const char *app_name, const char *procid, const char *msgid __unused,
+ const char *structured_data __unused, const char *msg, int flags)
{
+ struct timeval tv;
+ struct logtime timestamp_now;
struct filed *f;
- int i, fac, msglen, prilev;
- char prog[NAME_MAX+1];
+ size_t msglen;
+ int fac, prilev;
char buf[MAXLINE+1];
dprintf("logmsg: pri %o, flags %x, from %s, msg %s\n",
pri, flags, from, msg);
- (void)time(&now);
- if (timestamp == NULL)
- timestamp = ctime(&now) + 4;
+ (void)gettimeofday(&tv, NULL);
+ now = tv.tv_sec;
+ if (timestamp == NULL) {
+ localtime_r(&now, ×tamp_now.tm);
+ timestamp_now.usec = tv.tv_usec;
+ timestamp = ×tamp_now;
+ }
/* extract facility and priority level */
if (flags & MARK)
@@ -1125,22 +1443,17 @@
prilev = LOG_PRI(pri);
- /* Extract TAG part of the message (usually program name). */
- for (i = 0; i < NAME_MAX; i++) {
- if (!isprint(msg[i]) || msg[i] == ':' || msg[i] == '[' ||
- msg[i] == '/' || isspace(msg[i]))
- break;
- prog[i] = msg[i];
- }
- prog[i] = 0;
-
- /* add kernel prefix for kernel messages */
- if (flags & ISKERNEL) {
- snprintf(buf, sizeof(buf), "%s: %s",
- use_bootfile ? bootfile : "kernel", msg);
+ /* Prepend the application name to the message if provided. */
+ if (app_name != NULL) {
+ if (procid != NULL)
+ msglen = snprintf(buf, sizeof(buf), "%s[%s]: %s",
+ app_name, procid, msg);
+ else
+ msglen = snprintf(buf, sizeof(buf), "%s: %s",
+ app_name, msg);
msg = buf;
- }
- msglen = strlen(msg);
+ } else
+ msglen = strlen(msg);
/* log the message to the particular outputs */
if (!Initialized) {
@@ -1152,8 +1465,7 @@
f->f_file = open(ctty, O_WRONLY | O_NONBLOCK, 0);
if (f->f_file >= 0) {
- (void)strlcpy(f->f_lasttime, timestamp,
- sizeof(f->f_lasttime));
+ f->f_lasttime = *timestamp;
fprintlog(f, flags, msg);
close(f->f_file);
f->f_file = -1;
@@ -1174,7 +1486,8 @@
continue;
/* skip messages with the incorrect program name */
- if (skip_message(prog, f->f_program, 1))
+ if (skip_message(app_name == NULL ? "" : app_name,
+ f->f_program, 1))
continue;
/* skip message to console if it has already been printed */
@@ -1192,8 +1505,7 @@
(flags & MARK) == 0 && msglen == f->f_prevlen &&
!strcmp(msg, f->f_prevline) &&
!strcasecmp(from, f->f_prevhost)) {
- (void)strlcpy(f->f_lasttime, timestamp,
- sizeof(f->f_lasttime));
+ f->f_lasttime = *timestamp;
f->f_prevcount++;
dprintf("msg repeated %d times, %ld sec of %d\n",
f->f_prevcount, (long)(now - f->f_time),
@@ -1214,8 +1526,7 @@
fprintlog(f, 0, (char *)NULL);
f->f_repeatcount = 0;
f->f_prevpri = pri;
- (void)strlcpy(f->f_lasttime, timestamp,
- sizeof(f->f_lasttime));
+ f->f_lasttime = *timestamp;
(void)strlcpy(f->f_prevhost, from,
sizeof(f->f_prevhost));
if (msglen < MAXSVLINE) {
@@ -1254,8 +1565,12 @@
int l, lsent = 0;
char line[MAXLINE + 1], repbuf[80], greetings[200], *wmsg = NULL;
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
@@ -1267,7 +1582,7 @@
.iov_len = snprintf(greetings, sizeof(greetings),
"\r\n\7Message from syslogd@%s "
"at %.24s ...\r\n",
- f->f_prevhost, f->f_lasttime)
+ f->f_prevhost, timebuf)
};
if (iov[0].iov_len >= sizeof(greetings))
iov[0].iov_len = sizeof(greetings) - 1;
@@ -1277,8 +1592,8 @@
};
} else {
iov[0] = (struct iovec){
- .iov_base = f->f_lasttime,
- .iov_len = strlen(f->f_lasttime)
+ .iov_base = timebuf,
+ .iov_len = strlen(timebuf)
};
iov[1] = (struct iovec){
.iov_base = space,
@@ -1690,7 +2005,8 @@
(void)snprintf(buf, sizeof buf, "syslogd: %s", type);
errno = 0;
dprintf("%s\n", buf);
- logmsg(LOG_SYSLOG|LOG_ERR, NULL, buf, LocalHostName, 0);
+ logmsg(LOG_SYSLOG|LOG_ERR, NULL, LocalHostName, NULL, NULL, NULL,
+ NULL, buf, 0);
recursed--;
}
@@ -2037,7 +2353,8 @@
}
}
- logmsg(LOG_SYSLOG|LOG_INFO, NULL, "syslogd: restart", LocalHostName, 0);
+ logmsg(LOG_SYSLOG|LOG_INFO, NULL, LocalHostName, NULL, NULL, NULL,
+ NULL, "syslogd: restart", 0);
dprintf("syslogd: restarted\n");
/*
* Log a change in hostname, but only on a restart.
@@ -2046,7 +2363,8 @@
(void)snprintf(hostMsg, sizeof(hostMsg),
"syslogd: hostname changed, \"%s\" to \"%s\"",
oldLocalHostName, LocalHostName);
- logmsg(LOG_SYSLOG|LOG_INFO, NULL, hostMsg, LocalHostName, 0);
+ logmsg(LOG_SYSLOG|LOG_INFO, NULL, LocalHostName, NULL, NULL,
+ NULL, NULL, hostMsg, 0);
dprintf("%s\n", hostMsg);
}
/*
@@ -2056,7 +2374,8 @@
if (signo == 0 && !use_bootfile) {
(void)snprintf(bootfileMsg, sizeof(bootfileMsg),
"syslogd: kernel boot file is %s", bootfile);
- logmsg(LOG_KERN|LOG_INFO, NULL, bootfileMsg, LocalHostName, 0);
+ logmsg(LOG_KERN|LOG_INFO, NULL, LocalHostName, NULL, NULL,
+ NULL, NULL, bootfileMsg, 0);
dprintf("%s\n", bootfileMsg);
}
}
@@ -2365,7 +2684,8 @@
now = time((time_t *)NULL);
MarkSeq += TIMERINTVL;
if (MarkSeq >= MarkInterval) {
- logmsg(LOG_INFO, NULL, "-- MARK --", LocalHostName, MARK);
+ logmsg(LOG_INFO, NULL, LocalHostName, NULL, NULL, NULL, NULL,
+ "-- MARK --", MARK);
MarkSeq = 0;
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Nov 14, 1:47 PM (10 h, 2 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
25289280
Default Alt Text
D14926.id.diff (21 KB)
Attached To
Mode
D14926: Add RFC 5424 syslog message parsing to syslogd.
Attached
Detach File
Event Timeline
Log In to Comment