Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libc/gen PR/43300: Takahiro Kambe: LOG_PID and LOG_CONSO...



details:   https://anonhg.NetBSD.org/src/rev/76b4c7f98a16
branches:  trunk
changeset: 754818:76b4c7f98a16
user:      christos <christos%NetBSD.org@localhost>
date:      Thu May 13 22:40:14 2010 +0000

description:
PR/43300: Takahiro Kambe: LOG_PID and LOG_CONSOLE printed syslogp messages
to the console/stderr since the syslogp conversion.

diffstat:

 lib/libc/gen/syslog.c |  75 ++++++++++++++++++++++++++++++++++----------------
 1 files changed, 51 insertions(+), 24 deletions(-)

diffs (148 lines):

diff -r d9060d09443b -r 76b4c7f98a16 lib/libc/gen/syslog.c
--- a/lib/libc/gen/syslog.c     Thu May 13 22:35:57 2010 +0000
+++ b/lib/libc/gen/syslog.c     Thu May 13 22:40:14 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: syslog.c,v 1.47 2009/01/11 02:46:27 christos Exp $     */
+/*     $NetBSD: syslog.c,v 1.48 2010/05/13 22:40:14 christos Exp $     */
 
 /*
  * Copyright (c) 1983, 1988, 1993
@@ -34,7 +34,7 @@
 #if 0
 static char sccsid[] = "@(#)syslog.c   8.5 (Berkeley) 4/29/95";
 #else
-__RCSID("$NetBSD: syslog.c,v 1.47 2009/01/11 02:46:27 christos Exp $");
+__RCSID("$NetBSD: syslog.c,v 1.48 2010/05/13 22:40:14 christos Exp $");
 #endif
 #endif /* LIBC_SCCS and not lint */
 
@@ -224,6 +224,8 @@
 vsyslogp_r(int pri, struct syslog_data *data, const char *msgid,
        const char *sdfmt, const char *msgfmt, va_list ap)
 {
+       static const char BRCOSP[] = "]: ";
+       static const char CRLF[] = "\r\n";
        size_t cnt, prlen, tries;
        char ch, *p, *t;
        struct timeval tv;
@@ -233,12 +235,12 @@
 #define TBUF_LEN       2048
 #define FMT_LEN                1024
 #define MAXTRIES       10
-       char *stdp = NULL;      /* pacify gcc */
        char tbuf[TBUF_LEN], fmt_cpy[FMT_LEN], fmt_cat[FMT_LEN] = "";
-       size_t tbuf_left, fmt_left;
+       size_t tbuf_left, fmt_left, msgsdlen;
        char *fmt = fmt_cat;
        int signal_safe = pri & LOG_SIGNAL_SAFE;
-       int opened;
+       struct iovec iov[7];    /* prog + [ + pid + ]: + fmt + crlf */
+       int opened, iovcnt;
 
        pri &= ~LOG_SIGNAL_SAFE;
 
@@ -306,19 +308,40 @@
        prlen = snprintf_ss(p, tbuf_left, " %s ", hostname);
        DEC();
 
-       if (data->log_stat & LOG_PERROR)
-               stdp = p;
        if (data->log_tag == NULL)
                data->log_tag = getprogname();
 
        prlen = snprintf_ss(p, tbuf_left, "%s ",
            data->log_tag ? data->log_tag : "-");
+       if (data->log_stat & (LOG_PERROR|LOG_CONS)) {
+               iovcnt = 0;
+               iov[iovcnt].iov_base = p;
+               iov[iovcnt].iov_len = prlen - 1;
+               iovcnt++;
+       }
        DEC();
 
-       if (data->log_stat & LOG_PID)
+       if (data->log_stat & LOG_PID) {
                prlen = snprintf_ss(p, tbuf_left, "%d ", getpid());
-       else
+               if (data->log_stat & (LOG_PERROR|LOG_CONS)) {
+                       iov[iovcnt].iov_base = __UNCONST("[");
+                       iov[iovcnt].iov_len = 1;
+                       iovcnt++;
+                       iov[iovcnt].iov_base = p;
+                       iov[iovcnt].iov_len = prlen - 1;
+                       iovcnt++;
+                       iov[iovcnt].iov_base = __UNCONST(BRCOSP);
+                       iov[iovcnt].iov_len = 3;
+                       iovcnt++;
+               }
+       } else {
                prlen = snprintf_ss(p, tbuf_left, "- ");
+               if (data->log_stat & (LOG_PERROR|LOG_CONS)) {
+                       iov[iovcnt].iov_base = __UNCONST(BRCOSP + 1);
+                       iov[iovcnt].iov_len = 2;
+                       iovcnt++;
+               }
+       }
        DEC();
 
        /*
@@ -335,6 +358,11 @@
        } else
                strlcat(fmt_cat, "-", FMT_LEN);
 
+       if (data->log_stat & (LOG_PERROR|LOG_CONS))
+               msgsdlen = strlen(fmt_cat) + 1;
+       else
+               msgsdlen = 0;   /* XXX: GCC */
+
        if (msgfmt != NULL && *msgfmt != '\0') {
                strlcat(fmt_cat, " ", FMT_LEN);
                strlcat(fmt_cat, msgfmt, FMT_LEN);
@@ -376,18 +404,21 @@
                prlen = vsnprintf_ss(p, tbuf_left, fmt_cpy, ap);
        else
                prlen = vsnprintf(p, tbuf_left, fmt_cpy, ap);
+
+       if (data->log_stat & (LOG_PERROR|LOG_CONS)) {
+               iov[iovcnt].iov_base = p + msgsdlen;
+               iov[iovcnt].iov_len = prlen - msgsdlen;
+               iovcnt++;
+       }
+
        DEC();
        cnt = p - tbuf;
 
        /* Output to stderr if requested. */
        if (data->log_stat & LOG_PERROR) {
-               struct iovec iov[2];
-
-               iov[0].iov_base = stdp;
-               iov[0].iov_len = cnt - (stdp - tbuf);
-               iov[1].iov_base = __UNCONST("\n");
-               iov[1].iov_len = 1;
-               (void)writev(STDERR_FILENO, iov, 2);
+               iov[iovcnt].iov_base = __UNCONST(CRLF + 1);
+               iov[iovcnt].iov_len = 1;
+               (void)writev(STDERR_FILENO, iov, iovcnt + 1);
        }
 
        /* Get connected, output the message to the local logger. */
@@ -422,14 +453,10 @@
         * Make sure the error reported is the one from the syslogd failure.
         */
        if (tries == MAXTRIES && (data->log_stat & LOG_CONS) &&
-           (fd = open(_PATH_CONSOLE, O_WRONLY|O_NONBLOCK, 0)) >= 0 &&
-           (p = strchr(tbuf, '>')) != NULL) {
-               struct iovec iov[2];
-               iov[0].iov_base = ++p;
-               iov[0].iov_len = cnt - (p - tbuf);
-               iov[1].iov_base = __UNCONST("\r\n");
-               iov[1].iov_len = 2;
-               (void)writev(fd, iov, 2);
+           (fd = open(_PATH_CONSOLE, O_WRONLY|O_NONBLOCK, 0)) >= 0) {
+               iov[iovcnt].iov_base = __UNCONST(CRLF);
+               iov[iovcnt].iov_len = 2;
+               (void)writev(fd, iov, iovcnt + 1);
                (void)close(fd);
        }
 



Home | Main Index | Thread Index | Old Index