Annotation of 43BSD/lib/libc/gen/syslog.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1983 Regents of the University of California.
        !             3:  * All rights reserved.  The Berkeley software License Agreement
        !             4:  * specifies the terms and conditions for redistribution.
        !             5:  */
        !             6: 
        !             7: #if defined(LIBC_SCCS) && !defined(lint)
        !             8: static char sccsid[] = "@(#)syslog.c   5.9 (Berkeley) 5/7/86";
        !             9: #endif LIBC_SCCS and not lint
        !            10: 
        !            11: /*
        !            12:  * SYSLOG -- print message on log file
        !            13:  *
        !            14:  * This routine looks a lot like printf, except that it
        !            15:  * outputs to the log file instead of the standard output.
        !            16:  * Also:
        !            17:  *     adds a timestamp,
        !            18:  *     prints the module name in front of the message,
        !            19:  *     has some other formatting types (or will sometime),
        !            20:  *     adds a newline on the end of the message.
        !            21:  *
        !            22:  * The output of this routine is intended to be read by /etc/syslogd.
        !            23:  *
        !            24:  * Author: Eric Allman
        !            25:  * Modified to use UNIX domain IPC by Ralph Campbell
        !            26:  */
        !            27: 
        !            28: #include <sys/types.h>
        !            29: #include <sys/socket.h>
        !            30: #include <sys/file.h>
        !            31: #include <sys/signal.h>
        !            32: #include <sys/syslog.h>
        !            33: #include <netdb.h>
        !            34: #include <strings.h>
        !            35: 
        !            36: #define        MAXLINE 1024                    /* max message size */
        !            37: #define NULL   0                       /* manifest */
        !            38: 
        !            39: #define PRIMASK(p)     (1 << ((p) & LOG_PRIMASK))
        !            40: #define PRIFAC(p)      (((p) & LOG_FACMASK) >> 3)
        !            41: #define IMPORTANT      LOG_ERR
        !            42: 
        !            43: static char    logname[] = "/dev/log";
        !            44: static char    ctty[] = "/dev/console";
        !            45: 
        !            46: static int     LogFile = -1;           /* fd for log */
        !            47: static int     LogStat = 0;            /* status bits, set by openlog() */
        !            48: static char    *LogTag = "syslog";     /* string to tag the entry with */
        !            49: static int     LogMask = 0xff;         /* mask of priorities to be logged */
        !            50: static int     LogFacility = LOG_USER; /* default facility code */
        !            51: 
        !            52: static struct sockaddr SyslogAddr;     /* AF_UNIX address of local logger */
        !            53: 
        !            54: extern int errno, sys_nerr;
        !            55: extern char *sys_errlist[];
        !            56: 
        !            57: syslog(pri, fmt, p0, p1, p2, p3, p4)
        !            58:        int pri;
        !            59:        char *fmt;
        !            60: {
        !            61:        char buf[MAXLINE + 1], outline[MAXLINE + 1];
        !            62:        register char *b, *f, *o;
        !            63:        register int c;
        !            64:        long now;
        !            65:        int pid, olderrno = errno;
        !            66: 
        !            67:        /* see if we should just throw out this message */
        !            68:        if (pri <= 0 || PRIFAC(pri) >= LOG_NFACILITIES || (PRIMASK(pri) & LogMask) == 0)
        !            69:                return;
        !            70:        if (LogFile < 0)
        !            71:                openlog(LogTag, LogStat | LOG_NDELAY, 0);
        !            72: 
        !            73:        /* set default facility if none specified */
        !            74:        if ((pri & LOG_FACMASK) == 0)
        !            75:                pri |= LogFacility;
        !            76: 
        !            77:        /* build the message */
        !            78:        o = outline;
        !            79:        sprintf(o, "<%d>", pri);
        !            80:        o += strlen(o);
        !            81:        time(&now);
        !            82:        sprintf(o, "%.15s ", ctime(&now) + 4);
        !            83:        o += strlen(o);
        !            84:        if (LogTag) {
        !            85:                strcpy(o, LogTag);
        !            86:                o += strlen(o);
        !            87:        }
        !            88:        if (LogStat & LOG_PID) {
        !            89:                sprintf(o, "[%d]", getpid());
        !            90:                o += strlen(o);
        !            91:        }
        !            92:        if (LogTag) {
        !            93:                strcpy(o, ": ");
        !            94:                o += 2;
        !            95:        }
        !            96: 
        !            97:        b = buf;
        !            98:        f = fmt;
        !            99:        while ((c = *f++) != '\0' && c != '\n' && b < &buf[MAXLINE]) {
        !           100:                if (c != '%') {
        !           101:                        *b++ = c;
        !           102:                        continue;
        !           103:                }
        !           104:                if ((c = *f++) != 'm') {
        !           105:                        *b++ = '%';
        !           106:                        *b++ = c;
        !           107:                        continue;
        !           108:                }
        !           109:                if ((unsigned)olderrno > sys_nerr)
        !           110:                        sprintf(b, "error %d", olderrno);
        !           111:                else
        !           112:                        strcpy(b, sys_errlist[olderrno]);
        !           113:                b += strlen(b);
        !           114:        }
        !           115:        *b++ = '\n';
        !           116:        *b = '\0';
        !           117:        sprintf(o, buf, p0, p1, p2, p3, p4);
        !           118:        c = strlen(outline);
        !           119:        if (c > MAXLINE)
        !           120:                c = MAXLINE;
        !           121: 
        !           122:        /* output the message to the local logger */
        !           123:        if (sendto(LogFile, outline, c, 0, &SyslogAddr, sizeof SyslogAddr) >= 0)
        !           124:                return;
        !           125:        if (!(LogStat & LOG_CONS))
        !           126:                return;
        !           127: 
        !           128:        /* output the message to the console */
        !           129:        pid = vfork();
        !           130:        if (pid == -1)
        !           131:                return;
        !           132:        if (pid == 0) {
        !           133:                int fd;
        !           134: 
        !           135:                signal(SIGALRM, SIG_DFL);
        !           136:                sigsetmask(sigblock(0) & ~sigmask(SIGALRM));
        !           137:                alarm(5);
        !           138:                fd = open(ctty, O_WRONLY);
        !           139:                alarm(0);
        !           140:                strcat(o, "\r");
        !           141:                o = index(outline, '>') + 1;
        !           142:                write(fd, o, c + 1 - (o - outline));
        !           143:                close(fd);
        !           144:                _exit(0);
        !           145:        }
        !           146:        if (!(LogStat & LOG_NOWAIT))
        !           147:                while ((c = wait((int *)0)) > 0 && c != pid)
        !           148:                        ;
        !           149: }
        !           150: 
        !           151: /*
        !           152:  * OPENLOG -- open system log
        !           153:  */
        !           154: 
        !           155: openlog(ident, logstat, logfac)
        !           156:        char *ident;
        !           157:        int logstat, logfac;
        !           158: {
        !           159:        if (ident != NULL)
        !           160:                LogTag = ident;
        !           161:        LogStat = logstat;
        !           162:        if (logfac != 0)
        !           163:                LogFacility = logfac & LOG_FACMASK;
        !           164:        if (LogFile >= 0)
        !           165:                return;
        !           166:        SyslogAddr.sa_family = AF_UNIX;
        !           167:        strncpy(SyslogAddr.sa_data, logname, sizeof SyslogAddr.sa_data);
        !           168:        if (LogStat & LOG_NDELAY) {
        !           169:                LogFile = socket(AF_UNIX, SOCK_DGRAM, 0);
        !           170:                fcntl(LogFile, F_SETFD, 1);
        !           171:        }
        !           172: }
        !           173: 
        !           174: /*
        !           175:  * CLOSELOG -- close the system log
        !           176:  */
        !           177: 
        !           178: closelog()
        !           179: {
        !           180: 
        !           181:        (void) close(LogFile);
        !           182:        LogFile = -1;
        !           183: }
        !           184: 
        !           185: /*
        !           186:  * SETLOGMASK -- set the log mask level
        !           187:  */
        !           188: setlogmask(pmask)
        !           189:        int pmask;
        !           190: {
        !           191:        int omask;
        !           192: 
        !           193:        omask = LogMask;
        !           194:        if (pmask != 0)
        !           195:                LogMask = pmask;
        !           196:        return (omask);
        !           197: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.