xref: /dragonfly/usr.sbin/ppp/log.c (revision 86d7f5d3)
1*86d7f5d3SJohn Marino /*-
2*86d7f5d3SJohn Marino  * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org>
3*86d7f5d3SJohn Marino  * All rights reserved.
4*86d7f5d3SJohn Marino  *
5*86d7f5d3SJohn Marino  * Redistribution and use in source and binary forms, with or without
6*86d7f5d3SJohn Marino  * modification, are permitted provided that the following conditions
7*86d7f5d3SJohn Marino  * are met:
8*86d7f5d3SJohn Marino  * 1. Redistributions of source code must retain the above copyright
9*86d7f5d3SJohn Marino  *    notice, this list of conditions and the following disclaimer.
10*86d7f5d3SJohn Marino  * 2. Redistributions in binary form must reproduce the above copyright
11*86d7f5d3SJohn Marino  *    notice, this list of conditions and the following disclaimer in the
12*86d7f5d3SJohn Marino  *    documentation and/or other materials provided with the distribution.
13*86d7f5d3SJohn Marino  *
14*86d7f5d3SJohn Marino  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15*86d7f5d3SJohn Marino  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*86d7f5d3SJohn Marino  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*86d7f5d3SJohn Marino  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18*86d7f5d3SJohn Marino  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*86d7f5d3SJohn Marino  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*86d7f5d3SJohn Marino  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*86d7f5d3SJohn Marino  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*86d7f5d3SJohn Marino  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*86d7f5d3SJohn Marino  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*86d7f5d3SJohn Marino  * SUCH DAMAGE.
25*86d7f5d3SJohn Marino  *
26*86d7f5d3SJohn Marino  * $FreeBSD: src/usr.sbin/ppp/log.c,v 1.44.2.5 2002/09/01 02:12:28 brian Exp $
27*86d7f5d3SJohn Marino  * $DragonFly: src/usr.sbin/ppp/log.c,v 1.4 2008/05/19 10:19:49 corecode Exp $
28*86d7f5d3SJohn Marino  */
29*86d7f5d3SJohn Marino 
30*86d7f5d3SJohn Marino #include <sys/types.h>
31*86d7f5d3SJohn Marino #include <sys/select.h>
32*86d7f5d3SJohn Marino 
33*86d7f5d3SJohn Marino #include <ctype.h>
34*86d7f5d3SJohn Marino #include <stdarg.h>
35*86d7f5d3SJohn Marino #include <stdio.h>
36*86d7f5d3SJohn Marino #include <string.h>
37*86d7f5d3SJohn Marino #include <syslog.h>
38*86d7f5d3SJohn Marino #include <termios.h>
39*86d7f5d3SJohn Marino 
40*86d7f5d3SJohn Marino #include "defs.h"
41*86d7f5d3SJohn Marino #include "command.h"
42*86d7f5d3SJohn Marino #include "mbuf.h"
43*86d7f5d3SJohn Marino #include "log.h"
44*86d7f5d3SJohn Marino #include "descriptor.h"
45*86d7f5d3SJohn Marino #include "prompt.h"
46*86d7f5d3SJohn Marino 
47*86d7f5d3SJohn Marino static const char *const LogNames[] = {
48*86d7f5d3SJohn Marino   "Async",
49*86d7f5d3SJohn Marino   "CBCP",
50*86d7f5d3SJohn Marino   "CCP",
51*86d7f5d3SJohn Marino   "Chat",
52*86d7f5d3SJohn Marino   "Command",
53*86d7f5d3SJohn Marino   "Connect",
54*86d7f5d3SJohn Marino   "Debug",
55*86d7f5d3SJohn Marino   "DNS",
56*86d7f5d3SJohn Marino   "Filter",			/* Log discarded packets */
57*86d7f5d3SJohn Marino   "HDLC",
58*86d7f5d3SJohn Marino   "ID0",
59*86d7f5d3SJohn Marino   "IPCP",
60*86d7f5d3SJohn Marino   "IPV6CP",
61*86d7f5d3SJohn Marino   "LCP",
62*86d7f5d3SJohn Marino   "LQM",
63*86d7f5d3SJohn Marino   "Phase",
64*86d7f5d3SJohn Marino   "Physical",
65*86d7f5d3SJohn Marino   "Sync",
66*86d7f5d3SJohn Marino   "TCP/IP",
67*86d7f5d3SJohn Marino   "Timer",
68*86d7f5d3SJohn Marino   "Tun",
69*86d7f5d3SJohn Marino   "Warning",
70*86d7f5d3SJohn Marino   "Error",
71*86d7f5d3SJohn Marino   "Alert"
72*86d7f5d3SJohn Marino };
73*86d7f5d3SJohn Marino 
74*86d7f5d3SJohn Marino #define MSK(n) (1<<((n)-1))
75*86d7f5d3SJohn Marino 
76*86d7f5d3SJohn Marino static u_long LogMask = MSK(LogPHASE);
77*86d7f5d3SJohn Marino static u_long LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN);
78*86d7f5d3SJohn Marino static int LogTunno = -1;
79*86d7f5d3SJohn Marino static struct prompt *promptlist;	/* Where to log local stuff */
80*86d7f5d3SJohn Marino struct prompt *log_PromptContext;
81*86d7f5d3SJohn Marino int log_PromptListChanged;
82*86d7f5d3SJohn Marino 
83*86d7f5d3SJohn Marino struct prompt *
log_PromptList(void)84*86d7f5d3SJohn Marino log_PromptList(void)
85*86d7f5d3SJohn Marino {
86*86d7f5d3SJohn Marino   return promptlist;
87*86d7f5d3SJohn Marino }
88*86d7f5d3SJohn Marino 
89*86d7f5d3SJohn Marino void
log_RegisterPrompt(struct prompt * prompt)90*86d7f5d3SJohn Marino log_RegisterPrompt(struct prompt *prompt)
91*86d7f5d3SJohn Marino {
92*86d7f5d3SJohn Marino   prompt->next = promptlist;
93*86d7f5d3SJohn Marino   promptlist = prompt;
94*86d7f5d3SJohn Marino   prompt->active = 1;
95*86d7f5d3SJohn Marino   log_DiscardAllLocal(&prompt->logmask);
96*86d7f5d3SJohn Marino }
97*86d7f5d3SJohn Marino 
98*86d7f5d3SJohn Marino void
log_ActivatePrompt(struct prompt * prompt)99*86d7f5d3SJohn Marino log_ActivatePrompt(struct prompt *prompt)
100*86d7f5d3SJohn Marino {
101*86d7f5d3SJohn Marino   prompt->active = 1;
102*86d7f5d3SJohn Marino   LogMaskLocal |= prompt->logmask;
103*86d7f5d3SJohn Marino }
104*86d7f5d3SJohn Marino 
105*86d7f5d3SJohn Marino static void
LogSetMaskLocal(void)106*86d7f5d3SJohn Marino LogSetMaskLocal(void)
107*86d7f5d3SJohn Marino {
108*86d7f5d3SJohn Marino   struct prompt *p;
109*86d7f5d3SJohn Marino 
110*86d7f5d3SJohn Marino   LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN);
111*86d7f5d3SJohn Marino   for (p = promptlist; p; p = p->next)
112*86d7f5d3SJohn Marino     LogMaskLocal |= p->logmask;
113*86d7f5d3SJohn Marino }
114*86d7f5d3SJohn Marino 
115*86d7f5d3SJohn Marino void
log_DeactivatePrompt(struct prompt * prompt)116*86d7f5d3SJohn Marino log_DeactivatePrompt(struct prompt *prompt)
117*86d7f5d3SJohn Marino {
118*86d7f5d3SJohn Marino   if (prompt->active) {
119*86d7f5d3SJohn Marino     prompt->active = 0;
120*86d7f5d3SJohn Marino     LogSetMaskLocal();
121*86d7f5d3SJohn Marino   }
122*86d7f5d3SJohn Marino }
123*86d7f5d3SJohn Marino 
124*86d7f5d3SJohn Marino void
log_UnRegisterPrompt(struct prompt * prompt)125*86d7f5d3SJohn Marino log_UnRegisterPrompt(struct prompt *prompt)
126*86d7f5d3SJohn Marino {
127*86d7f5d3SJohn Marino   if (prompt) {
128*86d7f5d3SJohn Marino     struct prompt **p;
129*86d7f5d3SJohn Marino 
130*86d7f5d3SJohn Marino     for (p = &promptlist; *p; p = &(*p)->next)
131*86d7f5d3SJohn Marino       if (*p == prompt) {
132*86d7f5d3SJohn Marino         *p = prompt->next;
133*86d7f5d3SJohn Marino         prompt->next = NULL;
134*86d7f5d3SJohn Marino         break;
135*86d7f5d3SJohn Marino       }
136*86d7f5d3SJohn Marino     LogSetMaskLocal();
137*86d7f5d3SJohn Marino     log_PromptListChanged++;
138*86d7f5d3SJohn Marino   }
139*86d7f5d3SJohn Marino }
140*86d7f5d3SJohn Marino 
141*86d7f5d3SJohn Marino void
log_DestroyPrompts(struct server * s)142*86d7f5d3SJohn Marino log_DestroyPrompts(struct server *s)
143*86d7f5d3SJohn Marino {
144*86d7f5d3SJohn Marino   struct prompt *p, *pn, *pl;
145*86d7f5d3SJohn Marino 
146*86d7f5d3SJohn Marino   p = promptlist;
147*86d7f5d3SJohn Marino   pl = NULL;
148*86d7f5d3SJohn Marino   while (p) {
149*86d7f5d3SJohn Marino     pn = p->next;
150*86d7f5d3SJohn Marino     if (s && p->owner == s) {
151*86d7f5d3SJohn Marino       if (pl)
152*86d7f5d3SJohn Marino         pl->next = p->next;
153*86d7f5d3SJohn Marino       else
154*86d7f5d3SJohn Marino         promptlist = p->next;
155*86d7f5d3SJohn Marino       p->next = NULL;
156*86d7f5d3SJohn Marino       prompt_Destroy(p, 1);
157*86d7f5d3SJohn Marino     } else
158*86d7f5d3SJohn Marino       pl = p;
159*86d7f5d3SJohn Marino     p = pn;
160*86d7f5d3SJohn Marino   }
161*86d7f5d3SJohn Marino }
162*86d7f5d3SJohn Marino 
163*86d7f5d3SJohn Marino void
log_DisplayPrompts(void)164*86d7f5d3SJohn Marino log_DisplayPrompts(void)
165*86d7f5d3SJohn Marino {
166*86d7f5d3SJohn Marino   struct prompt *p;
167*86d7f5d3SJohn Marino 
168*86d7f5d3SJohn Marino   for (p = promptlist; p; p = p->next)
169*86d7f5d3SJohn Marino     prompt_Required(p);
170*86d7f5d3SJohn Marino }
171*86d7f5d3SJohn Marino 
172*86d7f5d3SJohn Marino void
log_WritePrompts(struct datalink * dl,const char * fmt,...)173*86d7f5d3SJohn Marino log_WritePrompts(struct datalink *dl, const char *fmt,...)
174*86d7f5d3SJohn Marino {
175*86d7f5d3SJohn Marino   va_list ap;
176*86d7f5d3SJohn Marino   struct prompt *p;
177*86d7f5d3SJohn Marino 
178*86d7f5d3SJohn Marino   va_start(ap, fmt);
179*86d7f5d3SJohn Marino   for (p = promptlist; p; p = p->next)
180*86d7f5d3SJohn Marino     if (prompt_IsTermMode(p, dl))
181*86d7f5d3SJohn Marino       prompt_vPrintf(p, fmt, ap);
182*86d7f5d3SJohn Marino   va_end(ap);
183*86d7f5d3SJohn Marino }
184*86d7f5d3SJohn Marino 
185*86d7f5d3SJohn Marino void
log_SetTtyCommandMode(struct datalink * dl)186*86d7f5d3SJohn Marino log_SetTtyCommandMode(struct datalink *dl)
187*86d7f5d3SJohn Marino {
188*86d7f5d3SJohn Marino   struct prompt *p;
189*86d7f5d3SJohn Marino 
190*86d7f5d3SJohn Marino   for (p = promptlist; p; p = p->next)
191*86d7f5d3SJohn Marino     if (prompt_IsTermMode(p, dl))
192*86d7f5d3SJohn Marino       prompt_TtyCommandMode(p);
193*86d7f5d3SJohn Marino }
194*86d7f5d3SJohn Marino 
195*86d7f5d3SJohn Marino static int
syslogLevel(int lev)196*86d7f5d3SJohn Marino syslogLevel(int lev)
197*86d7f5d3SJohn Marino {
198*86d7f5d3SJohn Marino   switch (lev) {
199*86d7f5d3SJohn Marino   case LogLOG:
200*86d7f5d3SJohn Marino     return LOG_INFO;
201*86d7f5d3SJohn Marino   case LogDEBUG:
202*86d7f5d3SJohn Marino   case LogTIMER:
203*86d7f5d3SJohn Marino     return LOG_DEBUG;
204*86d7f5d3SJohn Marino   case LogWARN:
205*86d7f5d3SJohn Marino     return LOG_WARNING;
206*86d7f5d3SJohn Marino   case LogERROR:
207*86d7f5d3SJohn Marino     return LOG_ERR;
208*86d7f5d3SJohn Marino   case LogALERT:
209*86d7f5d3SJohn Marino     return LOG_ALERT;
210*86d7f5d3SJohn Marino   }
211*86d7f5d3SJohn Marino   return lev >= LogMIN && lev <= LogMAX ? LOG_INFO : 0;
212*86d7f5d3SJohn Marino }
213*86d7f5d3SJohn Marino 
214*86d7f5d3SJohn Marino const char *
log_Name(int id)215*86d7f5d3SJohn Marino log_Name(int id)
216*86d7f5d3SJohn Marino {
217*86d7f5d3SJohn Marino   if (id == LogLOG)
218*86d7f5d3SJohn Marino     return "LOG";
219*86d7f5d3SJohn Marino   return id < LogMIN || id > LogMAX ? "Unknown" : LogNames[id - 1];
220*86d7f5d3SJohn Marino }
221*86d7f5d3SJohn Marino 
222*86d7f5d3SJohn Marino void
log_Keep(int id)223*86d7f5d3SJohn Marino log_Keep(int id)
224*86d7f5d3SJohn Marino {
225*86d7f5d3SJohn Marino   if (id >= LogMIN && id <= LogMAXCONF)
226*86d7f5d3SJohn Marino     LogMask |= MSK(id);
227*86d7f5d3SJohn Marino }
228*86d7f5d3SJohn Marino 
229*86d7f5d3SJohn Marino void
log_KeepLocal(int id,u_long * mask)230*86d7f5d3SJohn Marino log_KeepLocal(int id, u_long *mask)
231*86d7f5d3SJohn Marino {
232*86d7f5d3SJohn Marino   if (id >= LogMIN && id <= LogMAXCONF) {
233*86d7f5d3SJohn Marino     LogMaskLocal |= MSK(id);
234*86d7f5d3SJohn Marino     *mask |= MSK(id);
235*86d7f5d3SJohn Marino   }
236*86d7f5d3SJohn Marino }
237*86d7f5d3SJohn Marino 
238*86d7f5d3SJohn Marino void
log_Discard(int id)239*86d7f5d3SJohn Marino log_Discard(int id)
240*86d7f5d3SJohn Marino {
241*86d7f5d3SJohn Marino   if (id >= LogMIN && id <= LogMAXCONF)
242*86d7f5d3SJohn Marino     LogMask &= ~MSK(id);
243*86d7f5d3SJohn Marino }
244*86d7f5d3SJohn Marino 
245*86d7f5d3SJohn Marino void
log_DiscardLocal(int id,u_long * mask)246*86d7f5d3SJohn Marino log_DiscardLocal(int id, u_long *mask)
247*86d7f5d3SJohn Marino {
248*86d7f5d3SJohn Marino   if (id >= LogMIN && id <= LogMAXCONF) {
249*86d7f5d3SJohn Marino     *mask &= ~MSK(id);
250*86d7f5d3SJohn Marino     LogSetMaskLocal();
251*86d7f5d3SJohn Marino   }
252*86d7f5d3SJohn Marino }
253*86d7f5d3SJohn Marino 
254*86d7f5d3SJohn Marino void
log_DiscardAll(void)255*86d7f5d3SJohn Marino log_DiscardAll(void)
256*86d7f5d3SJohn Marino {
257*86d7f5d3SJohn Marino   LogMask = 0;
258*86d7f5d3SJohn Marino }
259*86d7f5d3SJohn Marino 
260*86d7f5d3SJohn Marino void
log_DiscardAllLocal(u_long * mask)261*86d7f5d3SJohn Marino log_DiscardAllLocal(u_long *mask)
262*86d7f5d3SJohn Marino {
263*86d7f5d3SJohn Marino   *mask = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN);
264*86d7f5d3SJohn Marino   LogSetMaskLocal();
265*86d7f5d3SJohn Marino }
266*86d7f5d3SJohn Marino 
267*86d7f5d3SJohn Marino int
log_IsKept(int id)268*86d7f5d3SJohn Marino log_IsKept(int id)
269*86d7f5d3SJohn Marino {
270*86d7f5d3SJohn Marino   if (id == LogLOG)
271*86d7f5d3SJohn Marino     return LOG_KEPT_SYSLOG;
272*86d7f5d3SJohn Marino   if (id < LogMIN || id > LogMAX)
273*86d7f5d3SJohn Marino     return 0;
274*86d7f5d3SJohn Marino   if (id > LogMAXCONF)
275*86d7f5d3SJohn Marino     return LOG_KEPT_LOCAL | LOG_KEPT_SYSLOG;
276*86d7f5d3SJohn Marino 
277*86d7f5d3SJohn Marino   return ((LogMaskLocal & MSK(id)) ? LOG_KEPT_LOCAL : 0) |
278*86d7f5d3SJohn Marino     ((LogMask & MSK(id)) ? LOG_KEPT_SYSLOG : 0);
279*86d7f5d3SJohn Marino }
280*86d7f5d3SJohn Marino 
281*86d7f5d3SJohn Marino int
log_IsKeptLocal(int id,u_long mask)282*86d7f5d3SJohn Marino log_IsKeptLocal(int id, u_long mask)
283*86d7f5d3SJohn Marino {
284*86d7f5d3SJohn Marino   if (id < LogMIN || id > LogMAX)
285*86d7f5d3SJohn Marino     return 0;
286*86d7f5d3SJohn Marino   if (id > LogMAXCONF)
287*86d7f5d3SJohn Marino     return LOG_KEPT_LOCAL | LOG_KEPT_SYSLOG;
288*86d7f5d3SJohn Marino 
289*86d7f5d3SJohn Marino   return ((mask & MSK(id)) ? LOG_KEPT_LOCAL : 0) |
290*86d7f5d3SJohn Marino     ((LogMask & MSK(id)) ? LOG_KEPT_SYSLOG : 0);
291*86d7f5d3SJohn Marino }
292*86d7f5d3SJohn Marino 
293*86d7f5d3SJohn Marino void
log_Open(const char * Name)294*86d7f5d3SJohn Marino log_Open(const char *Name)
295*86d7f5d3SJohn Marino {
296*86d7f5d3SJohn Marino   openlog(Name, LOG_PID, LOG_DAEMON);
297*86d7f5d3SJohn Marino }
298*86d7f5d3SJohn Marino 
299*86d7f5d3SJohn Marino void
log_SetTun(int tunno)300*86d7f5d3SJohn Marino log_SetTun(int tunno)
301*86d7f5d3SJohn Marino {
302*86d7f5d3SJohn Marino   LogTunno = tunno;
303*86d7f5d3SJohn Marino }
304*86d7f5d3SJohn Marino 
305*86d7f5d3SJohn Marino void
log_Close(void)306*86d7f5d3SJohn Marino log_Close(void)
307*86d7f5d3SJohn Marino {
308*86d7f5d3SJohn Marino   closelog();
309*86d7f5d3SJohn Marino   LogTunno = -1;
310*86d7f5d3SJohn Marino }
311*86d7f5d3SJohn Marino 
312*86d7f5d3SJohn Marino void
log_Printf(int lev,const char * fmt,...)313*86d7f5d3SJohn Marino log_Printf(int lev, const char *fmt,...)
314*86d7f5d3SJohn Marino {
315*86d7f5d3SJohn Marino   va_list ap;
316*86d7f5d3SJohn Marino   struct prompt *prompt;
317*86d7f5d3SJohn Marino 
318*86d7f5d3SJohn Marino   if (log_IsKept(lev)) {
319*86d7f5d3SJohn Marino     char nfmt[200];
320*86d7f5d3SJohn Marino 
321*86d7f5d3SJohn Marino     va_start(ap, fmt);
322*86d7f5d3SJohn Marino     if (promptlist && (log_IsKept(lev) & LOG_KEPT_LOCAL)) {
323*86d7f5d3SJohn Marino       if ((log_IsKept(LogTUN) & LOG_KEPT_LOCAL) && LogTunno != -1)
324*86d7f5d3SJohn Marino         snprintf(nfmt, sizeof nfmt, "%s%d: %s: %s", TUN_NAME,
325*86d7f5d3SJohn Marino 	         LogTunno, log_Name(lev), fmt);
326*86d7f5d3SJohn Marino       else
327*86d7f5d3SJohn Marino         snprintf(nfmt, sizeof nfmt, "%s: %s", log_Name(lev), fmt);
328*86d7f5d3SJohn Marino 
329*86d7f5d3SJohn Marino       if (log_PromptContext && lev == LogWARN)
330*86d7f5d3SJohn Marino         /* Warnings just go to the current prompt */
331*86d7f5d3SJohn Marino         prompt_vPrintf(log_PromptContext, nfmt, ap);
332*86d7f5d3SJohn Marino       else for (prompt = promptlist; prompt; prompt = prompt->next)
333*86d7f5d3SJohn Marino         if (lev > LogMAXCONF || (prompt->logmask & MSK(lev)))
334*86d7f5d3SJohn Marino           prompt_vPrintf(prompt, nfmt, ap);
335*86d7f5d3SJohn Marino     }
336*86d7f5d3SJohn Marino     va_end(ap);
337*86d7f5d3SJohn Marino 
338*86d7f5d3SJohn Marino     va_start(ap, fmt);
339*86d7f5d3SJohn Marino     if ((log_IsKept(lev) & LOG_KEPT_SYSLOG) &&
340*86d7f5d3SJohn Marino         (lev != LogWARN || !log_PromptContext)) {
341*86d7f5d3SJohn Marino       if ((log_IsKept(LogTUN) & LOG_KEPT_SYSLOG) && LogTunno != -1)
342*86d7f5d3SJohn Marino         snprintf(nfmt, sizeof nfmt, "%s%d: %s: %s", TUN_NAME,
343*86d7f5d3SJohn Marino 	         LogTunno, log_Name(lev), fmt);
344*86d7f5d3SJohn Marino       else
345*86d7f5d3SJohn Marino         snprintf(nfmt, sizeof nfmt, "%s: %s", log_Name(lev), fmt);
346*86d7f5d3SJohn Marino       vsyslog(syslogLevel(lev), nfmt, ap);
347*86d7f5d3SJohn Marino     }
348*86d7f5d3SJohn Marino     va_end(ap);
349*86d7f5d3SJohn Marino   }
350*86d7f5d3SJohn Marino }
351*86d7f5d3SJohn Marino 
352*86d7f5d3SJohn Marino void
log_DumpBp(int lev,const char * hdr,const struct mbuf * bp)353*86d7f5d3SJohn Marino log_DumpBp(int lev, const char *hdr, const struct mbuf *bp)
354*86d7f5d3SJohn Marino {
355*86d7f5d3SJohn Marino   if (log_IsKept(lev)) {
356*86d7f5d3SJohn Marino     char buf[68];
357*86d7f5d3SJohn Marino     char *b, *c;
358*86d7f5d3SJohn Marino     const u_char *ptr;
359*86d7f5d3SJohn Marino     int f;
360*86d7f5d3SJohn Marino 
361*86d7f5d3SJohn Marino     if (hdr && *hdr)
362*86d7f5d3SJohn Marino       log_Printf(lev, "%s\n", hdr);
363*86d7f5d3SJohn Marino 
364*86d7f5d3SJohn Marino     b = buf;
365*86d7f5d3SJohn Marino     c = b + 50;
366*86d7f5d3SJohn Marino     do {
367*86d7f5d3SJohn Marino       f = bp->m_len;
368*86d7f5d3SJohn Marino       ptr = CONST_MBUF_CTOP(bp);
369*86d7f5d3SJohn Marino       while (f--) {
370*86d7f5d3SJohn Marino 	sprintf(b, " %02x", (int) *ptr);
371*86d7f5d3SJohn Marino         *c++ = isprint(*ptr) ? *ptr : '.';
372*86d7f5d3SJohn Marino         ptr++;
373*86d7f5d3SJohn Marino         b += 3;
374*86d7f5d3SJohn Marino         if (b == buf + 48) {
375*86d7f5d3SJohn Marino           memset(b, ' ', 2);
376*86d7f5d3SJohn Marino           *c = '\0';
377*86d7f5d3SJohn Marino           log_Printf(lev, "%s\n", buf);
378*86d7f5d3SJohn Marino           b = buf;
379*86d7f5d3SJohn Marino           c = b + 50;
380*86d7f5d3SJohn Marino         }
381*86d7f5d3SJohn Marino       }
382*86d7f5d3SJohn Marino     } while ((bp = bp->m_next) != NULL);
383*86d7f5d3SJohn Marino 
384*86d7f5d3SJohn Marino     if (b > buf) {
385*86d7f5d3SJohn Marino       memset(b, ' ', 50 - (b - buf));
386*86d7f5d3SJohn Marino       *c = '\0';
387*86d7f5d3SJohn Marino       log_Printf(lev, "%s\n", buf);
388*86d7f5d3SJohn Marino     }
389*86d7f5d3SJohn Marino   }
390*86d7f5d3SJohn Marino }
391*86d7f5d3SJohn Marino 
392*86d7f5d3SJohn Marino void
log_DumpBuff(int lev,const char * hdr,const u_char * ptr,int n)393*86d7f5d3SJohn Marino log_DumpBuff(int lev, const char *hdr, const u_char *ptr, int n)
394*86d7f5d3SJohn Marino {
395*86d7f5d3SJohn Marino   if (log_IsKept(lev)) {
396*86d7f5d3SJohn Marino     char buf[68];
397*86d7f5d3SJohn Marino     char *b, *c;
398*86d7f5d3SJohn Marino 
399*86d7f5d3SJohn Marino     if (hdr && *hdr)
400*86d7f5d3SJohn Marino       log_Printf(lev, "%s\n", hdr);
401*86d7f5d3SJohn Marino     while (n > 0) {
402*86d7f5d3SJohn Marino       b = buf;
403*86d7f5d3SJohn Marino       c = b + 50;
404*86d7f5d3SJohn Marino       for (b = buf; b != buf + 48 && n--; b += 3, ptr++) {
405*86d7f5d3SJohn Marino 	sprintf(b, " %02x", (int) *ptr);
406*86d7f5d3SJohn Marino         *c++ = isprint(*ptr) ? *ptr : '.';
407*86d7f5d3SJohn Marino       }
408*86d7f5d3SJohn Marino       memset(b, ' ', 50 - (b - buf));
409*86d7f5d3SJohn Marino       *c = '\0';
410*86d7f5d3SJohn Marino       log_Printf(lev, "%s\n", buf);
411*86d7f5d3SJohn Marino     }
412*86d7f5d3SJohn Marino   }
413*86d7f5d3SJohn Marino }
414*86d7f5d3SJohn Marino 
415*86d7f5d3SJohn Marino int
log_ShowLevel(struct cmdargs const * arg)416*86d7f5d3SJohn Marino log_ShowLevel(struct cmdargs const *arg)
417*86d7f5d3SJohn Marino {
418*86d7f5d3SJohn Marino   int i;
419*86d7f5d3SJohn Marino 
420*86d7f5d3SJohn Marino   prompt_Printf(arg->prompt, "Log:  ");
421*86d7f5d3SJohn Marino   for (i = LogMIN; i <= LogMAX; i++)
422*86d7f5d3SJohn Marino     if (log_IsKept(i) & LOG_KEPT_SYSLOG)
423*86d7f5d3SJohn Marino       prompt_Printf(arg->prompt, " %s", log_Name(i));
424*86d7f5d3SJohn Marino 
425*86d7f5d3SJohn Marino   prompt_Printf(arg->prompt, "\nLocal:");
426*86d7f5d3SJohn Marino   for (i = LogMIN; i <= LogMAX; i++)
427*86d7f5d3SJohn Marino     if (log_IsKeptLocal(i, arg->prompt->logmask) & LOG_KEPT_LOCAL)
428*86d7f5d3SJohn Marino       prompt_Printf(arg->prompt, " %s", log_Name(i));
429*86d7f5d3SJohn Marino 
430*86d7f5d3SJohn Marino   prompt_Printf(arg->prompt, "\n");
431*86d7f5d3SJohn Marino 
432*86d7f5d3SJohn Marino   return 0;
433*86d7f5d3SJohn Marino }
434*86d7f5d3SJohn Marino 
435*86d7f5d3SJohn Marino int
log_SetLevel(struct cmdargs const * arg)436*86d7f5d3SJohn Marino log_SetLevel(struct cmdargs const *arg)
437*86d7f5d3SJohn Marino {
438*86d7f5d3SJohn Marino   int i, res, argc, local;
439*86d7f5d3SJohn Marino   char const *const *argv, *argp;
440*86d7f5d3SJohn Marino 
441*86d7f5d3SJohn Marino   argc = arg->argc - arg->argn;
442*86d7f5d3SJohn Marino   argv = arg->argv + arg->argn;
443*86d7f5d3SJohn Marino   res = 0;
444*86d7f5d3SJohn Marino 
445*86d7f5d3SJohn Marino   if (argc == 0 || strcasecmp(argv[0], "local"))
446*86d7f5d3SJohn Marino     local = 0;
447*86d7f5d3SJohn Marino   else {
448*86d7f5d3SJohn Marino     if (arg->prompt == NULL) {
449*86d7f5d3SJohn Marino       log_Printf(LogWARN, "set log local: Only available on the"
450*86d7f5d3SJohn Marino                  " command line\n");
451*86d7f5d3SJohn Marino       return 1;
452*86d7f5d3SJohn Marino     }
453*86d7f5d3SJohn Marino     argc--;
454*86d7f5d3SJohn Marino     argv++;
455*86d7f5d3SJohn Marino     local = 1;
456*86d7f5d3SJohn Marino   }
457*86d7f5d3SJohn Marino 
458*86d7f5d3SJohn Marino   if (argc == 0 || (argv[0][0] != '+' && argv[0][0] != '-')) {
459*86d7f5d3SJohn Marino     if (local)
460*86d7f5d3SJohn Marino       log_DiscardAllLocal(&arg->prompt->logmask);
461*86d7f5d3SJohn Marino     else
462*86d7f5d3SJohn Marino       log_DiscardAll();
463*86d7f5d3SJohn Marino   }
464*86d7f5d3SJohn Marino 
465*86d7f5d3SJohn Marino   while (argc--) {
466*86d7f5d3SJohn Marino     argp = **argv == '+' || **argv == '-' ? *argv + 1 : *argv;
467*86d7f5d3SJohn Marino     /* Special case 'all' */
468*86d7f5d3SJohn Marino     if (strcasecmp(argp, "all") == 0) {
469*86d7f5d3SJohn Marino         if (**argv == '-') {
470*86d7f5d3SJohn Marino           if (local)
471*86d7f5d3SJohn Marino             for (i = LogMIN; i <= LogMAX; i++)
472*86d7f5d3SJohn Marino               log_DiscardLocal(i, &arg->prompt->logmask);
473*86d7f5d3SJohn Marino           else
474*86d7f5d3SJohn Marino             for (i = LogMIN; i <= LogMAX; i++)
475*86d7f5d3SJohn Marino               log_Discard(i);
476*86d7f5d3SJohn Marino         } else if (local)
477*86d7f5d3SJohn Marino           for (i = LogMIN; i <= LogMAX; i++)
478*86d7f5d3SJohn Marino             log_KeepLocal(i, &arg->prompt->logmask);
479*86d7f5d3SJohn Marino         else
480*86d7f5d3SJohn Marino           for (i = LogMIN; i <= LogMAX; i++)
481*86d7f5d3SJohn Marino             log_Keep(i);
482*86d7f5d3SJohn Marino         argv++;
483*86d7f5d3SJohn Marino         continue;
484*86d7f5d3SJohn Marino     }
485*86d7f5d3SJohn Marino     for (i = LogMIN; i <= LogMAX; i++)
486*86d7f5d3SJohn Marino       if (strcasecmp(argp, log_Name(i)) == 0) {
487*86d7f5d3SJohn Marino 	if (**argv == '-') {
488*86d7f5d3SJohn Marino           if (local)
489*86d7f5d3SJohn Marino             log_DiscardLocal(i, &arg->prompt->logmask);
490*86d7f5d3SJohn Marino           else
491*86d7f5d3SJohn Marino 	    log_Discard(i);
492*86d7f5d3SJohn Marino 	} else if (local)
493*86d7f5d3SJohn Marino           log_KeepLocal(i, &arg->prompt->logmask);
494*86d7f5d3SJohn Marino         else
495*86d7f5d3SJohn Marino           log_Keep(i);
496*86d7f5d3SJohn Marino 	break;
497*86d7f5d3SJohn Marino       }
498*86d7f5d3SJohn Marino     if (i > LogMAX) {
499*86d7f5d3SJohn Marino       log_Printf(LogWARN, "%s: Invalid log value\n", argp);
500*86d7f5d3SJohn Marino       res = -1;
501*86d7f5d3SJohn Marino     }
502*86d7f5d3SJohn Marino     argv++;
503*86d7f5d3SJohn Marino   }
504*86d7f5d3SJohn Marino   return res;
505*86d7f5d3SJohn Marino }
506*86d7f5d3SJohn Marino 
507*86d7f5d3SJohn Marino int
log_ShowWho(struct cmdargs const * arg)508*86d7f5d3SJohn Marino log_ShowWho(struct cmdargs const *arg)
509*86d7f5d3SJohn Marino {
510*86d7f5d3SJohn Marino   struct prompt *p;
511*86d7f5d3SJohn Marino 
512*86d7f5d3SJohn Marino   for (p = promptlist; p; p = p->next) {
513*86d7f5d3SJohn Marino     prompt_Printf(arg->prompt, "%s (%s)", p->src.type, p->src.from);
514*86d7f5d3SJohn Marino     if (p == arg->prompt)
515*86d7f5d3SJohn Marino       prompt_Printf(arg->prompt, " *");
516*86d7f5d3SJohn Marino     if (!p->active)
517*86d7f5d3SJohn Marino       prompt_Printf(arg->prompt, " ^Z");
518*86d7f5d3SJohn Marino     prompt_Printf(arg->prompt, "\n");
519*86d7f5d3SJohn Marino   }
520*86d7f5d3SJohn Marino 
521*86d7f5d3SJohn Marino   return 0;
522*86d7f5d3SJohn Marino }
523