186d7f5d3SJohn Marino /*-
286d7f5d3SJohn Marino * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org>
386d7f5d3SJohn Marino * All rights reserved.
486d7f5d3SJohn Marino *
586d7f5d3SJohn Marino * Redistribution and use in source and binary forms, with or without
686d7f5d3SJohn Marino * modification, are permitted provided that the following conditions
786d7f5d3SJohn Marino * are met:
886d7f5d3SJohn Marino * 1. Redistributions of source code must retain the above copyright
986d7f5d3SJohn Marino * notice, this list of conditions and the following disclaimer.
1086d7f5d3SJohn Marino * 2. Redistributions in binary form must reproduce the above copyright
1186d7f5d3SJohn Marino * notice, this list of conditions and the following disclaimer in the
1286d7f5d3SJohn Marino * documentation and/or other materials provided with the distribution.
1386d7f5d3SJohn Marino *
1486d7f5d3SJohn Marino * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1586d7f5d3SJohn Marino * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1686d7f5d3SJohn Marino * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1786d7f5d3SJohn Marino * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1886d7f5d3SJohn Marino * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
1986d7f5d3SJohn Marino * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2086d7f5d3SJohn Marino * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2186d7f5d3SJohn Marino * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2286d7f5d3SJohn Marino * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2386d7f5d3SJohn Marino * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2486d7f5d3SJohn Marino * SUCH DAMAGE.
2586d7f5d3SJohn Marino *
2686d7f5d3SJohn Marino * $FreeBSD: src/usr.sbin/ppp/log.c,v 1.44.2.5 2002/09/01 02:12:28 brian Exp $
2786d7f5d3SJohn Marino * $DragonFly: src/usr.sbin/ppp/log.c,v 1.4 2008/05/19 10:19:49 corecode Exp $
2886d7f5d3SJohn Marino */
2986d7f5d3SJohn Marino
3086d7f5d3SJohn Marino #include <sys/types.h>
3186d7f5d3SJohn Marino #include <sys/select.h>
3286d7f5d3SJohn Marino
3386d7f5d3SJohn Marino #include <ctype.h>
3486d7f5d3SJohn Marino #include <stdarg.h>
3586d7f5d3SJohn Marino #include <stdio.h>
3686d7f5d3SJohn Marino #include <string.h>
3786d7f5d3SJohn Marino #include <syslog.h>
3886d7f5d3SJohn Marino #include <termios.h>
3986d7f5d3SJohn Marino
4086d7f5d3SJohn Marino #include "defs.h"
4186d7f5d3SJohn Marino #include "command.h"
4286d7f5d3SJohn Marino #include "mbuf.h"
4386d7f5d3SJohn Marino #include "log.h"
4486d7f5d3SJohn Marino #include "descriptor.h"
4586d7f5d3SJohn Marino #include "prompt.h"
4686d7f5d3SJohn Marino
4786d7f5d3SJohn Marino static const char *const LogNames[] = {
4886d7f5d3SJohn Marino "Async",
4986d7f5d3SJohn Marino "CBCP",
5086d7f5d3SJohn Marino "CCP",
5186d7f5d3SJohn Marino "Chat",
5286d7f5d3SJohn Marino "Command",
5386d7f5d3SJohn Marino "Connect",
5486d7f5d3SJohn Marino "Debug",
5586d7f5d3SJohn Marino "DNS",
5686d7f5d3SJohn Marino "Filter", /* Log discarded packets */
5786d7f5d3SJohn Marino "HDLC",
5886d7f5d3SJohn Marino "ID0",
5986d7f5d3SJohn Marino "IPCP",
6086d7f5d3SJohn Marino "IPV6CP",
6186d7f5d3SJohn Marino "LCP",
6286d7f5d3SJohn Marino "LQM",
6386d7f5d3SJohn Marino "Phase",
6486d7f5d3SJohn Marino "Physical",
6586d7f5d3SJohn Marino "Sync",
6686d7f5d3SJohn Marino "TCP/IP",
6786d7f5d3SJohn Marino "Timer",
6886d7f5d3SJohn Marino "Tun",
6986d7f5d3SJohn Marino "Warning",
7086d7f5d3SJohn Marino "Error",
7186d7f5d3SJohn Marino "Alert"
7286d7f5d3SJohn Marino };
7386d7f5d3SJohn Marino
7486d7f5d3SJohn Marino #define MSK(n) (1<<((n)-1))
7586d7f5d3SJohn Marino
7686d7f5d3SJohn Marino static u_long LogMask = MSK(LogPHASE);
7786d7f5d3SJohn Marino static u_long LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN);
7886d7f5d3SJohn Marino static int LogTunno = -1;
7986d7f5d3SJohn Marino static struct prompt *promptlist; /* Where to log local stuff */
8086d7f5d3SJohn Marino struct prompt *log_PromptContext;
8186d7f5d3SJohn Marino int log_PromptListChanged;
8286d7f5d3SJohn Marino
8386d7f5d3SJohn Marino struct prompt *
log_PromptList(void)8486d7f5d3SJohn Marino log_PromptList(void)
8586d7f5d3SJohn Marino {
8686d7f5d3SJohn Marino return promptlist;
8786d7f5d3SJohn Marino }
8886d7f5d3SJohn Marino
8986d7f5d3SJohn Marino void
log_RegisterPrompt(struct prompt * prompt)9086d7f5d3SJohn Marino log_RegisterPrompt(struct prompt *prompt)
9186d7f5d3SJohn Marino {
9286d7f5d3SJohn Marino prompt->next = promptlist;
9386d7f5d3SJohn Marino promptlist = prompt;
9486d7f5d3SJohn Marino prompt->active = 1;
9586d7f5d3SJohn Marino log_DiscardAllLocal(&prompt->logmask);
9686d7f5d3SJohn Marino }
9786d7f5d3SJohn Marino
9886d7f5d3SJohn Marino void
log_ActivatePrompt(struct prompt * prompt)9986d7f5d3SJohn Marino log_ActivatePrompt(struct prompt *prompt)
10086d7f5d3SJohn Marino {
10186d7f5d3SJohn Marino prompt->active = 1;
10286d7f5d3SJohn Marino LogMaskLocal |= prompt->logmask;
10386d7f5d3SJohn Marino }
10486d7f5d3SJohn Marino
10586d7f5d3SJohn Marino static void
LogSetMaskLocal(void)10686d7f5d3SJohn Marino LogSetMaskLocal(void)
10786d7f5d3SJohn Marino {
10886d7f5d3SJohn Marino struct prompt *p;
10986d7f5d3SJohn Marino
11086d7f5d3SJohn Marino LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN);
11186d7f5d3SJohn Marino for (p = promptlist; p; p = p->next)
11286d7f5d3SJohn Marino LogMaskLocal |= p->logmask;
11386d7f5d3SJohn Marino }
11486d7f5d3SJohn Marino
11586d7f5d3SJohn Marino void
log_DeactivatePrompt(struct prompt * prompt)11686d7f5d3SJohn Marino log_DeactivatePrompt(struct prompt *prompt)
11786d7f5d3SJohn Marino {
11886d7f5d3SJohn Marino if (prompt->active) {
11986d7f5d3SJohn Marino prompt->active = 0;
12086d7f5d3SJohn Marino LogSetMaskLocal();
12186d7f5d3SJohn Marino }
12286d7f5d3SJohn Marino }
12386d7f5d3SJohn Marino
12486d7f5d3SJohn Marino void
log_UnRegisterPrompt(struct prompt * prompt)12586d7f5d3SJohn Marino log_UnRegisterPrompt(struct prompt *prompt)
12686d7f5d3SJohn Marino {
12786d7f5d3SJohn Marino if (prompt) {
12886d7f5d3SJohn Marino struct prompt **p;
12986d7f5d3SJohn Marino
13086d7f5d3SJohn Marino for (p = &promptlist; *p; p = &(*p)->next)
13186d7f5d3SJohn Marino if (*p == prompt) {
13286d7f5d3SJohn Marino *p = prompt->next;
13386d7f5d3SJohn Marino prompt->next = NULL;
13486d7f5d3SJohn Marino break;
13586d7f5d3SJohn Marino }
13686d7f5d3SJohn Marino LogSetMaskLocal();
13786d7f5d3SJohn Marino log_PromptListChanged++;
13886d7f5d3SJohn Marino }
13986d7f5d3SJohn Marino }
14086d7f5d3SJohn Marino
14186d7f5d3SJohn Marino void
log_DestroyPrompts(struct server * s)14286d7f5d3SJohn Marino log_DestroyPrompts(struct server *s)
14386d7f5d3SJohn Marino {
14486d7f5d3SJohn Marino struct prompt *p, *pn, *pl;
14586d7f5d3SJohn Marino
14686d7f5d3SJohn Marino p = promptlist;
14786d7f5d3SJohn Marino pl = NULL;
14886d7f5d3SJohn Marino while (p) {
14986d7f5d3SJohn Marino pn = p->next;
15086d7f5d3SJohn Marino if (s && p->owner == s) {
15186d7f5d3SJohn Marino if (pl)
15286d7f5d3SJohn Marino pl->next = p->next;
15386d7f5d3SJohn Marino else
15486d7f5d3SJohn Marino promptlist = p->next;
15586d7f5d3SJohn Marino p->next = NULL;
15686d7f5d3SJohn Marino prompt_Destroy(p, 1);
15786d7f5d3SJohn Marino } else
15886d7f5d3SJohn Marino pl = p;
15986d7f5d3SJohn Marino p = pn;
16086d7f5d3SJohn Marino }
16186d7f5d3SJohn Marino }
16286d7f5d3SJohn Marino
16386d7f5d3SJohn Marino void
log_DisplayPrompts(void)16486d7f5d3SJohn Marino log_DisplayPrompts(void)
16586d7f5d3SJohn Marino {
16686d7f5d3SJohn Marino struct prompt *p;
16786d7f5d3SJohn Marino
16886d7f5d3SJohn Marino for (p = promptlist; p; p = p->next)
16986d7f5d3SJohn Marino prompt_Required(p);
17086d7f5d3SJohn Marino }
17186d7f5d3SJohn Marino
17286d7f5d3SJohn Marino void
log_WritePrompts(struct datalink * dl,const char * fmt,...)17386d7f5d3SJohn Marino log_WritePrompts(struct datalink *dl, const char *fmt,...)
17486d7f5d3SJohn Marino {
17586d7f5d3SJohn Marino va_list ap;
17686d7f5d3SJohn Marino struct prompt *p;
17786d7f5d3SJohn Marino
17886d7f5d3SJohn Marino va_start(ap, fmt);
17986d7f5d3SJohn Marino for (p = promptlist; p; p = p->next)
18086d7f5d3SJohn Marino if (prompt_IsTermMode(p, dl))
18186d7f5d3SJohn Marino prompt_vPrintf(p, fmt, ap);
18286d7f5d3SJohn Marino va_end(ap);
18386d7f5d3SJohn Marino }
18486d7f5d3SJohn Marino
18586d7f5d3SJohn Marino void
log_SetTtyCommandMode(struct datalink * dl)18686d7f5d3SJohn Marino log_SetTtyCommandMode(struct datalink *dl)
18786d7f5d3SJohn Marino {
18886d7f5d3SJohn Marino struct prompt *p;
18986d7f5d3SJohn Marino
19086d7f5d3SJohn Marino for (p = promptlist; p; p = p->next)
19186d7f5d3SJohn Marino if (prompt_IsTermMode(p, dl))
19286d7f5d3SJohn Marino prompt_TtyCommandMode(p);
19386d7f5d3SJohn Marino }
19486d7f5d3SJohn Marino
19586d7f5d3SJohn Marino static int
syslogLevel(int lev)19686d7f5d3SJohn Marino syslogLevel(int lev)
19786d7f5d3SJohn Marino {
19886d7f5d3SJohn Marino switch (lev) {
19986d7f5d3SJohn Marino case LogLOG:
20086d7f5d3SJohn Marino return LOG_INFO;
20186d7f5d3SJohn Marino case LogDEBUG:
20286d7f5d3SJohn Marino case LogTIMER:
20386d7f5d3SJohn Marino return LOG_DEBUG;
20486d7f5d3SJohn Marino case LogWARN:
20586d7f5d3SJohn Marino return LOG_WARNING;
20686d7f5d3SJohn Marino case LogERROR:
20786d7f5d3SJohn Marino return LOG_ERR;
20886d7f5d3SJohn Marino case LogALERT:
20986d7f5d3SJohn Marino return LOG_ALERT;
21086d7f5d3SJohn Marino }
21186d7f5d3SJohn Marino return lev >= LogMIN && lev <= LogMAX ? LOG_INFO : 0;
21286d7f5d3SJohn Marino }
21386d7f5d3SJohn Marino
21486d7f5d3SJohn Marino const char *
log_Name(int id)21586d7f5d3SJohn Marino log_Name(int id)
21686d7f5d3SJohn Marino {
21786d7f5d3SJohn Marino if (id == LogLOG)
21886d7f5d3SJohn Marino return "LOG";
21986d7f5d3SJohn Marino return id < LogMIN || id > LogMAX ? "Unknown" : LogNames[id - 1];
22086d7f5d3SJohn Marino }
22186d7f5d3SJohn Marino
22286d7f5d3SJohn Marino void
log_Keep(int id)22386d7f5d3SJohn Marino log_Keep(int id)
22486d7f5d3SJohn Marino {
22586d7f5d3SJohn Marino if (id >= LogMIN && id <= LogMAXCONF)
22686d7f5d3SJohn Marino LogMask |= MSK(id);
22786d7f5d3SJohn Marino }
22886d7f5d3SJohn Marino
22986d7f5d3SJohn Marino void
log_KeepLocal(int id,u_long * mask)23086d7f5d3SJohn Marino log_KeepLocal(int id, u_long *mask)
23186d7f5d3SJohn Marino {
23286d7f5d3SJohn Marino if (id >= LogMIN && id <= LogMAXCONF) {
23386d7f5d3SJohn Marino LogMaskLocal |= MSK(id);
23486d7f5d3SJohn Marino *mask |= MSK(id);
23586d7f5d3SJohn Marino }
23686d7f5d3SJohn Marino }
23786d7f5d3SJohn Marino
23886d7f5d3SJohn Marino void
log_Discard(int id)23986d7f5d3SJohn Marino log_Discard(int id)
24086d7f5d3SJohn Marino {
24186d7f5d3SJohn Marino if (id >= LogMIN && id <= LogMAXCONF)
24286d7f5d3SJohn Marino LogMask &= ~MSK(id);
24386d7f5d3SJohn Marino }
24486d7f5d3SJohn Marino
24586d7f5d3SJohn Marino void
log_DiscardLocal(int id,u_long * mask)24686d7f5d3SJohn Marino log_DiscardLocal(int id, u_long *mask)
24786d7f5d3SJohn Marino {
24886d7f5d3SJohn Marino if (id >= LogMIN && id <= LogMAXCONF) {
24986d7f5d3SJohn Marino *mask &= ~MSK(id);
25086d7f5d3SJohn Marino LogSetMaskLocal();
25186d7f5d3SJohn Marino }
25286d7f5d3SJohn Marino }
25386d7f5d3SJohn Marino
25486d7f5d3SJohn Marino void
log_DiscardAll(void)25586d7f5d3SJohn Marino log_DiscardAll(void)
25686d7f5d3SJohn Marino {
25786d7f5d3SJohn Marino LogMask = 0;
25886d7f5d3SJohn Marino }
25986d7f5d3SJohn Marino
26086d7f5d3SJohn Marino void
log_DiscardAllLocal(u_long * mask)26186d7f5d3SJohn Marino log_DiscardAllLocal(u_long *mask)
26286d7f5d3SJohn Marino {
26386d7f5d3SJohn Marino *mask = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN);
26486d7f5d3SJohn Marino LogSetMaskLocal();
26586d7f5d3SJohn Marino }
26686d7f5d3SJohn Marino
26786d7f5d3SJohn Marino int
log_IsKept(int id)26886d7f5d3SJohn Marino log_IsKept(int id)
26986d7f5d3SJohn Marino {
27086d7f5d3SJohn Marino if (id == LogLOG)
27186d7f5d3SJohn Marino return LOG_KEPT_SYSLOG;
27286d7f5d3SJohn Marino if (id < LogMIN || id > LogMAX)
27386d7f5d3SJohn Marino return 0;
27486d7f5d3SJohn Marino if (id > LogMAXCONF)
27586d7f5d3SJohn Marino return LOG_KEPT_LOCAL | LOG_KEPT_SYSLOG;
27686d7f5d3SJohn Marino
27786d7f5d3SJohn Marino return ((LogMaskLocal & MSK(id)) ? LOG_KEPT_LOCAL : 0) |
27886d7f5d3SJohn Marino ((LogMask & MSK(id)) ? LOG_KEPT_SYSLOG : 0);
27986d7f5d3SJohn Marino }
28086d7f5d3SJohn Marino
28186d7f5d3SJohn Marino int
log_IsKeptLocal(int id,u_long mask)28286d7f5d3SJohn Marino log_IsKeptLocal(int id, u_long mask)
28386d7f5d3SJohn Marino {
28486d7f5d3SJohn Marino if (id < LogMIN || id > LogMAX)
28586d7f5d3SJohn Marino return 0;
28686d7f5d3SJohn Marino if (id > LogMAXCONF)
28786d7f5d3SJohn Marino return LOG_KEPT_LOCAL | LOG_KEPT_SYSLOG;
28886d7f5d3SJohn Marino
28986d7f5d3SJohn Marino return ((mask & MSK(id)) ? LOG_KEPT_LOCAL : 0) |
29086d7f5d3SJohn Marino ((LogMask & MSK(id)) ? LOG_KEPT_SYSLOG : 0);
29186d7f5d3SJohn Marino }
29286d7f5d3SJohn Marino
29386d7f5d3SJohn Marino void
log_Open(const char * Name)29486d7f5d3SJohn Marino log_Open(const char *Name)
29586d7f5d3SJohn Marino {
29686d7f5d3SJohn Marino openlog(Name, LOG_PID, LOG_DAEMON);
29786d7f5d3SJohn Marino }
29886d7f5d3SJohn Marino
29986d7f5d3SJohn Marino void
log_SetTun(int tunno)30086d7f5d3SJohn Marino log_SetTun(int tunno)
30186d7f5d3SJohn Marino {
30286d7f5d3SJohn Marino LogTunno = tunno;
30386d7f5d3SJohn Marino }
30486d7f5d3SJohn Marino
30586d7f5d3SJohn Marino void
log_Close(void)30686d7f5d3SJohn Marino log_Close(void)
30786d7f5d3SJohn Marino {
30886d7f5d3SJohn Marino closelog();
30986d7f5d3SJohn Marino LogTunno = -1;
31086d7f5d3SJohn Marino }
31186d7f5d3SJohn Marino
31286d7f5d3SJohn Marino void
log_Printf(int lev,const char * fmt,...)31386d7f5d3SJohn Marino log_Printf(int lev, const char *fmt,...)
31486d7f5d3SJohn Marino {
31586d7f5d3SJohn Marino va_list ap;
31686d7f5d3SJohn Marino struct prompt *prompt;
31786d7f5d3SJohn Marino
31886d7f5d3SJohn Marino if (log_IsKept(lev)) {
31986d7f5d3SJohn Marino char nfmt[200];
32086d7f5d3SJohn Marino
32186d7f5d3SJohn Marino va_start(ap, fmt);
32286d7f5d3SJohn Marino if (promptlist && (log_IsKept(lev) & LOG_KEPT_LOCAL)) {
32386d7f5d3SJohn Marino if ((log_IsKept(LogTUN) & LOG_KEPT_LOCAL) && LogTunno != -1)
32486d7f5d3SJohn Marino snprintf(nfmt, sizeof nfmt, "%s%d: %s: %s", TUN_NAME,
32586d7f5d3SJohn Marino LogTunno, log_Name(lev), fmt);
32686d7f5d3SJohn Marino else
32786d7f5d3SJohn Marino snprintf(nfmt, sizeof nfmt, "%s: %s", log_Name(lev), fmt);
32886d7f5d3SJohn Marino
32986d7f5d3SJohn Marino if (log_PromptContext && lev == LogWARN)
33086d7f5d3SJohn Marino /* Warnings just go to the current prompt */
33186d7f5d3SJohn Marino prompt_vPrintf(log_PromptContext, nfmt, ap);
33286d7f5d3SJohn Marino else for (prompt = promptlist; prompt; prompt = prompt->next)
33386d7f5d3SJohn Marino if (lev > LogMAXCONF || (prompt->logmask & MSK(lev)))
33486d7f5d3SJohn Marino prompt_vPrintf(prompt, nfmt, ap);
33586d7f5d3SJohn Marino }
33686d7f5d3SJohn Marino va_end(ap);
33786d7f5d3SJohn Marino
33886d7f5d3SJohn Marino va_start(ap, fmt);
33986d7f5d3SJohn Marino if ((log_IsKept(lev) & LOG_KEPT_SYSLOG) &&
34086d7f5d3SJohn Marino (lev != LogWARN || !log_PromptContext)) {
34186d7f5d3SJohn Marino if ((log_IsKept(LogTUN) & LOG_KEPT_SYSLOG) && LogTunno != -1)
34286d7f5d3SJohn Marino snprintf(nfmt, sizeof nfmt, "%s%d: %s: %s", TUN_NAME,
34386d7f5d3SJohn Marino LogTunno, log_Name(lev), fmt);
34486d7f5d3SJohn Marino else
34586d7f5d3SJohn Marino snprintf(nfmt, sizeof nfmt, "%s: %s", log_Name(lev), fmt);
34686d7f5d3SJohn Marino vsyslog(syslogLevel(lev), nfmt, ap);
34786d7f5d3SJohn Marino }
34886d7f5d3SJohn Marino va_end(ap);
34986d7f5d3SJohn Marino }
35086d7f5d3SJohn Marino }
35186d7f5d3SJohn Marino
35286d7f5d3SJohn Marino void
log_DumpBp(int lev,const char * hdr,const struct mbuf * bp)35386d7f5d3SJohn Marino log_DumpBp(int lev, const char *hdr, const struct mbuf *bp)
35486d7f5d3SJohn Marino {
35586d7f5d3SJohn Marino if (log_IsKept(lev)) {
35686d7f5d3SJohn Marino char buf[68];
35786d7f5d3SJohn Marino char *b, *c;
35886d7f5d3SJohn Marino const u_char *ptr;
35986d7f5d3SJohn Marino int f;
36086d7f5d3SJohn Marino
36186d7f5d3SJohn Marino if (hdr && *hdr)
36286d7f5d3SJohn Marino log_Printf(lev, "%s\n", hdr);
36386d7f5d3SJohn Marino
36486d7f5d3SJohn Marino b = buf;
36586d7f5d3SJohn Marino c = b + 50;
36686d7f5d3SJohn Marino do {
36786d7f5d3SJohn Marino f = bp->m_len;
36886d7f5d3SJohn Marino ptr = CONST_MBUF_CTOP(bp);
36986d7f5d3SJohn Marino while (f--) {
37086d7f5d3SJohn Marino sprintf(b, " %02x", (int) *ptr);
37186d7f5d3SJohn Marino *c++ = isprint(*ptr) ? *ptr : '.';
37286d7f5d3SJohn Marino ptr++;
37386d7f5d3SJohn Marino b += 3;
37486d7f5d3SJohn Marino if (b == buf + 48) {
37586d7f5d3SJohn Marino memset(b, ' ', 2);
37686d7f5d3SJohn Marino *c = '\0';
37786d7f5d3SJohn Marino log_Printf(lev, "%s\n", buf);
37886d7f5d3SJohn Marino b = buf;
37986d7f5d3SJohn Marino c = b + 50;
38086d7f5d3SJohn Marino }
38186d7f5d3SJohn Marino }
38286d7f5d3SJohn Marino } while ((bp = bp->m_next) != NULL);
38386d7f5d3SJohn Marino
38486d7f5d3SJohn Marino if (b > buf) {
38586d7f5d3SJohn Marino memset(b, ' ', 50 - (b - buf));
38686d7f5d3SJohn Marino *c = '\0';
38786d7f5d3SJohn Marino log_Printf(lev, "%s\n", buf);
38886d7f5d3SJohn Marino }
38986d7f5d3SJohn Marino }
39086d7f5d3SJohn Marino }
39186d7f5d3SJohn Marino
39286d7f5d3SJohn Marino void
log_DumpBuff(int lev,const char * hdr,const u_char * ptr,int n)39386d7f5d3SJohn Marino log_DumpBuff(int lev, const char *hdr, const u_char *ptr, int n)
39486d7f5d3SJohn Marino {
39586d7f5d3SJohn Marino if (log_IsKept(lev)) {
39686d7f5d3SJohn Marino char buf[68];
39786d7f5d3SJohn Marino char *b, *c;
39886d7f5d3SJohn Marino
39986d7f5d3SJohn Marino if (hdr && *hdr)
40086d7f5d3SJohn Marino log_Printf(lev, "%s\n", hdr);
40186d7f5d3SJohn Marino while (n > 0) {
40286d7f5d3SJohn Marino b = buf;
40386d7f5d3SJohn Marino c = b + 50;
40486d7f5d3SJohn Marino for (b = buf; b != buf + 48 && n--; b += 3, ptr++) {
40586d7f5d3SJohn Marino sprintf(b, " %02x", (int) *ptr);
40686d7f5d3SJohn Marino *c++ = isprint(*ptr) ? *ptr : '.';
40786d7f5d3SJohn Marino }
40886d7f5d3SJohn Marino memset(b, ' ', 50 - (b - buf));
40986d7f5d3SJohn Marino *c = '\0';
41086d7f5d3SJohn Marino log_Printf(lev, "%s\n", buf);
41186d7f5d3SJohn Marino }
41286d7f5d3SJohn Marino }
41386d7f5d3SJohn Marino }
41486d7f5d3SJohn Marino
41586d7f5d3SJohn Marino int
log_ShowLevel(struct cmdargs const * arg)41686d7f5d3SJohn Marino log_ShowLevel(struct cmdargs const *arg)
41786d7f5d3SJohn Marino {
41886d7f5d3SJohn Marino int i;
41986d7f5d3SJohn Marino
42086d7f5d3SJohn Marino prompt_Printf(arg->prompt, "Log: ");
42186d7f5d3SJohn Marino for (i = LogMIN; i <= LogMAX; i++)
42286d7f5d3SJohn Marino if (log_IsKept(i) & LOG_KEPT_SYSLOG)
42386d7f5d3SJohn Marino prompt_Printf(arg->prompt, " %s", log_Name(i));
42486d7f5d3SJohn Marino
42586d7f5d3SJohn Marino prompt_Printf(arg->prompt, "\nLocal:");
42686d7f5d3SJohn Marino for (i = LogMIN; i <= LogMAX; i++)
42786d7f5d3SJohn Marino if (log_IsKeptLocal(i, arg->prompt->logmask) & LOG_KEPT_LOCAL)
42886d7f5d3SJohn Marino prompt_Printf(arg->prompt, " %s", log_Name(i));
42986d7f5d3SJohn Marino
43086d7f5d3SJohn Marino prompt_Printf(arg->prompt, "\n");
43186d7f5d3SJohn Marino
43286d7f5d3SJohn Marino return 0;
43386d7f5d3SJohn Marino }
43486d7f5d3SJohn Marino
43586d7f5d3SJohn Marino int
log_SetLevel(struct cmdargs const * arg)43686d7f5d3SJohn Marino log_SetLevel(struct cmdargs const *arg)
43786d7f5d3SJohn Marino {
43886d7f5d3SJohn Marino int i, res, argc, local;
43986d7f5d3SJohn Marino char const *const *argv, *argp;
44086d7f5d3SJohn Marino
44186d7f5d3SJohn Marino argc = arg->argc - arg->argn;
44286d7f5d3SJohn Marino argv = arg->argv + arg->argn;
44386d7f5d3SJohn Marino res = 0;
44486d7f5d3SJohn Marino
44586d7f5d3SJohn Marino if (argc == 0 || strcasecmp(argv[0], "local"))
44686d7f5d3SJohn Marino local = 0;
44786d7f5d3SJohn Marino else {
44886d7f5d3SJohn Marino if (arg->prompt == NULL) {
44986d7f5d3SJohn Marino log_Printf(LogWARN, "set log local: Only available on the"
45086d7f5d3SJohn Marino " command line\n");
45186d7f5d3SJohn Marino return 1;
45286d7f5d3SJohn Marino }
45386d7f5d3SJohn Marino argc--;
45486d7f5d3SJohn Marino argv++;
45586d7f5d3SJohn Marino local = 1;
45686d7f5d3SJohn Marino }
45786d7f5d3SJohn Marino
45886d7f5d3SJohn Marino if (argc == 0 || (argv[0][0] != '+' && argv[0][0] != '-')) {
45986d7f5d3SJohn Marino if (local)
46086d7f5d3SJohn Marino log_DiscardAllLocal(&arg->prompt->logmask);
46186d7f5d3SJohn Marino else
46286d7f5d3SJohn Marino log_DiscardAll();
46386d7f5d3SJohn Marino }
46486d7f5d3SJohn Marino
46586d7f5d3SJohn Marino while (argc--) {
46686d7f5d3SJohn Marino argp = **argv == '+' || **argv == '-' ? *argv + 1 : *argv;
46786d7f5d3SJohn Marino /* Special case 'all' */
46886d7f5d3SJohn Marino if (strcasecmp(argp, "all") == 0) {
46986d7f5d3SJohn Marino if (**argv == '-') {
47086d7f5d3SJohn Marino if (local)
47186d7f5d3SJohn Marino for (i = LogMIN; i <= LogMAX; i++)
47286d7f5d3SJohn Marino log_DiscardLocal(i, &arg->prompt->logmask);
47386d7f5d3SJohn Marino else
47486d7f5d3SJohn Marino for (i = LogMIN; i <= LogMAX; i++)
47586d7f5d3SJohn Marino log_Discard(i);
47686d7f5d3SJohn Marino } else if (local)
47786d7f5d3SJohn Marino for (i = LogMIN; i <= LogMAX; i++)
47886d7f5d3SJohn Marino log_KeepLocal(i, &arg->prompt->logmask);
47986d7f5d3SJohn Marino else
48086d7f5d3SJohn Marino for (i = LogMIN; i <= LogMAX; i++)
48186d7f5d3SJohn Marino log_Keep(i);
48286d7f5d3SJohn Marino argv++;
48386d7f5d3SJohn Marino continue;
48486d7f5d3SJohn Marino }
48586d7f5d3SJohn Marino for (i = LogMIN; i <= LogMAX; i++)
48686d7f5d3SJohn Marino if (strcasecmp(argp, log_Name(i)) == 0) {
48786d7f5d3SJohn Marino if (**argv == '-') {
48886d7f5d3SJohn Marino if (local)
48986d7f5d3SJohn Marino log_DiscardLocal(i, &arg->prompt->logmask);
49086d7f5d3SJohn Marino else
49186d7f5d3SJohn Marino log_Discard(i);
49286d7f5d3SJohn Marino } else if (local)
49386d7f5d3SJohn Marino log_KeepLocal(i, &arg->prompt->logmask);
49486d7f5d3SJohn Marino else
49586d7f5d3SJohn Marino log_Keep(i);
49686d7f5d3SJohn Marino break;
49786d7f5d3SJohn Marino }
49886d7f5d3SJohn Marino if (i > LogMAX) {
49986d7f5d3SJohn Marino log_Printf(LogWARN, "%s: Invalid log value\n", argp);
50086d7f5d3SJohn Marino res = -1;
50186d7f5d3SJohn Marino }
50286d7f5d3SJohn Marino argv++;
50386d7f5d3SJohn Marino }
50486d7f5d3SJohn Marino return res;
50586d7f5d3SJohn Marino }
50686d7f5d3SJohn Marino
50786d7f5d3SJohn Marino int
log_ShowWho(struct cmdargs const * arg)50886d7f5d3SJohn Marino log_ShowWho(struct cmdargs const *arg)
50986d7f5d3SJohn Marino {
51086d7f5d3SJohn Marino struct prompt *p;
51186d7f5d3SJohn Marino
51286d7f5d3SJohn Marino for (p = promptlist; p; p = p->next) {
51386d7f5d3SJohn Marino prompt_Printf(arg->prompt, "%s (%s)", p->src.type, p->src.from);
51486d7f5d3SJohn Marino if (p == arg->prompt)
51586d7f5d3SJohn Marino prompt_Printf(arg->prompt, " *");
51686d7f5d3SJohn Marino if (!p->active)
51786d7f5d3SJohn Marino prompt_Printf(arg->prompt, " ^Z");
51886d7f5d3SJohn Marino prompt_Printf(arg->prompt, "\n");
51986d7f5d3SJohn Marino }
52086d7f5d3SJohn Marino
52186d7f5d3SJohn Marino return 0;
52286d7f5d3SJohn Marino }
523