1706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh/*-
2706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org>
3706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * All rights reserved.
4706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh *
5706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * Redistribution and use in source and binary forms, with or without
6706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * modification, are permitted provided that the following conditions
7706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * are met:
8706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * 1. Redistributions of source code must retain the above copyright
9706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh *    notice, this list of conditions and the following disclaimer.
10706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * 2. Redistributions in binary form must reproduce the above copyright
11706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh *    notice, this list of conditions and the following disclaimer in the
12706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh *    documentation and/or other materials provided with the distribution.
13706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh *
14706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * SUCH DAMAGE.
25706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh *
26706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * $FreeBSD: src/usr.sbin/ppp/log.c,v 1.53.34.1 2010/12/21 17:10:29 kensmith Exp $
27706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh */
28706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
29706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <sys/types.h>
30706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
31706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <ctype.h>
32706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <stdarg.h>
33706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <stdio.h>
34706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <string.h>
35706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <syslog.h>
36706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <termios.h>
37706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
38706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "defs.h"
39706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "command.h"
40706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "mbuf.h"
41706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "log.h"
42706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "descriptor.h"
43706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "prompt.h"
44706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
45706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstatic const char *const LogNames[] = {
46706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "Async",
47706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "CBCP",
48706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "CCP",
49706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "Chat",
50706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "Command",
51706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "Connect",
52706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "Debug",
53706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "DNS",
54706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "Filter",			/* Log discarded packets */
55706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "HDLC",
56706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "ID0",
57706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "IPCP",
58706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "IPV6CP",
59706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "LCP",
60706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "LQM",
61706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "Phase",
62706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "Physical",
63706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "Radius",
64706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "Sync",
65706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "TCP/IP",
66706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "Timer",
67706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "Tun",
68706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "Warning",
69706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "Error",
70706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  "Alert"
71706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh};
72706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
73706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#define MSK(n) (1<<((n)-1))
74706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
75706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstatic u_long LogMask = MSK(LogPHASE);
76706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstatic u_long LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN);
77706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstatic int LogTunno = -1;
78706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstatic struct prompt *promptlist;	/* Where to log local stuff */
79706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstruct prompt *log_PromptContext;
80706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehint log_PromptListChanged;
81706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
82706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstruct prompt *
83706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_PromptList()
84706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
85706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  return promptlist;
86706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
87706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
88706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid
89706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_RegisterPrompt(struct prompt *prompt)
90706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
91706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  prompt->next = promptlist;
92706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  promptlist = prompt;
93706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  prompt->active = 1;
94706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  log_DiscardAllLocal(&prompt->logmask);
95706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
96706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
97706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid
98706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_ActivatePrompt(struct prompt *prompt)
99706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
100706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  prompt->active = 1;
101706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  LogMaskLocal |= prompt->logmask;
102706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
103706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
104706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstatic void
105706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi YehLogSetMaskLocal(void)
106706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
107706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  struct prompt *p;
108706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
109706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN);
110706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  for (p = promptlist; p; p = p->next)
111706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    LogMaskLocal |= p->logmask;
112706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
113706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
114706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid
115706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_DeactivatePrompt(struct prompt *prompt)
116706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
117706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  if (prompt->active) {
118706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    prompt->active = 0;
119706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    LogSetMaskLocal();
120706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  }
121706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
122706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
123706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid
124706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_UnRegisterPrompt(struct prompt *prompt)
125706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
126706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  if (prompt) {
127706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    struct prompt **p;
128706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
129706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    for (p = &promptlist; *p; p = &(*p)->next)
130706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      if (*p == prompt) {
131706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        *p = prompt->next;
132706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        prompt->next = NULL;
133706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        break;
134706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      }
135706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    LogSetMaskLocal();
136706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    log_PromptListChanged++;
137706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  }
138706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
139706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
140706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid
141706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_DestroyPrompts(struct server *s)
142706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
143706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  struct prompt *p, *pn, *pl;
144706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
145706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  p = promptlist;
146706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  pl = NULL;
147706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  while (p) {
148706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    pn = p->next;
149706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    if (s && p->owner == s) {
150706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      if (pl)
151706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        pl->next = p->next;
152706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      else
153706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        promptlist = p->next;
154706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      p->next = NULL;
155706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      prompt_Destroy(p, 1);
156706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    } else
157706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      pl = p;
158706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    p = pn;
159706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  }
160706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
161706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
162706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid
163706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_DisplayPrompts()
164706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
165706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  struct prompt *p;
166706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
167706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  for (p = promptlist; p; p = p->next)
168706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    prompt_Required(p);
169706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
170706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
171706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid
172706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_WritePrompts(struct datalink *dl, const char *fmt,...)
173706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
174706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  va_list ap;
175706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  struct prompt *p;
176706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
177706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  va_start(ap, fmt);
178706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  for (p = promptlist; p; p = p->next)
179706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    if (prompt_IsTermMode(p, dl))
180706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      prompt_vPrintf(p, fmt, ap);
181706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  va_end(ap);
182706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
183706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
184706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid
185706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_SetTtyCommandMode(struct datalink *dl)
186706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
187706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  struct prompt *p;
188706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
189706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  for (p = promptlist; p; p = p->next)
190706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    if (prompt_IsTermMode(p, dl))
191706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      prompt_TtyCommandMode(p);
192706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
193706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
194706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstatic int
195706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi YehsyslogLevel(int lev)
196706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
197706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  switch (lev) {
198706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  case LogLOG:
199706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    return LOG_INFO;
200706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  case LogDEBUG:
201706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  case LogTIMER:
202706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    return LOG_DEBUG;
203706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  case LogWARN:
204706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    return LOG_WARNING;
205706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  case LogERROR:
206706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    return LOG_ERR;
207706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  case LogALERT:
208706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    return LOG_ALERT;
209706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  }
210706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  return lev >= LogMIN && lev <= LogMAX ? LOG_INFO : 0;
211706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
212706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
213706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehconst char *
214706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_Name(int id)
215706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
216706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  if (id == LogLOG)
217706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    return "LOG";
218706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  return id < LogMIN || id > LogMAX ? "Unknown" : LogNames[id - 1];
219706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
220706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
221706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid
222706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_Keep(int id)
223706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
224706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  if (id >= LogMIN && id <= LogMAXCONF)
225706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    LogMask |= MSK(id);
226706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
227706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
228706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid
229706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_KeepLocal(int id, u_long *mask)
230706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
231706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  if (id >= LogMIN && id <= LogMAXCONF) {
232706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    LogMaskLocal |= MSK(id);
233706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    *mask |= MSK(id);
234706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  }
235706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
236706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
237706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid
238706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_Discard(int id)
239706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
240706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  if (id >= LogMIN && id <= LogMAXCONF)
241706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    LogMask &= ~MSK(id);
242706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
243706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
244706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid
245706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_DiscardLocal(int id, u_long *mask)
246706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
247706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  if (id >= LogMIN && id <= LogMAXCONF) {
248706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    *mask &= ~MSK(id);
249706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    LogSetMaskLocal();
250706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  }
251706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
252706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
253706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid
254706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_DiscardAll()
255706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
256706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  LogMask = 0;
257706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
258706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
259706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid
260706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_DiscardAllLocal(u_long *mask)
261706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
262706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  *mask = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN);
263706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  LogSetMaskLocal();
264706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
265706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
266706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehint
267706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_IsKept(int id)
268706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
269706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  if (id == LogLOG)
270706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    return LOG_KEPT_SYSLOG;
271706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  if (id < LogMIN || id > LogMAX)
272706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    return 0;
273706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  if (id > LogMAXCONF)
274706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    return LOG_KEPT_LOCAL | LOG_KEPT_SYSLOG;
275706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
276706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  return ((LogMaskLocal & MSK(id)) ? LOG_KEPT_LOCAL : 0) |
277706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    ((LogMask & MSK(id)) ? LOG_KEPT_SYSLOG : 0);
278706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
279706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
280706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehint
281706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_IsKeptLocal(int id, u_long mask)
282706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
283706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  if (id < LogMIN || id > LogMAX)
284706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    return 0;
285706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  if (id > LogMAXCONF)
286706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    return LOG_KEPT_LOCAL | LOG_KEPT_SYSLOG;
287706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
288706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  return ((mask & MSK(id)) ? LOG_KEPT_LOCAL : 0) |
289706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    ((LogMask & MSK(id)) ? LOG_KEPT_SYSLOG : 0);
290706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
291706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
292706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid
293706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_Open(const char *Name)
294706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
295706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  openlog(Name, LOG_PID, LOG_DAEMON);
296706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
297706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
298706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid
299706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_SetTun(int tunno)
300706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
301706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  LogTunno = tunno;
302706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
303706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
304706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid
305706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_Close()
306706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
307706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  closelog();
308706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  LogTunno = -1;
309706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
310706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
311706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid
312706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_Printf(int lev, const char *fmt,...)
313706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
314706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  va_list ap;
315706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  struct prompt *prompt;
316706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
317706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  if (log_IsKept(lev)) {
318706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    char nfmt[200];
319706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
320706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    va_start(ap, fmt);
321706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    if (promptlist && (log_IsKept(lev) & LOG_KEPT_LOCAL)) {
322706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      if ((log_IsKept(LogTUN) & LOG_KEPT_LOCAL) && LogTunno != -1)
323706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        snprintf(nfmt, sizeof nfmt, "%s%d: %s: %s", TUN_NAME,
324706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh	         LogTunno, log_Name(lev), fmt);
325706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      else
326706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        snprintf(nfmt, sizeof nfmt, "%s: %s", log_Name(lev), fmt);
327706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
328706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      if (log_PromptContext && lev == LogWARN)
329706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        /* Warnings just go to the current prompt */
330706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        prompt_vPrintf(log_PromptContext, nfmt, ap);
331706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      else for (prompt = promptlist; prompt; prompt = prompt->next)
332706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        if (lev > LogMAXCONF || (prompt->logmask & MSK(lev)))
333706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh          prompt_vPrintf(prompt, nfmt, ap);
334706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    }
335706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    va_end(ap);
336706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
337706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    va_start(ap, fmt);
338706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    if ((log_IsKept(lev) & LOG_KEPT_SYSLOG) &&
339706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        (lev != LogWARN || !log_PromptContext)) {
340706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      if ((log_IsKept(LogTUN) & LOG_KEPT_SYSLOG) && LogTunno != -1)
341706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        snprintf(nfmt, sizeof nfmt, "%s%d: %s: %s", TUN_NAME,
342706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh	         LogTunno, log_Name(lev), fmt);
343706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      else
344706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        snprintf(nfmt, sizeof nfmt, "%s: %s", log_Name(lev), fmt);
345706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      vsyslog(syslogLevel(lev), nfmt, ap);
346706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    }
347706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    va_end(ap);
348706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  }
349706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
350706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
351706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid
352706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_DumpBp(int lev, const char *hdr, const struct mbuf *bp)
353706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
354706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  if (log_IsKept(lev)) {
355706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    char buf[68];
356706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    char *b, *c;
357706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    const u_char *ptr;
358706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    int f;
359706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
360706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    if (hdr && *hdr)
361706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      log_Printf(lev, "%s\n", hdr);
362706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
363706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    b = buf;
364706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    c = b + 50;
365706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    do {
366706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      f = bp->m_len;
367706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      ptr = CONST_MBUF_CTOP(bp);
368706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      while (f--) {
369706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh	sprintf(b, " %02x", (int) *ptr);
370706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        *c++ = isprint(*ptr) ? *ptr : '.';
371706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        ptr++;
372706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        b += 3;
373706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        if (b == buf + 48) {
374706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh          memset(b, ' ', 2);
375706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh          *c = '\0';
376706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh          log_Printf(lev, "%s\n", buf);
377706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh          b = buf;
378706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh          c = b + 50;
379706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        }
380706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      }
381706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    } while ((bp = bp->m_next) != NULL);
382706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
383706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    if (b > buf) {
384706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      memset(b, ' ', 50 - (b - buf));
385706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      *c = '\0';
386706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      log_Printf(lev, "%s\n", buf);
387706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    }
388706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  }
389706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
390706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
391706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehvoid
392706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_DumpBuff(int lev, const char *hdr, const u_char *ptr, int n)
393706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
394706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  if (log_IsKept(lev)) {
395706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    char buf[68];
396706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    char *b, *c;
397706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
398706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    if (hdr && *hdr)
399706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      log_Printf(lev, "%s\n", hdr);
400706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    while (n > 0) {
401706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      b = buf;
402706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      c = b + 50;
403706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      for (b = buf; b != buf + 48 && n--; b += 3, ptr++) {
404706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh	sprintf(b, " %02x", (int) *ptr);
405706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        *c++ = isprint(*ptr) ? *ptr : '.';
406706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      }
407706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      memset(b, ' ', 50 - (b - buf));
408706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      *c = '\0';
409706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      log_Printf(lev, "%s\n", buf);
410706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    }
411706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  }
412706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
413706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
414706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehint
415706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_ShowLevel(struct cmdargs const *arg)
416706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
417706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  int i;
418706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
419706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  prompt_Printf(arg->prompt, "Log:  ");
420706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  for (i = LogMIN; i <= LogMAX; i++)
421706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    if (log_IsKept(i) & LOG_KEPT_SYSLOG)
422706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      prompt_Printf(arg->prompt, " %s", log_Name(i));
423706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
424706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  prompt_Printf(arg->prompt, "\nLocal:");
425706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  for (i = LogMIN; i <= LogMAX; i++)
426706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    if (log_IsKeptLocal(i, arg->prompt->logmask) & LOG_KEPT_LOCAL)
427706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      prompt_Printf(arg->prompt, " %s", log_Name(i));
428706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
429706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  prompt_Printf(arg->prompt, "\n");
430706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
431706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  return 0;
432706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
433706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
434706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehint
435706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_SetLevel(struct cmdargs const *arg)
436706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
437706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  int i, res, argc, local;
438706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  char const *const *argv, *argp;
439706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
440706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  argc = arg->argc - arg->argn;
441706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  argv = arg->argv + arg->argn;
442706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  res = 0;
443706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
444706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  if (argc == 0 || strcasecmp(argv[0], "local"))
445706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    local = 0;
446706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  else {
447706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    if (arg->prompt == NULL) {
448706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      log_Printf(LogWARN, "set log local: Only available on the"
449706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh                 " command line\n");
450706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      return 1;
451706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    }
452706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    argc--;
453706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    argv++;
454706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    local = 1;
455706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  }
456706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
457706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  if (argc == 0 || (argv[0][0] != '+' && argv[0][0] != '-')) {
458706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    if (local)
459706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      log_DiscardAllLocal(&arg->prompt->logmask);
460706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    else
461706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      log_DiscardAll();
462706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  }
463706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
464706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  while (argc--) {
465706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    argp = **argv == '+' || **argv == '-' ? *argv + 1 : *argv;
466706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    /* Special case 'all' */
467706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    if (strcasecmp(argp, "all") == 0) {
468706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        if (**argv == '-') {
469706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh          if (local)
470706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh            for (i = LogMIN; i <= LogMAX; i++)
471706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh              log_DiscardLocal(i, &arg->prompt->logmask);
472706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh          else
473706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh            for (i = LogMIN; i <= LogMAX; i++)
474706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh              log_Discard(i);
475706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        } else if (local)
476706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh          for (i = LogMIN; i <= LogMAX; i++)
477706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh            log_KeepLocal(i, &arg->prompt->logmask);
478706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        else
479706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh          for (i = LogMIN; i <= LogMAX; i++)
480706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh            log_Keep(i);
481706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        argv++;
482706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        continue;
483706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    }
484706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    for (i = LogMIN; i <= LogMAX; i++)
485706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      if (strcasecmp(argp, log_Name(i)) == 0) {
486706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh	if (**argv == '-') {
487706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh          if (local)
488706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh            log_DiscardLocal(i, &arg->prompt->logmask);
489706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh          else
490706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh	    log_Discard(i);
491706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh	} else if (local)
492706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh          log_KeepLocal(i, &arg->prompt->logmask);
493706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh        else
494706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh          log_Keep(i);
495706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh	break;
496706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      }
497706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    if (i > LogMAX) {
498706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      log_Printf(LogWARN, "%s: Invalid log value\n", argp);
499706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      res = -1;
500706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    }
501706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    argv++;
502706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  }
503706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  return res;
504706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
505706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
506706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehint
507706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehlog_ShowWho(struct cmdargs const *arg)
508706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{
509706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  struct prompt *p;
510706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
511706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  for (p = promptlist; p; p = p->next) {
512706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    prompt_Printf(arg->prompt, "%s (%s)", p->src.type, p->src.from);
513706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    if (p == arg->prompt)
514706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      prompt_Printf(arg->prompt, " *");
515706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    if (!p->active)
516706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh      prompt_Printf(arg->prompt, " ^Z");
517706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh    prompt_Printf(arg->prompt, "\n");
518706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  }
519706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh
520706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh  return 0;
521706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}
522