2 * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
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.
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
29 #include <sys/types.h>
42 #include "descriptor.h"
45 static const char *const LogNames
[] = {
54 "Filter", /* Log discarded packets */
73 #define MSK(n) (1<<((n)-1))
75 static u_long LogMask
= MSK(LogPHASE
);
76 static u_long LogMaskLocal
= MSK(LogERROR
) | MSK(LogALERT
) | MSK(LogWARN
);
77 static int LogTunno
= -1;
78 static const char *LogIfaceName
;
79 static struct prompt
*promptlist
; /* Where to log local stuff */
80 struct prompt
*log_PromptContext
;
81 int log_PromptListChanged
;
90 log_RegisterPrompt(struct prompt
*prompt
)
92 prompt
->next
= promptlist
;
95 log_DiscardAllLocal(&prompt
->logmask
);
99 log_ActivatePrompt(struct prompt
*prompt
)
102 LogMaskLocal
|= prompt
->logmask
;
106 LogSetMaskLocal(void)
110 LogMaskLocal
= MSK(LogERROR
) | MSK(LogALERT
) | MSK(LogWARN
);
111 for (p
= promptlist
; p
; p
= p
->next
)
112 LogMaskLocal
|= p
->logmask
;
116 log_DeactivatePrompt(struct prompt
*prompt
)
118 if (prompt
->active
) {
125 log_UnRegisterPrompt(struct prompt
*prompt
)
130 for (p
= &promptlist
; *p
; p
= &(*p
)->next
)
137 log_PromptListChanged
++;
142 log_DestroyPrompts(struct server
*s
)
144 struct prompt
*p
, *pn
, *pl
;
150 if (s
&& p
->owner
== s
) {
154 promptlist
= p
->next
;
156 prompt_Destroy(p
, 1);
168 for (p
= promptlist
; p
; p
= p
->next
)
173 log_WritePrompts(struct datalink
*dl
, const char *fmt
,...)
179 for (p
= promptlist
; p
; p
= p
->next
)
180 if (prompt_IsTermMode(p
, dl
))
181 prompt_vPrintf(p
, fmt
, ap
);
186 log_SetTtyCommandMode(struct datalink
*dl
)
190 for (p
= promptlist
; p
; p
= p
->next
)
191 if (prompt_IsTermMode(p
, dl
))
192 prompt_TtyCommandMode(p
);
211 return lev
>= LogMIN
&& lev
<= LogMAX
? LOG_INFO
: 0;
219 return id
< LogMIN
|| id
> LogMAX
? "Unknown" : LogNames
[id
- 1];
225 if (id
>= LogMIN
&& id
<= LogMAXCONF
)
230 log_KeepLocal(int id
, u_long
*mask
)
232 if (id
>= LogMIN
&& id
<= LogMAXCONF
) {
233 LogMaskLocal
|= MSK(id
);
241 if (id
>= LogMIN
&& id
<= LogMAXCONF
)
246 log_DiscardLocal(int id
, u_long
*mask
)
248 if (id
>= LogMIN
&& id
<= LogMAXCONF
) {
261 log_DiscardAllLocal(u_long
*mask
)
263 *mask
= MSK(LogERROR
) | MSK(LogALERT
) | MSK(LogWARN
);
271 return LOG_KEPT_SYSLOG
;
272 if (id
< LogMIN
|| id
> LogMAX
)
275 return LOG_KEPT_LOCAL
| LOG_KEPT_SYSLOG
;
277 return ((LogMaskLocal
& MSK(id
)) ? LOG_KEPT_LOCAL
: 0) |
278 ((LogMask
& MSK(id
)) ? LOG_KEPT_SYSLOG
: 0);
282 log_IsKeptLocal(int id
, u_long mask
)
284 if (id
< LogMIN
|| id
> LogMAX
)
287 return LOG_KEPT_LOCAL
| LOG_KEPT_SYSLOG
;
289 return ((mask
& MSK(id
)) ? LOG_KEPT_LOCAL
: 0) |
290 ((LogMask
& MSK(id
)) ? LOG_KEPT_SYSLOG
: 0);
294 log_Open(const char *Name
)
296 openlog(Name
, LOG_PID
, LOG_DAEMON
);
300 log_SetTun(int tunno
, const char *ifaceName
)
303 LogIfaceName
= ifaceName
;
315 log_Printf(int lev
, const char *fmt
,...)
318 struct prompt
*prompt
;
320 if (log_IsKept(lev
)) {
324 if (promptlist
&& (log_IsKept(lev
) & LOG_KEPT_LOCAL
)) {
325 if ((log_IsKept(LogTUN
) & LOG_KEPT_LOCAL
) && LogTunno
!= -1) {
327 snprintf(nfmt
, sizeof nfmt
, "%s%d(%s): %s: %s", TUN_NAME
,
328 LogTunno
, LogIfaceName
, log_Name(lev
), fmt
);
330 snprintf(nfmt
, sizeof nfmt
, "%s%d: %s: %s", TUN_NAME
,
331 LogTunno
, log_Name(lev
), fmt
);
333 snprintf(nfmt
, sizeof nfmt
, "%s: %s", log_Name(lev
), fmt
);
335 if (log_PromptContext
&& lev
== LogWARN
)
336 /* Warnings just go to the current prompt */
337 prompt_vPrintf(log_PromptContext
, nfmt
, ap
);
338 else for (prompt
= promptlist
; prompt
; prompt
= prompt
->next
)
339 if (lev
> LogMAXCONF
|| (prompt
->logmask
& MSK(lev
)))
340 prompt_vPrintf(prompt
, nfmt
, ap
);
345 if ((log_IsKept(lev
) & LOG_KEPT_SYSLOG
) &&
346 (lev
!= LogWARN
|| !log_PromptContext
)) {
347 if ((log_IsKept(LogTUN
) & LOG_KEPT_SYSLOG
) && LogTunno
!= -1) {
349 snprintf(nfmt
, sizeof nfmt
, "%s%d(%s): %s: %s", TUN_NAME
,
350 LogTunno
, LogIfaceName
, log_Name(lev
), fmt
);
352 snprintf(nfmt
, sizeof nfmt
, "%s%d: %s: %s", TUN_NAME
,
353 LogTunno
, log_Name(lev
), fmt
);
355 snprintf(nfmt
, sizeof nfmt
, "%s: %s", log_Name(lev
), fmt
);
356 vsyslog(syslogLevel(lev
), nfmt
, ap
);
363 log_DumpBp(int lev
, const char *hdr
, const struct mbuf
*bp
)
365 if (log_IsKept(lev
)) {
372 log_Printf(lev
, "%s\n", hdr
);
378 ptr
= CONST_MBUF_CTOP(bp
);
380 sprintf(b
, " %02x", (int) *ptr
);
381 *c
++ = isprint(*ptr
) ? *ptr
: '.';
387 log_Printf(lev
, "%s\n", buf
);
392 } while ((bp
= bp
->m_next
) != NULL
);
395 memset(b
, ' ', 50 - (b
- buf
));
397 log_Printf(lev
, "%s\n", buf
);
403 log_DumpBuff(int lev
, const char *hdr
, const u_char
*ptr
, int n
)
405 if (log_IsKept(lev
)) {
410 log_Printf(lev
, "%s\n", hdr
);
414 for (b
= buf
; b
!= buf
+ 48 && n
--; b
+= 3, ptr
++) {
415 sprintf(b
, " %02x", (int) *ptr
);
416 *c
++ = isprint(*ptr
) ? *ptr
: '.';
418 memset(b
, ' ', 50 - (b
- buf
));
420 log_Printf(lev
, "%s\n", buf
);
426 log_ShowLevel(struct cmdargs
const *arg
)
430 prompt_Printf(arg
->prompt
, "Log: ");
431 for (i
= LogMIN
; i
<= LogMAX
; i
++)
432 if (log_IsKept(i
) & LOG_KEPT_SYSLOG
)
433 prompt_Printf(arg
->prompt
, " %s", log_Name(i
));
435 prompt_Printf(arg
->prompt
, "\nLocal:");
436 for (i
= LogMIN
; i
<= LogMAX
; i
++)
437 if (log_IsKeptLocal(i
, arg
->prompt
->logmask
) & LOG_KEPT_LOCAL
)
438 prompt_Printf(arg
->prompt
, " %s", log_Name(i
));
440 prompt_Printf(arg
->prompt
, "\n");
446 log_SetLevel(struct cmdargs
const *arg
)
448 int i
, res
, argc
, local
;
449 char const *const *argv
, *argp
;
451 argc
= arg
->argc
- arg
->argn
;
452 argv
= arg
->argv
+ arg
->argn
;
455 if (argc
== 0 || strcasecmp(argv
[0], "local"))
458 if (arg
->prompt
== NULL
) {
459 log_Printf(LogWARN
, "set log local: Only available on the"
468 if (argc
== 0 || (argv
[0][0] != '+' && argv
[0][0] != '-')) {
470 log_DiscardAllLocal(&arg
->prompt
->logmask
);
476 argp
= **argv
== '+' || **argv
== '-' ? *argv
+ 1 : *argv
;
477 /* Special case 'all' */
478 if (strcasecmp(argp
, "all") == 0) {
481 for (i
= LogMIN
; i
<= LogMAX
; i
++)
482 log_DiscardLocal(i
, &arg
->prompt
->logmask
);
484 for (i
= LogMIN
; i
<= LogMAX
; i
++)
487 for (i
= LogMIN
; i
<= LogMAX
; i
++)
488 log_KeepLocal(i
, &arg
->prompt
->logmask
);
490 for (i
= LogMIN
; i
<= LogMAX
; i
++)
495 for (i
= LogMIN
; i
<= LogMAX
; i
++)
496 if (strcasecmp(argp
, log_Name(i
)) == 0) {
499 log_DiscardLocal(i
, &arg
->prompt
->logmask
);
503 log_KeepLocal(i
, &arg
->prompt
->logmask
);
509 log_Printf(LogWARN
, "%s: Invalid log value\n", argp
);
518 log_ShowWho(struct cmdargs
const *arg
)
522 for (p
= promptlist
; p
; p
= p
->next
) {
523 prompt_Printf(arg
->prompt
, "%s (%s)", p
->src
.type
, p
->src
.from
);
524 if (p
== arg
->prompt
)
525 prompt_Printf(arg
->prompt
, " *");
527 prompt_Printf(arg
->prompt
, " ^Z");
528 prompt_Printf(arg
->prompt
, "\n");