log.c revision 34537
1/*-
2 * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org>
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 *
26 *	$Id: log.c,v 1.25 1998/01/21 02:15:18 brian Exp $
27 */
28
29#include <sys/param.h>
30#include <netinet/in.h>
31
32#include <stdarg.h>
33#include <stdio.h>
34#include <string.h>
35#include <syslog.h>
36
37#include "command.h"
38#include "mbuf.h"
39#include "log.h"
40#include "loadalias.h"
41#include "defs.h"
42#include "vars.h"
43
44static const char *LogNames[] = {
45  "Async",
46  "Carrier",
47  "CCP",
48  "Chat",
49  "Command",
50  "Connect",
51  "Debug",
52  "HDLC",
53  "ID0",
54  "IPCP",
55  "LCP",
56  "Link",
57  "LQM",
58  "Phase",
59  "TCP/IP",
60  "Tun",
61  "Warning",
62  "Error",
63  "Alert"
64};
65
66#define MSK(n) (1<<((n)-1))
67
68static u_long LogMask = MSK(LogLINK) | MSK(LogCARRIER) | MSK(LogPHASE);
69static u_long LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN);
70static int LogTunno = -1;
71
72static int
73syslogLevel(int lev)
74{
75  switch (lev) {
76    case LogDEBUG:return LOG_DEBUG;
77  case LogWARN:
78    return LOG_WARNING;
79  case LogERROR:
80    return LOG_ERR;
81  case LogALERT:
82    return LOG_ALERT;
83  }
84  return lev >= LogMIN && lev <= LogMAX ? LOG_INFO : 0;
85}
86
87const char *
88LogName(int id)
89{
90  return id < LogMIN || id > LogMAX ? "Unknown" : LogNames[id - 1];
91}
92
93void
94LogKeep(int id)
95{
96  if (id >= LogMIN && id <= LogMAXCONF)
97    LogMask |= MSK(id);
98}
99
100void
101LogKeepLocal(int id)
102{
103  if (id >= LogMIN && id <= LogMAXCONF)
104    LogMaskLocal |= MSK(id);
105}
106
107void
108LogDiscard(int id)
109{
110  if (id >= LogMIN && id <= LogMAXCONF)
111    LogMask &= ~MSK(id);
112}
113
114void
115LogDiscardLocal(int id)
116{
117  if (id >= LogMIN && id <= LogMAXCONF)
118    LogMaskLocal &= ~MSK(id);
119}
120
121void
122LogDiscardAll()
123{
124  LogMask = 0;
125}
126
127void
128LogDiscardAllLocal()
129{
130  LogMaskLocal = 0;
131}
132
133int
134LogIsKept(int id)
135{
136  if (id < LogMIN || id > LogMAX)
137    return 0;
138  if (id > LogMAXCONF)
139    return LOG_KEPT_LOCAL | LOG_KEPT_SYSLOG;
140
141  return ((LogMaskLocal & MSK(id)) ? LOG_KEPT_LOCAL : 0) |
142    ((LogMask & MSK(id)) ? LOG_KEPT_SYSLOG : 0);
143}
144
145void
146LogOpen(const char *Name)
147{
148  openlog(Name, LOG_PID, LOG_DAEMON);
149}
150
151void
152LogSetTun(int tunno)
153{
154  LogTunno = tunno;
155}
156
157void
158LogClose()
159{
160  closelog();
161  LogTunno = -1;
162}
163
164void
165LogPrintf(int lev, const char *fmt,...)
166{
167  va_list ap;
168
169  va_start(ap, fmt);
170  if (LogIsKept(lev)) {
171    static char nfmt[200];
172
173    if ((LogIsKept(lev) & LOG_KEPT_LOCAL) && VarTerm) {
174      if ((LogIsKept(LogTUN) & LOG_KEPT_LOCAL) && LogTunno != -1)
175        snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s",
176	         LogTunno, LogName(lev), fmt);
177      else
178        snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt);
179      vfprintf(VarTerm, nfmt, ap);
180      fflush(VarTerm);
181    }
182
183    if ((LogIsKept(lev) & LOG_KEPT_SYSLOG) && (lev != LogWARN || !VarTerm)) {
184      if ((LogIsKept(LogTUN) & LOG_KEPT_SYSLOG) && LogTunno != -1)
185        snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s",
186	         LogTunno, LogName(lev), fmt);
187      else
188        snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt);
189      vsyslog(syslogLevel(lev), nfmt, ap);
190    }
191  }
192  va_end(ap);
193}
194
195void
196LogDumpBp(int lev, const char *hdr, const struct mbuf * bp)
197{
198  if (LogIsKept(lev)) {
199    char buf[50];
200    char *b;
201    u_char *ptr;
202    int f;
203
204    if (hdr && *hdr)
205      LogPrintf(lev, "%s\n", hdr);
206
207    b = buf;
208    do {
209      f = bp->cnt;
210      ptr = MBUF_CTOP(bp);
211      while (f--) {
212	sprintf(b, " %02x", (int) *ptr++);
213        b += 3;
214        if (b == buf + sizeof buf - 2) {
215          strcpy(b, "\n");
216          LogPrintf(lev, buf);
217          b = buf;
218        }
219      }
220    } while ((bp = bp->next) != NULL);
221
222    if (b > buf) {
223      strcpy(b, "\n");
224      LogPrintf(lev, buf);
225    }
226  }
227}
228
229void
230LogDumpBuff(int lev, const char *hdr, const u_char * ptr, int n)
231{
232  if (LogIsKept(lev)) {
233    char buf[50];
234    char *b;
235
236    if (hdr && *hdr)
237      LogPrintf(lev, "%s\n", hdr);
238    while (n > 0) {
239      b = buf;
240      for (b = buf; b != buf + sizeof buf - 2 && n--; b += 3)
241	sprintf(b, " %02x", (int) *ptr++);
242      strcpy(b, "\n");
243      LogPrintf(lev, buf);
244    }
245  }
246}
247