Deleted Added
sdiff udiff text old ( 31962 ) new ( 32663 )
full compact
1/*-
2 * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 * $Id: log.c,v 1.23 1997/12/21 12:11:07 brian Exp $
27 */
28
29#include <sys/param.h>
30#include <netinet/in.h>
31#include <sys/socket.h>
32
33#include <stdarg.h>
34#include <stdio.h>
35#include <syslog.h>
36
37#include "command.h"
38#include "mbuf.h"
39#include "log.h"
40#include "loadalias.h"
41#include "defs.h"
42#include "vars.h"
43
44static const char *LogNames[] = {
45 "Async",
46 "Carrier",
47 "CCP",
48 "Chat",
49 "Command",
50 "Connect",
51 "Debug",
52 "HDLC",
53 "ID0",
54 "IPCP",
55 "LCP",
56 "Link",
57 "LQM",
58 "Phase",
59 "TCP/IP",
60 "Tun",
61 "Warning",
62 "Error",
63 "Alert"
64};
65
66#define MSK(n) (1<<((n)-1))
67
68static u_long LogMask = MSK(LogLINK) | MSK(LogCARRIER) | MSK(LogPHASE);
69static u_long LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN);
70static int LogTunno = -1;
71
72static int
73syslogLevel(int lev)
74{
75 switch (lev) {
76 case LogDEBUG:return LOG_DEBUG;
77 case LogWARN:
78 return LOG_WARNING;
79 case LogERROR:
80 return LOG_ERR;
81 case LogALERT:
82 return LOG_ALERT;
83 }
84 return lev >= LogMIN && lev <= LogMAX ? LOG_INFO : 0;
85}
86
87const char *
88LogName(int id)
89{
90 return id < LogMIN || id > LogMAX ? "Unknown" : LogNames[id - 1];
91}
92
93void
94LogKeep(int id)
95{
96 if (id >= LogMIN && id <= LogMAXCONF)
97 LogMask |= MSK(id);
98}
99
100void
101LogKeepLocal(int id)
102{
103 if (id >= LogMIN && id <= LogMAXCONF)
104 LogMaskLocal |= MSK(id);
105}
106
107void
108LogDiscard(int id)
109{
110 if (id >= LogMIN && id <= LogMAXCONF)
111 LogMask &= ~MSK(id);
112}
113
114void
115LogDiscardLocal(int id)
116{
117 if (id >= LogMIN && id <= LogMAXCONF)
118 LogMaskLocal &= ~MSK(id);
119}
120
121void
122LogDiscardAll()
123{
124 LogMask = 0;
125}
126
127void
128LogDiscardAllLocal()
129{
130 LogMaskLocal = 0;
131}
132
133int
134LogIsKept(int id)
135{
136 if (id < LogMIN || id > LogMAX)
137 return 0;
138 if (id > LogMAXCONF)
139 return LOG_KEPT_LOCAL | LOG_KEPT_SYSLOG;
140
141 return ((LogMaskLocal & MSK(id)) ? LOG_KEPT_LOCAL : 0) |
142 ((LogMask & MSK(id)) ? LOG_KEPT_SYSLOG : 0);
143}
144
145void
146LogOpen(const char *Name)
147{
148 openlog(Name, LOG_PID, LOG_DAEMON);
149}
150
151void
152LogSetTun(int tunno)
153{
154 LogTunno = tunno;
155}
156
157void
158LogClose()
159{
160 closelog();
161 LogTunno = -1;
162}
163
164void
165LogPrintf(int lev, const char *fmt,...)
166{
167 va_list ap;
168
169 va_start(ap, fmt);
170 if (LogIsKept(lev)) {
171 static char nfmt[200];
172
173 if ((LogIsKept(lev) & LOG_KEPT_LOCAL) && VarTerm) {
174 if ((LogIsKept(LogTUN) & LOG_KEPT_LOCAL) && LogTunno != -1)
175 snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s",
176 LogTunno, LogName(lev), fmt);
177 else
178 snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt);
179 vfprintf(VarTerm, nfmt, ap);
180 fflush(VarTerm);
181 }
182
183 if ((LogIsKept(lev) & LOG_KEPT_SYSLOG) && (lev != LogWARN || !VarTerm)) {
184 if ((LogIsKept(LogTUN) & LOG_KEPT_SYSLOG) && LogTunno != -1)
185 snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s",
186 LogTunno, LogName(lev), fmt);
187 else
188 snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt);
189 vsyslog(syslogLevel(lev), nfmt, ap);
190 }
191 }
192 va_end(ap);
193}
194
195void
196LogDumpBp(int lev, const char *hdr, const struct mbuf * bp)
197{
198 if (LogIsKept(lev)) {
199 char buf[50];
200 char *b;
201 u_char *ptr;
202 int f;
203
204 if (hdr && *hdr)
205 LogPrintf(lev, "%s\n", hdr);
206
207 b = buf;
208 do {
209 f = bp->cnt;
210 ptr = MBUF_CTOP(bp);
211 while (f--) {
212 sprintf(b, " %02x", (int) *ptr++);
213 b += 3;
214 if (b == buf + sizeof buf - 2) {
215 strcpy(b, "\n");
216 LogPrintf(lev, buf);
217 b = buf;
218 }
219 }
220 } while ((bp = bp->next) != NULL);
221
222 if (b > buf) {
223 strcpy(b, "\n");
224 LogPrintf(lev, buf);
225 }
226 }
227}
228
229void
230LogDumpBuff(int lev, const char *hdr, const u_char * ptr, int n)
231{
232 if (LogIsKept(lev)) {
233 char buf[50];
234 char *b;
235
236 if (hdr && *hdr)
237 LogPrintf(lev, "%s\n", hdr);
238 while (n > 0) {
239 b = buf;
240 for (b = buf; b != buf + sizeof buf - 2 && n--; b += 3)
241 sprintf(b, " %02x", (int) *ptr++);
242 strcpy(b, "\n");
243 LogPrintf(lev, buf);
244 }
245 }
246}