BSD 4_3 release
[unix-history] / usr / src / lib / libc / gen / syslog.c
index 19dba12..f0dcc80 100644 (file)
@@ -1,6 +1,12 @@
-#ifndef lint
-static char sccsid[] = "@(#)syslog.c   4.7 (Berkeley) %G%";
-#endif
+/*
+ * Copyright (c) 1983 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)syslog.c   5.9 (Berkeley) 5/7/86";
+#endif LIBC_SCCS and not lint
 
 /*
  * SYSLOG -- print message on log file
 
 /*
  * SYSLOG -- print message on log file
@@ -22,28 +28,28 @@ static char sccsid[] = "@(#)syslog.c        4.7 (Berkeley) %G%";
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/file.h>
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/file.h>
-#include <syslog.h>
+#include <sys/signal.h>
+#include <sys/syslog.h>
 #include <netdb.h>
 #include <netdb.h>
+#include <strings.h>
 
 #define        MAXLINE 1024                    /* max message size */
 #define NULL   0                       /* manifest */
 
 
 #define        MAXLINE 1024                    /* max message size */
 #define NULL   0                       /* manifest */
 
-#define mask(p)        (1 << (p))
-#define IMPORTANT (mask(KERN_EMERG)|mask(KERN_ALERT)|mask(KERN_ERR)|mask(KERN_FAIL)\
-       |mask(KERN_RECOV)|mask(KERN_INFO)|mask(LOG_EMERG)|mask(LOG_ALERT)\
-       |mask(LOG_CRIT)|mask(LOG_ERR)|mask(LOG_FAIL))
+#define PRIMASK(p)     (1 << ((p) & LOG_PRIMASK))
+#define PRIFAC(p)      (((p) & LOG_FACMASK) >> 3)
+#define IMPORTANT      LOG_ERR
 
 static char    logname[] = "/dev/log";
 static char    ctty[] = "/dev/console";
 
 static int     LogFile = -1;           /* fd for log */
 static int     LogStat = 0;            /* status bits, set by openlog() */
 
 static char    logname[] = "/dev/log";
 static char    ctty[] = "/dev/console";
 
 static int     LogFile = -1;           /* fd for log */
 static int     LogStat = 0;            /* status bits, set by openlog() */
-static char    *LogTag = NULL;         /* string to tag the entry with */
-                                       /* mask of priorities to be logged */
-static int     LogMask = ~(mask(KERN_EMERG)|mask(KERN_ALERT)|mask(KERN_ERR)|
-                   mask(KERN_FAIL)|mask(KERN_RECOV)|mask(KERN_INFO));
+static char    *LogTag = "syslog";     /* string to tag the entry with */
+static int     LogMask = 0xff;         /* mask of priorities to be logged */
+static int     LogFacility = LOG_USER; /* default facility code */
 
 
-static struct sockaddr SyslogAddr;
+static struct sockaddr SyslogAddr;     /* AF_UNIX address of local logger */
 
 extern int errno, sys_nerr;
 extern char *sys_errlist[];
 
 extern int errno, sys_nerr;
 extern char *sys_errlist[];
@@ -59,13 +65,22 @@ syslog(pri, fmt, p0, p1, p2, p3, p4)
        int pid, olderrno = errno;
 
        /* see if we should just throw out this message */
        int pid, olderrno = errno;
 
        /* see if we should just throw out this message */
-       if (pri <= 0 || pri >= 32 || (mask(pri) & LogMask) == 0)
+       if (pri <= 0 || PRIFAC(pri) >= LOG_NFACILITIES || (PRIMASK(pri) & LogMask) == 0)
                return;
        if (LogFile < 0)
                return;
        if (LogFile < 0)
-               openlog(LogTag, LogStat & ~LOG_ODELAY, 0);
+               openlog(LogTag, LogStat | LOG_NDELAY, 0);
+
+       /* set default facility if none specified */
+       if ((pri & LOG_FACMASK) == 0)
+               pri |= LogFacility;
+
+       /* build the message */
        o = outline;
        sprintf(o, "<%d>", pri);
        o += strlen(o);
        o = outline;
        sprintf(o, "<%d>", pri);
        o += strlen(o);
+       time(&now);
+       sprintf(o, "%.15s ", ctime(&now) + 4);
+       o += strlen(o);
        if (LogTag) {
                strcpy(o, LogTag);
                o += strlen(o);
        if (LogTag) {
                strcpy(o, LogTag);
                o += strlen(o);
@@ -74,9 +89,10 @@ syslog(pri, fmt, p0, p1, p2, p3, p4)
                sprintf(o, "[%d]", getpid());
                o += strlen(o);
        }
                sprintf(o, "[%d]", getpid());
                o += strlen(o);
        }
-       time(&now);
-       sprintf(o, ": %.15s-- ", ctime(&now) + 4);
-       o += strlen(o);
+       if (LogTag) {
+               strcpy(o, ": ");
+               o += 2;
+       }
 
        b = buf;
        f = fmt;
 
        b = buf;
        f = fmt;
@@ -102,41 +118,54 @@ syslog(pri, fmt, p0, p1, p2, p3, p4)
        c = strlen(outline);
        if (c > MAXLINE)
                c = MAXLINE;
        c = strlen(outline);
        if (c > MAXLINE)
                c = MAXLINE;
+
+       /* output the message to the local logger */
        if (sendto(LogFile, outline, c, 0, &SyslogAddr, sizeof SyslogAddr) >= 0)
                return;
        if (sendto(LogFile, outline, c, 0, &SyslogAddr, sizeof SyslogAddr) >= 0)
                return;
-       if (!(LogStat & LOG_CONS) && !(mask(pri) & IMPORTANT))
+       if (!(LogStat & LOG_CONS))
                return;
                return;
-       pid = fork();
+
+       /* output the message to the console */
+       pid = vfork();
        if (pid == -1)
                return;
        if (pid == 0) {
        if (pid == -1)
                return;
        if (pid == 0) {
-               LogFile = open(ctty, O_RDWR);
+               int fd;
+
+               signal(SIGALRM, SIG_DFL);
+               sigsetmask(sigblock(0) & ~sigmask(SIGALRM));
+               alarm(5);
+               fd = open(ctty, O_WRONLY);
+               alarm(0);
                strcat(o, "\r");
                strcat(o, "\r");
-               write(LogFile, outline, c+1);
-               close(LogFile);
-               exit(0);
+               o = index(outline, '>') + 1;
+               write(fd, o, c + 1 - (o - outline));
+               close(fd);
+               _exit(0);
        }
        }
-       while ((c = wait((int *)0)) > 0 && c != pid)
-               ;
+       if (!(LogStat & LOG_NOWAIT))
+               while ((c = wait((int *)0)) > 0 && c != pid)
+                       ;
 }
 
 /*
  * OPENLOG -- open system log
  */
 }
 
 /*
  * OPENLOG -- open system log
  */
-openlog(ident, logstat, logmask)
+
+openlog(ident, logstat, logfac)
        char *ident;
        char *ident;
-       int logstat, logmask;
+       int logstat, logfac;
 {
 {
-
-       LogTag = (ident != NULL) ? ident : "syslog";
+       if (ident != NULL)
+               LogTag = ident;
        LogStat = logstat;
        LogStat = logstat;
-       if (logmask != 0)
-               LogMask = logmask;
+       if (logfac != 0)
+               LogFacility = logfac & LOG_FACMASK;
        if (LogFile >= 0)
                return;
        SyslogAddr.sa_family = AF_UNIX;
        strncpy(SyslogAddr.sa_data, logname, sizeof SyslogAddr.sa_data);
        if (LogFile >= 0)
                return;
        SyslogAddr.sa_family = AF_UNIX;
        strncpy(SyslogAddr.sa_data, logname, sizeof SyslogAddr.sa_data);
-       if (!(LogStat & LOG_ODELAY)) {
+       if (LogStat & LOG_NDELAY) {
                LogFile = socket(AF_UNIX, SOCK_DGRAM, 0);
                fcntl(LogFile, F_SETFD, 1);
        }
                LogFile = socket(AF_UNIX, SOCK_DGRAM, 0);
                fcntl(LogFile, F_SETFD, 1);
        }
@@ -145,6 +174,7 @@ openlog(ident, logstat, logmask)
 /*
  * CLOSELOG -- close the system log
  */
 /*
  * CLOSELOG -- close the system log
  */
+
 closelog()
 {
 
 closelog()
 {