1 /*
2 * Copyright (c) 1983, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #ifndef lint
9 static char copyright[] =
10 "@(#) Copyright (c) 1983, 1993\n\
11 The Regents of the University of California. All rights reserved.\n";
12 #endif /* not lint */
13
14 #ifndef lint
15 static char sccsid[] = "@(#)logger.c 8.1 (Berkeley) 06/06/93";
16 #endif /* not lint */
17
18 #include <errno.h>
19 #include <unistd.h>
20 #include <stdlib.h>
21 #include <stdio.h>
22 #include <ctype.h>
23 #include <string.h>
24
25 #define SYSLOG_NAMES
26 #include <syslog.h>
27
28 int decode __P((char *, CODE *));
29 int pencode __P((char *));
30 void usage __P((void));
31
32 /*
33 * logger -- read and log utility
34 *
35 * Reads from an input and arranges to write the result on the system
36 * log.
37 */
38 int
main(argc,argv)39 main(argc, argv)
40 int argc;
41 char *argv[];
42 {
43 int ch, logflags, pri;
44 char *tag, buf[1024];
45
46 tag = NULL;
47 pri = LOG_NOTICE;
48 logflags = 0;
49 while ((ch = getopt(argc, argv, "f:ip:st:")) != EOF)
50 switch((char)ch) {
51 case 'f': /* file to log */
52 if (freopen(optarg, "r", stdin) == NULL) {
53 (void)fprintf(stderr, "logger: %s: %s.\n",
54 optarg, strerror(errno));
55 exit(1);
56 }
57 break;
58 case 'i': /* log process id also */
59 logflags |= LOG_PID;
60 break;
61 case 'p': /* priority */
62 pri = pencode(optarg);
63 break;
64 case 's': /* log to standard error */
65 logflags |= LOG_PERROR;
66 break;
67 case 't': /* tag */
68 tag = optarg;
69 break;
70 case '?':
71 default:
72 usage();
73 }
74 argc -= optind;
75 argv += optind;
76
77 /* setup for logging */
78 openlog(tag ? tag : getlogin(), logflags, 0);
79 (void) fclose(stdout);
80
81 /* log input line if appropriate */
82 if (argc > 0) {
83 register char *p, *endp;
84 int len;
85
86 for (p = buf, endp = buf + sizeof(buf) - 2; *argv;) {
87 len = strlen(*argv);
88 if (p + len > endp && p > buf) {
89 syslog(pri, "%s", buf);
90 p = buf;
91 }
92 if (len > sizeof(buf) - 1)
93 syslog(pri, "%s", *argv++);
94 else {
95 if (p != buf)
96 *p++ = ' ';
97 bcopy(*argv++, p, len);
98 *(p += len) = '\0';
99 }
100 }
101 if (p != buf)
102 syslog(pri, "%s", buf);
103 } else
104 while (fgets(buf, sizeof(buf), stdin) != NULL)
105 syslog(pri, "%s", buf);
106 exit(0);
107 }
108
109 /*
110 * Decode a symbolic name to a numeric value
111 */
112 int
pencode(s)113 pencode(s)
114 register char *s;
115 {
116 char *save;
117 int fac, lev;
118
119 for (save = s; *s && *s != '.'; ++s);
120 if (*s) {
121 *s = '\0';
122 fac = decode(save, facilitynames);
123 if (fac < 0) {
124 (void)fprintf(stderr,
125 "logger: unknown facility name: %s.\n", save);
126 exit(1);
127 }
128 *s++ = '.';
129 }
130 else {
131 fac = 0;
132 s = save;
133 }
134 lev = decode(s, prioritynames);
135 if (lev < 0) {
136 (void)fprintf(stderr,
137 "logger: unknown priority name: %s.\n", save);
138 exit(1);
139 }
140 return ((lev & LOG_PRIMASK) | (fac & LOG_FACMASK));
141 }
142
143 int
decode(name,codetab)144 decode(name, codetab)
145 char *name;
146 CODE *codetab;
147 {
148 register CODE *c;
149
150 if (isdigit(*name))
151 return (atoi(name));
152
153 for (c = codetab; c->c_name; c++)
154 if (!strcasecmp(name, c->c_name))
155 return (c->c_val);
156
157 return (-1);
158 }
159
160 void
usage()161 usage()
162 {
163 (void)fprintf(stderr,
164 "logger: [-is] [-f file] [-p pri] [-t tag] [ message ... ]\n");
165 exit(1);
166 }
167