]> git.saurik.com Git - apple/network_cmds.git/blame - logger.tproj/logger.c
network_cmds-245.tar.gz
[apple/network_cmds.git] / logger.tproj / logger.c
CommitLineData
b7080c8e
A
1/*
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
2b484d24
A
6 * "Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7 * Reserved. This file contains Original Code and/or Modifications of
8 * Original Code as defined in and that are subject to the Apple Public
9 * Source License Version 1.0 (the 'License'). You may not use this file
10 * except in compliance with the License. Please obtain a copy of the
11 * License at http://www.apple.com/publicsource and read it before using
12 * this file.
b7080c8e
A
13 *
14 * The Original Code and all software distributed under the License are
15 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
2b484d24
A
18 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19 * License for the specific language governing rights and limitations
20 * under the License."
b7080c8e
A
21 *
22 * @APPLE_LICENSE_HEADER_END@
23 */
24/*
25 * Copyright (c) 1983, 1993
26 * The Regents of the University of California. All rights reserved.
27 *
28 * Redistribution and use in source and binary forms, with or without
29 * modification, are permitted provided that the following conditions
30 * are met:
31 * 1. Redistributions of source code must retain the above copyright
32 * notice, this list of conditions and the following disclaimer.
33 * 2. Redistributions in binary form must reproduce the above copyright
34 * notice, this list of conditions and the following disclaimer in the
35 * documentation and/or other materials provided with the distribution.
36 * 3. All advertising materials mentioning features or use of this software
37 * must display the following acknowledgement:
38 * This product includes software developed by the University of
39 * California, Berkeley and its contributors.
40 * 4. Neither the name of the University nor the names of its contributors
41 * may be used to endorse or promote products derived from this software
42 * without specific prior written permission.
43 *
44 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
45 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
46 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
47 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
48 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
49 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
50 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
51 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
52 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
53 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
54 * SUCH DAMAGE.
55 */
56
57#include <errno.h>
58#include <unistd.h>
59#include <stdlib.h>
60#include <stdio.h>
61#include <ctype.h>
62#include <string.h>
63
64#define SYSLOG_NAMES
65#include <syslog.h>
66
67int decode __P((char *, CODE *));
68int pencode __P((char *));
69void usage __P((void));
70
71/*
72 * logger -- read and log utility
73 *
74 * Reads from an input and arranges to write the result on the system
75 * log.
76 */
77int
78main(argc, argv)
79 int argc;
80 char *argv[];
81{
82 int ch, logflags, pri;
83 char *tag, buf[1024];
84
85 tag = NULL;
86 pri = LOG_NOTICE;
87 logflags = 0;
88 while ((ch = getopt(argc, argv, "f:ip:st:")) != -1)
89 switch((char)ch) {
90 case 'f': /* file to log */
91 if (freopen(optarg, "r", stdin) == NULL) {
92 (void)fprintf(stderr, "logger: %s: %s.\n",
93 optarg, strerror(errno));
94 exit(1);
95 }
96 break;
97 case 'i': /* log process id also */
98 logflags |= LOG_PID;
99 break;
100 case 'p': /* priority */
101 pri = pencode(optarg);
102 break;
103 case 's': /* log to standard error */
104 logflags |= LOG_PERROR;
105 break;
106 case 't': /* tag */
107 tag = optarg;
108 break;
109 case '?':
110 default:
111 usage();
112 }
113 argc -= optind;
114 argv += optind;
115
116 /* setup for logging */
117 openlog(tag ? tag : getlogin(), logflags, 0);
118 (void) fclose(stdout);
119
120 /* log input line if appropriate */
121 if (argc > 0) {
122 register char *p, *endp;
123 int len;
124
125 for (p = buf, endp = buf + sizeof(buf) - 2; *argv;) {
126 len = strlen(*argv);
127 if (p + len > endp && p > buf) {
128 syslog(pri, "%s", buf);
129 p = buf;
130 }
131 if (len > sizeof(buf) - 1)
132 syslog(pri, "%s", *argv++);
133 else {
134 if (p != buf)
135 *p++ = ' ';
136 bcopy(*argv++, p, len);
137 *(p += len) = '\0';
138 }
139 }
140 if (p != buf)
141 syslog(pri, "%s", buf);
142 } else
143 while (fgets(buf, sizeof(buf), stdin) != NULL)
144 syslog(pri, "%s", buf);
145 exit(0);
146}
147
148/*
149 * Decode a symbolic name to a numeric value
150 */
151int
152pencode(s)
153 register char *s;
154{
155 char *save;
156 int fac, lev;
157
158 for (save = s; *s && *s != '.'; ++s);
159 if (*s) {
160 *s = '\0';
161 fac = decode(save, facilitynames);
162 if (fac < 0) {
163 (void)fprintf(stderr,
164 "logger: unknown facility name: %s.\n", save);
165 exit(1);
166 }
167 *s++ = '.';
168 }
169 else {
170 fac = 0;
171 s = save;
172 }
173 lev = decode(s, prioritynames);
174 if (lev < 0) {
175 (void)fprintf(stderr,
176 "logger: unknown priority name: %s.\n", save);
177 exit(1);
178 }
179 return ((lev & LOG_PRIMASK) | (fac & LOG_FACMASK));
180}
181
182int
183decode(name, codetab)
184 char *name;
185 CODE *codetab;
186{
187 register CODE *c;
188
189 if (isdigit(*name))
190 return (atoi(name));
191
192 for (c = codetab; c->c_name; c++)
193 if (!strcasecmp(name, c->c_name))
194 return (c->c_val);
195
196 return (-1);
197}
198
199void
200usage()
201{
202 (void)fprintf(stderr,
203 "logger: [-is] [-f file] [-p pri] [-t tag] [ message ... ]\n");
204 exit(1);
205}