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);