blob: d12177be4a7a387d1ac080d348335487503ba410 [file] [log] [blame]
diff -aruN a/sysklogd/syslogd.c b/sysklogd/syslogd.c
--- a/sysklogd/syslogd.c 2012-01-04 10:13:07.989873065 -0800
+++ b/sysklogd/syslogd.c 2012-01-04 10:08:05.000000000 -0800
@@ -165,10 +165,10 @@
/* ...then copy to parsebuf, escaping control chars */
/* (can grow x2 max) */
char parsebuf[MAX_READ*2];
- /* ...then sprintf into printbuf, adding timestamp (15 chars),
+ /* ...then sprintf into printbuf, adding timestamp (26 chars),
* host (64), fac.prio (20) to the message */
- /* (growth by: 15 + 64 + 20 + delims = ~110) */
- char printbuf[MAX_READ*2 + 128];
+ /* (growth by: 26 + 64 + 20 + delims = ~121) */
+ char printbuf[MAX_READ*2 + 139];
};
static const struct init_globals init_data = {
@@ -638,47 +638,62 @@
snprintf(res20, 20, "<%d>", pri);
}
+static struct tm * generate_time(struct timeval *tvp, struct tm *tmp)
+{
+ struct tm *tm;
+
+ gettimeofday(tvp, NULL);
+
+ if (option_mask32 & OPT_utc) {
+ tm = gmtime_r(&tvp->tv_sec, tmp);
+ } else {
+ tm = localtime_r(&tvp->tv_sec, tmp);
+ }
+
+ return tm;
+}
+
/* len parameter is used only for "is there a timestamp?" check.
* NB: some callers cheat and supply len==0 when they know
* that there is no timestamp, short-circuiting the test. */
static void timestamp_and_log(int pri, char *msg, int len)
{
- char *timestamp;
- time_t now;
+ char timestamp[27];
+ struct timeval tvnow;
+ struct tm parsed, tmnow, *tmp;
+ size_t n;
/* Jan 18 00:11:22 msg... */
/* 01234567890123456 */
if (len < 16 || msg[3] != ' ' || msg[6] != ' '
|| msg[9] != ':' || msg[12] != ':' || msg[15] != ' '
) {
- time(&now);
- if (option_mask32 & OPT_utc)
- timestamp = asctime(gmtime(&now));
- else
- timestamp = asctime(localtime(&now));
- timestamp += 4; /* skip day of week */
+ tmp = generate_time(&tvnow, &tmnow);
} else {
- if (option_mask32 & OPT_utc) {
- struct tm parsed, local;
- now = time(NULL);
- localtime_r(&now, &local);
- if (strptime(msg, "%h %e %T", &parsed) != NULL) {
- parsed.tm_gmtoff = local.tm_gmtoff;
- parsed.tm_zone = local.tm_zone;
- parsed.tm_year = local.tm_year;
- parsed.tm_isdst = local.tm_isdst;
- now = mktime(&parsed);
- timestamp = asctime(gmtime(&now)) + 4;
+ struct tm local;
+ tvnow.tv_sec = time(NULL);
+ localtime_r(&tvnow.tv_sec, &local);
+ if (strptime(msg, "%h %e %T", &parsed) != NULL) {
+
+ parsed.tm_gmtoff = local.tm_gmtoff;
+ parsed.tm_zone = local.tm_zone;
+ parsed.tm_year = local.tm_year;
+ parsed.tm_isdst = local.tm_isdst;
+ tvnow.tv_sec = mktime(&parsed);
+ tvnow.tv_usec = 0;
+
+ if (option_mask32 & OPT_utc) {
+ tmp = gmtime_r(&tvnow.tv_sec, &tmnow);
} else {
- timestamp = msg;
+ tmp = &parsed;
}
} else {
- now = 0;
- timestamp = msg;
+ tmp = generate_time(&tvnow, &tmnow);
}
msg += 16;
}
- timestamp[15] = '\0';
+ n = strftime(timestamp, sizeof(timestamp), "%F %T", tmp);
+ snprintf(timestamp + n, sizeof(timestamp) - n, ".%06ld", tvnow.tv_usec);
if (option_mask32 & OPT_small)
sprintf(G.printbuf, "%s %s\n", timestamp, msg);
@@ -698,7 +713,7 @@
for (rule = G.log_rules; rule; rule = rule->next) {
if (rule->enabled_facility_priomap[facility] & prio_bit) {
- log_locally(now, G.printbuf, rule->file);
+ log_locally(tvnow.tv_sec, G.printbuf, rule->file);
match = 1;
}
}
@@ -713,7 +728,7 @@
return;
}
#endif
- log_locally(now, G.printbuf, &G.logFile);
+ log_locally(tvnow.tv_sec, G.printbuf, &G.logFile);
}
}