|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.