log.c (70a91e4c407285c095e2eb0307b6a54ed3467681) log.c (b6217683dc0269a53b799399522dbdfb5a4919cc)
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 unchanged lines hidden (view full) ---

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 *
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 unchanged lines hidden (view full) ---

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.25 1998/01/21 02:15:18 brian Exp $
26 * $Id: log.c,v 1.25.2.1 1998/02/10 03:23:25 brian Exp $
27 */
28
29#include <sys/param.h>
30#include <netinet/in.h>
31
32#include <stdarg.h>
33#include <stdio.h>
34#include <string.h>
35#include <syslog.h>
27 */
28
29#include <sys/param.h>
30#include <netinet/in.h>
31
32#include <stdarg.h>
33#include <stdio.h>
34#include <string.h>
35#include <syslog.h>
36#include <termios.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"
37
38#include "command.h"
39#include "mbuf.h"
40#include "log.h"
41#include "loadalias.h"
42#include "defs.h"
43#include "vars.h"
44#include "descriptor.h"
45#include "prompt.h"
43
44static const char *LogNames[] = {
45 "Async",
46 "Carrier",
47 "CCP",
48 "Chat",
49 "Command",
50 "Connect",

--- 12 unchanged lines hidden (view full) ---

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;
46
47static const char *LogNames[] = {
48 "Async",
49 "Carrier",
50 "CCP",
51 "Chat",
52 "Command",
53 "Connect",

--- 12 unchanged lines hidden (view full) ---

66 "Alert"
67};
68
69#define MSK(n) (1<<((n)-1))
70
71static u_long LogMask = MSK(LogLINK) | MSK(LogCARRIER) | MSK(LogPHASE);
72static u_long LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN);
73static int LogTunno = -1;
74static struct prompt *logprompt; /* Where to log local stuff */
71
75
76void
77log_RegisterPrompt(struct prompt *prompt)
78{
79 if (prompt) {
80 prompt->lognext = logprompt;
81 logprompt = prompt;
82 LogMaskLocal |= prompt->logmask;
83 }
84}
85
86void
87log_UnRegisterPrompt(struct prompt *prompt)
88{
89 if (prompt) {
90 struct prompt **p;
91
92 LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN);
93 for (p = &logprompt; *p; p = &(*p)->lognext) {
94 if (*p == prompt) {
95 *p = (*p)->lognext;
96 prompt->lognext = NULL;
97 if (!*p)
98 break;
99 }
100 LogMaskLocal |= (*p)->logmask;
101 }
102 }
103}
104
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:

--- 13 unchanged lines hidden (view full) ---

93void
94LogKeep(int id)
95{
96 if (id >= LogMIN && id <= LogMAXCONF)
97 LogMask |= MSK(id);
98}
99
100void
105static int
106syslogLevel(int lev)
107{
108 switch (lev) {
109 case LogDEBUG:return LOG_DEBUG;
110 case LogWARN:
111 return LOG_WARNING;
112 case LogERROR:

--- 13 unchanged lines hidden (view full) ---

126void
127LogKeep(int id)
128{
129 if (id >= LogMIN && id <= LogMAXCONF)
130 LogMask |= MSK(id);
131}
132
133void
101LogKeepLocal(int id)
134LogKeepLocal(int id, u_long *mask)
102{
135{
103 if (id >= LogMIN && id <= LogMAXCONF)
136 if (id >= LogMIN && id <= LogMAXCONF) {
104 LogMaskLocal |= MSK(id);
137 LogMaskLocal |= MSK(id);
138 *mask |= MSK(id);
139 }
105}
106
107void
108LogDiscard(int id)
109{
110 if (id >= LogMIN && id <= LogMAXCONF)
111 LogMask &= ~MSK(id);
112}
113
114void
140}
141
142void
143LogDiscard(int id)
144{
145 if (id >= LogMIN && id <= LogMAXCONF)
146 LogMask &= ~MSK(id);
147}
148
149void
115LogDiscardLocal(int id)
150LogDiscardLocal(int id, u_long *mask)
116{
151{
117 if (id >= LogMIN && id <= LogMAXCONF)
152 if (id >= LogMIN && id <= LogMAXCONF) {
118 LogMaskLocal &= ~MSK(id);
153 LogMaskLocal &= ~MSK(id);
154 *mask &= ~MSK(id);
155 }
119}
120
121void
122LogDiscardAll()
123{
124 LogMask = 0;
125}
126
127void
156}
157
158void
159LogDiscardAll()
160{
161 LogMask = 0;
162}
163
164void
128LogDiscardAllLocal()
165LogDiscardAllLocal(u_long *mask)
129{
166{
130 LogMaskLocal = 0;
167 LogMaskLocal = *mask = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN);
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
168}
169
170int
171LogIsKept(int id)
172{
173 if (id < LogMIN || id > LogMAX)
174 return 0;
175 if (id > LogMAXCONF)
176 return LOG_KEPT_LOCAL | LOG_KEPT_SYSLOG;
177
178 return ((LogMaskLocal & MSK(id)) ? LOG_KEPT_LOCAL : 0) |
179 ((LogMask & MSK(id)) ? LOG_KEPT_SYSLOG : 0);
180}
181
182int
183LogIsKeptLocal(int id, u_long mask)
184{
185 if (id < LogMIN || id > LogMAX)
186 return 0;
187 if (id > LogMAXCONF)
188 return LOG_KEPT_LOCAL | LOG_KEPT_SYSLOG;
189
190 return ((mask & MSK(id)) ? LOG_KEPT_LOCAL : 0) |
191 ((LogMask & MSK(id)) ? LOG_KEPT_SYSLOG : 0);
192}
193
145void
146LogOpen(const char *Name)
147{
148 openlog(Name, LOG_PID, LOG_DAEMON);
149}
150
151void
152LogSetTun(int tunno)

--- 7 unchanged lines hidden (view full) ---

160 closelog();
161 LogTunno = -1;
162}
163
164void
165LogPrintf(int lev, const char *fmt,...)
166{
167 va_list ap;
194void
195LogOpen(const char *Name)
196{
197 openlog(Name, LOG_PID, LOG_DAEMON);
198}
199
200void
201LogSetTun(int tunno)

--- 7 unchanged lines hidden (view full) ---

209 closelog();
210 LogTunno = -1;
211}
212
213void
214LogPrintf(int lev, const char *fmt,...)
215{
216 va_list ap;
217 struct prompt *prompt;
168
169 va_start(ap, fmt);
170 if (LogIsKept(lev)) {
171 static char nfmt[200];
172
218
219 va_start(ap, fmt);
220 if (LogIsKept(lev)) {
221 static char nfmt[200];
222
173 if ((LogIsKept(lev) & LOG_KEPT_LOCAL) && VarTerm) {
223 if ((LogIsKept(lev) & LOG_KEPT_LOCAL) && logprompt) {
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);
224 if ((LogIsKept(LogTUN) & LOG_KEPT_LOCAL) && LogTunno != -1)
225 snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s",
226 LogTunno, LogName(lev), fmt);
227 else
228 snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt);
179 vfprintf(VarTerm, nfmt, ap);
180 fflush(VarTerm);
229
230 for (prompt = logprompt; prompt; prompt = prompt->lognext)
231 if (lev > LogMAXCONF || (prompt->logmask & MSK(lev)))
232 prompt_vPrintf(prompt, nfmt, ap);
181 }
182
233 }
234
183 if ((LogIsKept(lev) & LOG_KEPT_SYSLOG) && (lev != LogWARN || !VarTerm)) {
235 if ((LogIsKept(lev) & LOG_KEPT_SYSLOG) && (lev != LogWARN || !logprompt)) {
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 }

--- 47 unchanged lines hidden (view full) ---

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}
236 if ((LogIsKept(LogTUN) & LOG_KEPT_SYSLOG) && LogTunno != -1)
237 snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s",
238 LogTunno, LogName(lev), fmt);
239 else
240 snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt);
241 vsyslog(syslogLevel(lev), nfmt, ap);
242 }
243 }

--- 47 unchanged lines hidden (view full) ---

291 b = buf;
292 for (b = buf; b != buf + sizeof buf - 2 && n--; b += 3)
293 sprintf(b, " %02x", (int) *ptr++);
294 strcpy(b, "\n");
295 LogPrintf(lev, buf);
296 }
297 }
298}
299
300int
301log_ShowLevel(struct cmdargs const *arg)
302{
303 int i;
304
305 prompt_Printf(arg->prompt, "Log: ");
306 for (i = LogMIN; i <= LogMAX; i++)
307 if (LogIsKept(i) & LOG_KEPT_SYSLOG)
308 prompt_Printf(arg->prompt, " %s", LogName(i));
309
310 prompt_Printf(arg->prompt, "\nLocal:");
311 for (i = LogMIN; i <= LogMAX; i++)
312 if (LogIsKeptLocal(i, arg->prompt->logmask) & LOG_KEPT_LOCAL)
313 prompt_Printf(arg->prompt, " %s", LogName(i));
314
315 prompt_Printf(arg->prompt, "\n");
316
317 return 0;
318}
319
320int
321log_SetLevel(struct cmdargs const *arg)
322{
323 int i, res, argc, local;
324 char const *const *argv, *argp;
325
326 argc = arg->argc;
327 argv = arg->argv;
328 res = 0;
329
330 if (argc == 0 || strcasecmp(argv[0], "local"))
331 local = 0;
332 else {
333 if (arg->prompt == NULL) {
334 LogPrintf(LogWARN, "set log local: Only available on the command line\n");
335 return 1;
336 }
337 argc--;
338 argv++;
339 local = 1;
340 }
341
342 if (argc == 0 || (argv[0][0] != '+' && argv[0][0] != '-'))
343 if (local)
344 LogDiscardAllLocal(&arg->prompt->logmask);
345 else
346 LogDiscardAll();
347
348 while (argc--) {
349 argp = **argv == '+' || **argv == '-' ? *argv + 1 : *argv;
350 for (i = LogMIN; i <= LogMAX; i++)
351 if (strcasecmp(argp, LogName(i)) == 0) {
352 if (**argv == '-')
353 if (local)
354 LogDiscardLocal(i, &arg->prompt->logmask);
355 else
356 LogDiscard(i);
357 else if (local)
358 LogKeepLocal(i, &arg->prompt->logmask);
359 else
360 LogKeep(i);
361 break;
362 }
363 if (i > LogMAX) {
364 LogPrintf(LogWARN, "%s: Invalid log value\n", argp);
365 res = -1;
366 }
367 argv++;
368 }
369 return res;
370}
371
372int
373log_ShowWho(struct cmdargs const *arg)
374{
375 struct prompt *p;
376
377 for (p = logprompt; p; p = p->lognext)
378 prompt_Printf(arg->prompt, "%s%s\n", p->who, p == arg->prompt ? " *" : "");
379
380 return 0;
381}