|
|
1.1 root 1: /*
2: * Copyright (c) 1983 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms are permitted
6: * provided that: (1) source distributions retain this entire copyright
7: * notice and comment, and (2) distributions including binaries display
8: * the following acknowledgement: ``This product includes software
9: * developed by the University of California, Berkeley and its contributors''
10: * in the documentation or other materials provided with the distribution
11: * and in all advertising materials mentioning features or use of this
12: * software. Neither the name of the University nor the names of its
13: * contributors may be used to endorse or promote products derived
14: * from this software without specific prior written permission.
15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
18: */
19:
20: #ifndef lint
21: char copyright[] =
22: "@(#) Copyright (c) 1983 Regents of the University of California.\n\
23: All rights reserved.\n";
24: #endif /* not lint */
25:
26: #ifndef lint
27: static char sccsid[] = "@(#)logger.c 6.14 (Berkeley) 6/1/90";
28: #endif /* not lint */
29:
30: #include <stdio.h>
31: #include <syslog.h>
32: #include <ctype.h>
33:
34: /*
35: ** LOGGER -- read and log utility
36: **
37: ** This routine reads from an input and arranges to write the
38: ** result on the system log, along with a useful tag.
39: */
40:
41: main(argc, argv)
42: int argc;
43: char **argv;
44: {
45: extern char *optarg;
46: extern int errno, optind;
47: int pri = LOG_NOTICE;
48: int ch, logflags = 0;
49: char *tag, buf[1024], *getlogin(), *strerror();
50:
51: tag = NULL;
52: while ((ch = getopt(argc, argv, "f:ip:st:")) != EOF)
53: switch((char)ch) {
54: case 'f': /* file to log */
55: if (freopen(optarg, "r", stdin) == NULL) {
56: (void)fprintf(stderr, "logger: %s: %s.\n",
57: optarg, strerror(errno));
58: exit(1);
59: }
60: break;
61: case 'i': /* log process id also */
62: logflags |= LOG_PID;
63: break;
64: case 'p': /* priority */
65: pri = pencode(optarg);
66: break;
67: case 's': /* log to standard error */
68: logflags |= LOG_PERROR;
69: break;
70: case 't': /* tag */
71: tag = optarg;
72: break;
73: case '?':
74: default:
75: usage();
76: }
77: argc -= optind;
78: argv += optind;
79:
80: /* setup for logging */
81: openlog(tag ? tag : getlogin(), logflags, 0);
82: (void) fclose(stdout);
83:
84: /* log input line if appropriate */
85: if (argc > 0) {
86: register char *p, *endp;
87: int len;
88:
89: for (p = buf, endp = buf + sizeof(buf) - 2; *argv;) {
90: len = strlen(*argv);
91: if (p + len > endp && p > buf) {
92: syslog(pri, "%s", buf);
93: p = buf;
94: }
95: if (len > sizeof(buf) - 1)
96: syslog(pri, "%s", *argv++);
97: else {
98: if (p != buf)
99: *p++ = ' ';
100: bcopy(*argv++, p, len);
101: *(p += len) = '\0';
102: }
103: }
104: if (p != buf)
105: syslog(pri, "%s", buf);
106: exit(0);
107: }
108:
109: /* main loop */
110: while (fgets(buf, sizeof(buf), stdin) != NULL)
111: syslog(pri, "%s", buf);
112:
113: exit(0);
114: }
115:
116: #define SYSLOG_NAMES
117: #include <syslog.h>
118:
119: /*
120: * Decode a symbolic name to a numeric value
121: */
122: pencode(s)
123: register char *s;
124: {
125: char *save;
126: int fac, lev;
127:
128: for (save = s; *s && *s != '.'; ++s);
129: if (*s) {
130: *s = '\0';
131: fac = decode(save, facilitynames);
132: if (fac < 0)
133: bailout("unknown facility name: ", save);
134: *s++ = '.';
135: }
136: else {
137: fac = 0;
138: s = save;
139: }
140: lev = decode(s, prioritynames);
141: if (lev < 0)
142: bailout("unknown priority name: ", save);
143: return ((lev & LOG_PRIMASK) | (fac & LOG_FACMASK));
144: }
145:
146:
147: decode(name, codetab)
148: char *name;
149: CODE *codetab;
150: {
151: register CODE *c;
152:
153: if (isdigit(*name))
154: return (atoi(name));
155:
156: for (c = codetab; c->c_name; c++)
157: if (!strcasecmp(name, c->c_name))
158: return (c->c_val);
159:
160: return (-1);
161: }
162:
163: bailout(msg, arg)
164: char *msg, *arg;
165: {
166: fprintf(stderr, "logger: %s%s\n", msg, arg);
167: exit(1);
168: }
169:
170: usage()
171: {
172: fputs("logger: [-i] [-f file] [-p pri] [-t tag] [ message ... ]\n",
173: stderr);
174: exit(1);
175: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.