xref: /dflybsd-src/usr.sbin/ppp/log.c (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
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