|
|
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.