|
|
1.1 root 1: #ifndef lint
2: static char SccsId[] = "@(#)syslog.c 4.1 (Berkeley) 5/27/83";
3: #endif
4:
5: /*
6: * SYSLOG -- print message on log file
7: *
8: * This routine looks a lot like printf, except that it
9: * outputs to the log file instead of the standard output.
10: * Also, it prints the module name in front of lines,
11: * and has some other formatting types (or will sometime).
12: * Also, it adds a newline on the end of messages.
13: *
14: * The output of this routine is intended to be read by
15: * /etc/syslog, which will add timestamps.
16: */
17: #include <sys/types.h>
18: #include <sys/socket.h>
19: #include <netinet/in.h>
20:
21: #include <syslog.h>
22: #include <netdb.h>
23:
24: #define MAXLINE 1024 /* max message size */
25: #define BUFSLOP 20 /* space to allow for "extra stuff" */
26: #define NULL 0 /* manifest */
27:
28: int LogFile = -1; /* fd for log */
29: int LogStat = 0; /* status bits, set by initlog */
30: char *LogTag = NULL; /* string to tag the entry with */
31: int LogMask = LOG_DEBUG; /* lowest priority to be logged */
32:
33: struct sockaddr_in SyslogAddr;
34: static char *SyslogHost = LOG_HOST;
35:
36: extern int errno, sys_nerr;
37: extern char *sys_errlist[];
38:
39: syslog(pri, fmt, p0, p1, p2, p3, p4)
40: int pri;
41: char *fmt;
42: {
43: char buf[MAXLINE+BUFSLOP], outline[MAXLINE + 1];
44: register char *b, *f;
45:
46: if (LogFile < 0)
47: openlog(0, 0);
48: /* see if we should just throw out this message */
49: if (pri > LogMask)
50: return;
51: for (b = buf, f = fmt; f && *f; b = buf) {
52: register char c;
53:
54: if (pri > 0 && (LogStat & LOG_COOLIT) == 0) {
55: sprintf(b, "<%d>", pri);
56: b += strlen(b);
57: }
58: if (LogStat & LOG_PID) {
59: sprintf(b, "%d ", getpid());
60: b += strlen(b);
61: }
62: if (LogTag) {
63: sprintf(b, "%s: ", LogTag);
64: b += strlen(b);
65: }
66: while ((c = *f++) != '\0' && c != '\n' && b < buf + MAXLINE) {
67: if (c != '%') {
68: *b++ = c;
69: continue;
70: }
71: c = *f++;
72: if (c != 'm') {
73: *b++ = '%', *b++ = c, *b++ = '\0';
74: continue;
75: }
76: if ((unsigned)errno > sys_nerr)
77: sprintf(b, "error %d", errno);
78: else
79: strcat(b, sys_errlist[errno]);
80: b += strlen(b);
81: }
82: if (c == '\0')
83: f--;
84: *b++ = '\n', *b = '\0';
85: sprintf(outline, buf, p0, p1, p2, p3, p4);
86: errno = 0;
87: if (LogStat & LOG_DGRAM)
88: (void) sendto(LogFile, outline, strlen(outline), 0,
89: &SyslogAddr, sizeof SyslogAddr);
90: else
91: (void) write(LogFile, outline, strlen(outline));
92: if (errno)
93: perror("syslog: sendto");
94: }
95: }
96:
97: /*
98: * OPENLOG -- open system log
99: */
100: openlog(ident, logstat)
101: char *ident;
102: int logstat;
103: {
104: struct servent *sp;
105: struct hostent *hp;
106:
107: LogTag = ident;
108: LogStat = logstat;
109: if (LogFile >= 0)
110: return;
111: sp = getservbyname("syslog", "udp");
112: hp = gethostbyname(SyslogHost);
113: if (sp == NULL || hp == NULL)
114: goto bad;
115: LogFile = socket(AF_INET, SOCK_DGRAM, 0);
116: if (LogFile < 0) {
117: perror("syslog: socket");
118: goto bad;
119: }
120: bzero(&SyslogAddr, sizeof SyslogAddr);
121: SyslogAddr.sin_family = hp->h_addrtype;
122: bcopy(hp->h_addr, (char *)&SyslogAddr.sin_addr, hp->h_length);
123: SyslogAddr.sin_port = sp->s_port;
124: LogStat |= LOG_DGRAM;
125: return;
126: bad:
127: LogStat |= LOG_COOLIT;
128: LogStat &= ~LOG_DGRAM;
129: LogMask = LOG_CRIT;
130: LogFile = open("/dev/console", 1);
131: if (LogFile < 0) {
132: perror("syslog: /dev/console");
133: LogFile = 2;
134: }
135: }
136:
137: /*
138: * CLOSELOG -- close the system log
139: */
140: closelog()
141: {
142:
143: (void) close(LogFile);
144: LogFile = -1;
145: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.