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