Print this page
4211 Some syslog facility names and symbols are missing
3232 syslogd shouldn't sync after each LOG_KERN line
1762 Syslogd man page: missing reference.
@@ -17,13 +17,14 @@
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
+ * Copyright (c) 2013 Gary Mills
+ * Copyright 2012 Milan Jurik. All rights reserved.
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
- * Copyright 2012 Milan Jurik. All rights reserved.
*/
/*
* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T
* All Rights Reserved
@@ -153,11 +154,16 @@
"mark", LOG_MARK,
"syslog", LOG_SYSLOG,
"lpr", LOG_LPR,
"news", LOG_NEWS,
"uucp", LOG_UUCP,
+ "bsdcron", LOG_BSDCRON,
+ "authpriv", LOG_AUTHPRIV,
+ "ftp", LOG_FTP,
+ "ntp", LOG_NTP,
"audit", LOG_AUDIT,
+ "console", LOG_CONSOLE,
"cron", LOG_CRON,
"local0", LOG_LOCAL0,
"local1", LOG_LOCAL1,
"local2", LOG_LOCAL2,
"local3", LOG_LOCAL3,
@@ -605,10 +611,11 @@
/*ARGSUSED*/
static void *
sys_poll(void *ap)
{
int nfds;
+ int timeout;
static int klogerrs = 0;
pthread_t mythreadno;
if (Debug) {
mythreadno = pthread_self();
@@ -616,53 +623,60 @@
DPRINT1(1, "sys_poll(%u): sys_thread started\n", mythreadno);
/*
* Try to process as many messages as we can without blocking on poll.
- * We count such "initial" messages with sys_init_msg_count and
+ * We identify such messages with timeout == 0 and
* enqueue them without the SYNC_FILE flag. When no more data is
* waiting on the local log device, we set timeout to INFTIM,
- * clear sys_init_msg_count, and generate a flush message to sync
- * the previously counted initial messages out to disk.
+ * and generate a flush message to sync
+ * the previously identified messages out to disk.
*/
- sys_init_msg_count = 0;
+ timeout = INFTIM;
for (;;) {
errno = 0;
t_errno = 0;
- nfds = poll(&Pfd, 1, INFTIM);
+ nfds = poll(&Pfd, 1, timeout);
- if (nfds == 0)
- continue;
-
- if (nfds < 0) {
- if (errno != EINTR)
+ if (nfds <= 0) {
+ if (nfds < 0 && errno != EINTR)
logerror("poll");
+ if (timeout == 0)
+ flushmsg(SYNC_FILE);
+ timeout = INFTIM;
continue;
}
+
if (Pfd.revents & POLLIN) {
- getkmsg(INFTIM);
- } else {
+ timeout = 0;
+ getkmsg(timeout);
+ continue;
+ }
+
if (shutting_down) {
pthread_exit(0);
}
+
if (Pfd.revents & (POLLNVAL|POLLHUP|POLLERR)) {
logerror("kernel log driver poll error");
(void) close(Pfd.fd);
Pfd.fd = -1;
}
- }
while (Pfd.fd == -1 && klogerrs++ < 10) {
Pfd.fd = openklog(LogName, O_RDONLY);
}
if (klogerrs >= 10) {
logerror("can't reopen kernel log device - fatal");
exit(1);
}
+ if (timeout == 0)
+ flushmsg(SYNC_FILE);
+ timeout = INFTIM;
}
/*NOTREACHED*/
return (NULL);
}
@@ -693,11 +707,11 @@
while ((i = getmsg(Pfd.fd, &ctl, &dat, &flags)) == MOREDATA) {
lastline = &dat.buf[dat.len];
*lastline = '\0';
- DPRINT2(5, "sys_poll:(%u): getmsg: dat.len = %d\n",
+ DPRINT2(5, "getkmsg:(%u): getmsg: dat.len = %d\n",
mythreadno, dat.len);
buflen = strlen(buf);
len = findnl_bkwd(buf, buflen);
(void) memcpy(tmpbuf, buf, len);