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
26 * $FreeBSD: src/usr.sbin/ppp/log.c,v 1.44.2.5 2002/09/01 02:12:28 brian Exp $
27 * $DragonFly: src/usr.sbin/ppp/log.c,v 1.3 2005/11/24 23:42:54 swildner Exp $
30 #include <sys/types.h>
43 #include "descriptor.h"
46 static const char *const LogNames
[] = {
55 "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 struct prompt
*promptlist
; /* Where to log local stuff */
79 struct prompt
*log_PromptContext
;
80 int log_PromptListChanged
;
89 log_RegisterPrompt(struct prompt
*prompt
)
91 prompt
->next
= promptlist
;
94 log_DiscardAllLocal(&prompt
->logmask
);
98 log_ActivatePrompt(struct prompt
*prompt
)
101 LogMaskLocal
|= prompt
->logmask
;
105 LogSetMaskLocal(void)
109 LogMaskLocal
= MSK(LogERROR
) | MSK(LogALERT
) | MSK(LogWARN
);
110 for (p
= promptlist
; p
; p
= p
->next
)
111 LogMaskLocal
|= p
->logmask
;
115 log_DeactivatePrompt(struct prompt
*prompt
)
117 if (prompt
->active
) {
124 log_UnRegisterPrompt(struct prompt
*prompt
)
129 for (p
= &promptlist
; *p
; p
= &(*p
)->next
)
136 log_PromptListChanged
++;
141 log_DestroyPrompts(struct server
*s
)
143 struct prompt
*p
, *pn
, *pl
;
149 if (s
&& p
->owner
== s
) {
153 promptlist
= p
->next
;
155 prompt_Destroy(p
, 1);
163 log_DisplayPrompts(void)
167 for (p
= promptlist
; p
; p
= p
->next
)
172 log_WritePrompts(struct datalink
*dl
, const char *fmt
,...)
178 for (p
= promptlist
; p
; p
= p
->next
)
179 if (prompt_IsTermMode(p
, dl
))
180 prompt_vPrintf(p
, fmt
, ap
);
185 log_SetTtyCommandMode(struct datalink
*dl
)
189 for (p
= promptlist
; p
; p
= p
->next
)
190 if (prompt_IsTermMode(p
, dl
))
191 prompt_TtyCommandMode(p
);
210 return lev
>= LogMIN
&& lev
<= LogMAX
? LOG_INFO
: 0;
218 return id
< LogMIN
|| id
> LogMAX
? "Unknown" : LogNames
[id
- 1];
224 if (id
>= LogMIN
&& id
<= LogMAXCONF
)
229 log_KeepLocal(int id
, u_long
*mask
)
231 if (id
>= LogMIN
&& id
<= LogMAXCONF
) {
232 LogMaskLocal
|= MSK(id
);
240 if (id
>= LogMIN
&& id
<= LogMAXCONF
)
245 log_DiscardLocal(int id
, u_long
*mask
)
247 if (id
>= LogMIN
&& id
<= LogMAXCONF
) {
260 log_DiscardAllLocal(u_long
*mask
)
262 *mask
= MSK(LogERROR
) | MSK(LogALERT
) | MSK(LogWARN
);
270 return LOG_KEPT_SYSLOG
;
271 if (id
< LogMIN
|| id
> LogMAX
)
274 return LOG_KEPT_LOCAL
| LOG_KEPT_SYSLOG
;
276 return ((LogMaskLocal
& MSK(id
)) ? LOG_KEPT_LOCAL
: 0) |
277 ((LogMask
& MSK(id
)) ? LOG_KEPT_SYSLOG
: 0);
281 log_IsKeptLocal(int id
, u_long mask
)
283 if (id
< LogMIN
|| id
> LogMAX
)
286 return LOG_KEPT_LOCAL
| LOG_KEPT_SYSLOG
;
288 return ((mask
& MSK(id
)) ? LOG_KEPT_LOCAL
: 0) |
289 ((LogMask
& MSK(id
)) ? LOG_KEPT_SYSLOG
: 0);
293 log_Open(const char *Name
)
295 openlog(Name
, LOG_PID
, LOG_DAEMON
);
299 log_SetTun(int tunno
)
312 log_Printf(int lev
, const char *fmt
,...)
315 struct prompt
*prompt
;
317 if (log_IsKept(lev
)) {
321 if (promptlist
&& (log_IsKept(lev
) & LOG_KEPT_LOCAL
)) {
322 if ((log_IsKept(LogTUN
) & LOG_KEPT_LOCAL
) && LogTunno
!= -1)
323 snprintf(nfmt
, sizeof nfmt
, "%s%d: %s: %s", TUN_NAME
,
324 LogTunno
, log_Name(lev
), fmt
);
326 snprintf(nfmt
, sizeof nfmt
, "%s: %s", log_Name(lev
), fmt
);
328 if (log_PromptContext
&& lev
== LogWARN
)
329 /* Warnings just go to the current prompt */
330 prompt_vPrintf(log_PromptContext
, nfmt
, ap
);
331 else for (prompt
= promptlist
; prompt
; prompt
= prompt
->next
)
332 if (lev
> LogMAXCONF
|| (prompt
->logmask
& MSK(lev
)))
333 prompt_vPrintf(prompt
, nfmt
, ap
);
338 if ((log_IsKept(lev
) & LOG_KEPT_SYSLOG
) &&
339 (lev
!= LogWARN
|| !log_PromptContext
)) {
340 if ((log_IsKept(LogTUN
) & LOG_KEPT_SYSLOG
) && LogTunno
!= -1)
341 snprintf(nfmt
, sizeof nfmt
, "%s%d: %s: %s", TUN_NAME
,
342 LogTunno
, log_Name(lev
), fmt
);
344 snprintf(nfmt
, sizeof nfmt
, "%s: %s", log_Name(lev
), fmt
);
345 vsyslog(syslogLevel(lev
), nfmt
, ap
);
352 log_DumpBp(int lev
, const char *hdr
, const struct mbuf
*bp
)
354 if (log_IsKept(lev
)) {
361 log_Printf(lev
, "%s\n", hdr
);
367 ptr
= CONST_MBUF_CTOP(bp
);
369 sprintf(b
, " %02x", (int) *ptr
);
370 *c
++ = isprint(*ptr
) ? *ptr
: '.';
376 log_Printf(lev
, "%s\n", buf
);
381 } while ((bp
= bp
->m_next
) != NULL
);
384 memset(b
, ' ', 50 - (b
- buf
));
386 log_Printf(lev
, "%s\n", buf
);
392 log_DumpBuff(int lev
, const char *hdr
, const u_char
*ptr
, int n
)
394 if (log_IsKept(lev
)) {
399 log_Printf(lev
, "%s\n", hdr
);
403 for (b
= buf
; b
!= buf
+ 48 && n
--; b
+= 3, ptr
++) {
404 sprintf(b
, " %02x", (int) *ptr
);
405 *c
++ = isprint(*ptr
) ? *ptr
: '.';
407 memset(b
, ' ', 50 - (b
- buf
));
409 log_Printf(lev
, "%s\n", buf
);
415 log_ShowLevel(struct cmdargs
const *arg
)
419 prompt_Printf(arg
->prompt
, "Log: ");
420 for (i
= LogMIN
; i
<= LogMAX
; i
++)
421 if (log_IsKept(i
) & LOG_KEPT_SYSLOG
)
422 prompt_Printf(arg
->prompt
, " %s", log_Name(i
));
424 prompt_Printf(arg
->prompt
, "\nLocal:");
425 for (i
= LogMIN
; i
<= LogMAX
; i
++)
426 if (log_IsKeptLocal(i
, arg
->prompt
->logmask
) & LOG_KEPT_LOCAL
)
427 prompt_Printf(arg
->prompt
, " %s", log_Name(i
));
429 prompt_Printf(arg
->prompt
, "\n");
435 log_SetLevel(struct cmdargs
const *arg
)
437 int i
, res
, argc
, local
;
438 char const *const *argv
, *argp
;
440 argc
= arg
->argc
- arg
->argn
;
441 argv
= arg
->argv
+ arg
->argn
;
444 if (argc
== 0 || strcasecmp(argv
[0], "local"))
447 if (arg
->prompt
== NULL
) {
448 log_Printf(LogWARN
, "set log local: Only available on the"
457 if (argc
== 0 || (argv
[0][0] != '+' && argv
[0][0] != '-')) {
459 log_DiscardAllLocal(&arg
->prompt
->logmask
);
465 argp
= **argv
== '+' || **argv
== '-' ? *argv
+ 1 : *argv
;
466 /* Special case 'all' */
467 if (strcasecmp(argp
, "all") == 0) {
470 for (i
= LogMIN
; i
<= LogMAX
; i
++)
471 log_DiscardLocal(i
, &arg
->prompt
->logmask
);
473 for (i
= LogMIN
; i
<= LogMAX
; i
++)
476 for (i
= LogMIN
; i
<= LogMAX
; i
++)
477 log_KeepLocal(i
, &arg
->prompt
->logmask
);
479 for (i
= LogMIN
; i
<= LogMAX
; i
++)
484 for (i
= LogMIN
; i
<= LogMAX
; i
++)
485 if (strcasecmp(argp
, log_Name(i
)) == 0) {
488 log_DiscardLocal(i
, &arg
->prompt
->logmask
);
492 log_KeepLocal(i
, &arg
->prompt
->logmask
);
498 log_Printf(LogWARN
, "%s: Invalid log value\n", argp
);
507 log_ShowWho(struct cmdargs
const *arg
)
511 for (p
= promptlist
; p
; p
= p
->next
) {
512 prompt_Printf(arg
->prompt
, "%s (%s)", p
->src
.type
, p
->src
.from
);
513 if (p
== arg
->prompt
)
514 prompt_Printf(arg
->prompt
, " *");
516 prompt_Printf(arg
->prompt
, " ^Z");
517 prompt_Printf(arg
->prompt
, "\n");