xref: /freebsd/usr.sbin/ppp/log.c (revision c39934ea321903c1a19b1fe98bee9cabf046a59b)
1c39934eaSBrian Somers /*-
2c39934eaSBrian Somers  * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org>
3c39934eaSBrian Somers  * All rights reserved.
4c39934eaSBrian Somers  *
5c39934eaSBrian Somers  * Redistribution and use in source and binary forms, with or without
6c39934eaSBrian Somers  * modification, are permitted provided that the following conditions
7c39934eaSBrian Somers  * are met:
8c39934eaSBrian Somers  * 1. Redistributions of source code must retain the above copyright
9c39934eaSBrian Somers  *    notice, this list of conditions and the following disclaimer.
10c39934eaSBrian Somers  * 2. Redistributions in binary form must reproduce the above copyright
11c39934eaSBrian Somers  *    notice, this list of conditions and the following disclaimer in the
12c39934eaSBrian Somers  *    documentation and/or other materials provided with the distribution.
13c39934eaSBrian Somers  *
14c39934eaSBrian Somers  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15c39934eaSBrian Somers  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16c39934eaSBrian Somers  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17c39934eaSBrian Somers  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18c39934eaSBrian Somers  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19c39934eaSBrian Somers  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20c39934eaSBrian Somers  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21c39934eaSBrian Somers  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22c39934eaSBrian Somers  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23c39934eaSBrian Somers  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24c39934eaSBrian Somers  * SUCH DAMAGE.
25c39934eaSBrian Somers  *
26c39934eaSBrian Somers  *	$Id$
2775240ed1SBrian Somers  */
2875240ed1SBrian Somers 
29927145beSBrian Somers #include <sys/param.h>
30927145beSBrian Somers #include <netinet/in.h>
3175240ed1SBrian Somers #include <sys/socket.h>
3275240ed1SBrian Somers 
3353c9f6c0SAtsushi Murai #include <stdarg.h>
3453c9f6c0SAtsushi Murai #include <stdio.h>
3575240ed1SBrian Somers #include <syslog.h>
3675240ed1SBrian Somers 
37b6e82f33SBrian Somers #include "command.h"
38927145beSBrian Somers #include "mbuf.h"
39927145beSBrian Somers #include "log.h"
40927145beSBrian Somers #include "loadalias.h"
4186e02934SBrian Somers #include "defs.h"
42927145beSBrian Somers #include "vars.h"
43af57ed9fSAtsushi Murai 
44b6e82f33SBrian Somers static const char *LogNames[] = {
45927145beSBrian Somers   "Async",
46927145beSBrian Somers   "Carrier",
47cb611434SBrian Somers   "CCP",
48927145beSBrian Somers   "Chat",
49927145beSBrian Somers   "Command",
50927145beSBrian Somers   "Connect",
51927145beSBrian Somers   "Debug",
52927145beSBrian Somers   "HDLC",
535106c671SBrian Somers   "ID0",
54cb611434SBrian Somers   "IPCP",
55927145beSBrian Somers   "LCP",
56927145beSBrian Somers   "Link",
57927145beSBrian Somers   "LQM",
58927145beSBrian Somers   "Phase",
59927145beSBrian Somers   "TCP/IP",
60927145beSBrian Somers   "Tun",
61927145beSBrian Somers   "Warning",
62927145beSBrian Somers   "Error",
63927145beSBrian Somers   "Alert"
64927145beSBrian Somers };
65af57ed9fSAtsushi Murai 
66927145beSBrian Somers #define MSK(n) (1<<((n)-1))
67af57ed9fSAtsushi Murai 
68927145beSBrian Somers static u_long LogMask = MSK(LogLINK) | MSK(LogCARRIER) | MSK(LogPHASE);
69a1e8f937SBrian Somers static u_long LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN);
70927145beSBrian Somers static int LogTunno = -1;
71af57ed9fSAtsushi Murai 
72927145beSBrian Somers static int
73927145beSBrian Somers syslogLevel(int lev)
74927145beSBrian Somers {
75927145beSBrian Somers   switch (lev) {
76927145beSBrian Somers     case LogDEBUG:return LOG_DEBUG;
77944f7098SBrian Somers   case LogWARN:
78944f7098SBrian Somers     return LOG_WARNING;
79944f7098SBrian Somers   case LogERROR:
80944f7098SBrian Somers     return LOG_ERR;
81944f7098SBrian Somers   case LogALERT:
82944f7098SBrian Somers     return LOG_ALERT;
83927145beSBrian Somers   }
84927145beSBrian Somers   return lev >= LogMIN && lev <= LogMAX ? LOG_INFO : 0;
85927145beSBrian Somers }
86af57ed9fSAtsushi Murai 
87927145beSBrian Somers const char *
88927145beSBrian Somers LogName(int id)
89927145beSBrian Somers {
90927145beSBrian Somers   return id < LogMIN || id > LogMAX ? "Unknown" : LogNames[id - 1];
91927145beSBrian Somers }
92af57ed9fSAtsushi Murai 
93af57ed9fSAtsushi Murai void
94927145beSBrian Somers LogKeep(int id)
95af57ed9fSAtsushi Murai {
96927145beSBrian Somers   if (id >= LogMIN && id <= LogMAXCONF)
97927145beSBrian Somers     LogMask |= MSK(id);
98af57ed9fSAtsushi Murai }
99927145beSBrian Somers 
100927145beSBrian Somers void
101a1e8f937SBrian Somers LogKeepLocal(int id)
102a1e8f937SBrian Somers {
103a1e8f937SBrian Somers   if (id >= LogMIN && id <= LogMAXCONF)
104a1e8f937SBrian Somers     LogMaskLocal |= MSK(id);
105a1e8f937SBrian Somers }
106a1e8f937SBrian Somers 
107a1e8f937SBrian Somers void
108927145beSBrian Somers LogDiscard(int id)
109927145beSBrian Somers {
110927145beSBrian Somers   if (id >= LogMIN && id <= LogMAXCONF)
111927145beSBrian Somers     LogMask &= ~MSK(id);
112927145beSBrian Somers }
113927145beSBrian Somers 
114927145beSBrian Somers void
115a1e8f937SBrian Somers LogDiscardLocal(int id)
116a1e8f937SBrian Somers {
117a1e8f937SBrian Somers   if (id >= LogMIN && id <= LogMAXCONF)
118a1e8f937SBrian Somers     LogMaskLocal &= ~MSK(id);
119a1e8f937SBrian Somers }
120a1e8f937SBrian Somers 
121a1e8f937SBrian Somers void
122927145beSBrian Somers LogDiscardAll()
123927145beSBrian Somers {
124927145beSBrian Somers   LogMask = 0;
125af57ed9fSAtsushi Murai }
126af57ed9fSAtsushi Murai 
127a1e8f937SBrian Somers void
128a1e8f937SBrian Somers LogDiscardAllLocal()
129a1e8f937SBrian Somers {
130a1e8f937SBrian Somers   LogMaskLocal = 0;
131a1e8f937SBrian Somers }
132a1e8f937SBrian Somers 
133af57ed9fSAtsushi Murai int
134927145beSBrian Somers LogIsKept(int id)
135af57ed9fSAtsushi Murai {
136a1e8f937SBrian Somers   if (id < LogMIN || id > LogMAX)
137927145beSBrian Somers     return 0;
138a1e8f937SBrian Somers   if (id > LogMAXCONF)
139a1e8f937SBrian Somers     return LOG_KEPT_LOCAL | LOG_KEPT_SYSLOG;
140a1e8f937SBrian Somers 
141a1e8f937SBrian Somers   return ((LogMaskLocal & MSK(id)) ? LOG_KEPT_LOCAL : 0) |
142a1e8f937SBrian Somers     ((LogMask & MSK(id)) ? LOG_KEPT_SYSLOG : 0);
143af57ed9fSAtsushi Murai }
144af57ed9fSAtsushi Murai 
145af57ed9fSAtsushi Murai void
146927145beSBrian Somers LogOpen(const char *Name)
147af57ed9fSAtsushi Murai {
148927145beSBrian Somers   openlog(Name, LOG_PID, LOG_DAEMON);
149af57ed9fSAtsushi Murai }
150af57ed9fSAtsushi Murai 
151af57ed9fSAtsushi Murai void
152927145beSBrian Somers LogSetTun(int tunno)
153af57ed9fSAtsushi Murai {
154927145beSBrian Somers   LogTunno = tunno;
155af57ed9fSAtsushi Murai }
156af57ed9fSAtsushi Murai 
157af57ed9fSAtsushi Murai void
158af57ed9fSAtsushi Murai LogClose()
159af57ed9fSAtsushi Murai {
160927145beSBrian Somers   closelog();
161927145beSBrian Somers   LogTunno = -1;
1626ed9fb2fSBrian Somers }
163af57ed9fSAtsushi Murai 
164af57ed9fSAtsushi Murai void
165b6e82f33SBrian Somers LogPrintf(int lev, const char *fmt,...)
16653c9f6c0SAtsushi Murai {
16753c9f6c0SAtsushi Murai   va_list ap;
168944f7098SBrian Somers 
169927145beSBrian Somers   va_start(ap, fmt);
170927145beSBrian Somers   if (LogIsKept(lev)) {
171927145beSBrian Somers     static char nfmt[200];
17253c9f6c0SAtsushi Murai 
173a1e8f937SBrian Somers     if ((LogIsKept(lev) & LOG_KEPT_LOCAL) && VarTerm) {
174a1e8f937SBrian Somers       if ((LogIsKept(LogTUN) & LOG_KEPT_LOCAL) && LogTunno != -1)
175927145beSBrian Somers         snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s",
176927145beSBrian Somers 	         LogTunno, LogName(lev), fmt);
177927145beSBrian Somers       else
178927145beSBrian Somers         snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt);
179a1e8f937SBrian Somers       vfprintf(VarTerm, nfmt, ap);
1803aa7aa46SBrian Somers       fflush(VarTerm);
181a1e8f937SBrian Somers     }
182a1e8f937SBrian Somers 
183a1e8f937SBrian Somers     if ((LogIsKept(lev) & LOG_KEPT_SYSLOG) && (lev != LogWARN || !VarTerm)) {
184a1e8f937SBrian Somers       if ((LogIsKept(LogTUN) & LOG_KEPT_SYSLOG) && LogTunno != -1)
185a1e8f937SBrian Somers         snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s",
186a1e8f937SBrian Somers 	         LogTunno, LogName(lev), fmt);
187a1e8f937SBrian Somers       else
188a1e8f937SBrian Somers         snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt);
189927145beSBrian Somers       vsyslog(syslogLevel(lev), nfmt, ap);
190927145beSBrian Somers     }
191a1e8f937SBrian Somers   }
19253c9f6c0SAtsushi Murai   va_end(ap);
19353c9f6c0SAtsushi Murai }
19453c9f6c0SAtsushi Murai 
19553c9f6c0SAtsushi Murai void
196b6e82f33SBrian Somers LogDumpBp(int lev, const char *hdr, const struct mbuf * bp)
197af57ed9fSAtsushi Murai {
198a9e8f807SBrian Somers   if (LogIsKept(lev)) {
199a1e8f937SBrian Somers     char buf[50];
200a9e8f807SBrian Somers     char *b;
201a9e8f807SBrian Somers     u_char *ptr;
202a9e8f807SBrian Somers     int f;
203a9e8f807SBrian Somers 
204a9e8f807SBrian Somers     if (hdr && *hdr)
205a9e8f807SBrian Somers       LogPrintf(lev, "%s\n", hdr);
206a9e8f807SBrian Somers 
207a9e8f807SBrian Somers     b = buf;
208a9e8f807SBrian Somers     do {
209a9e8f807SBrian Somers       f = bp->cnt;
210a9e8f807SBrian Somers       ptr = MBUF_CTOP(bp);
211a9e8f807SBrian Somers       while (f--) {
212a9e8f807SBrian Somers 	sprintf(b, " %02x", (int) *ptr++);
213a9e8f807SBrian Somers         b += 3;
214a1e8f937SBrian Somers         if (b == buf + sizeof buf - 2) {
215a1e8f937SBrian Somers           strcpy(b, "\n");
216a9e8f807SBrian Somers           LogPrintf(lev, buf);
217a9e8f807SBrian Somers           b = buf;
218a9e8f807SBrian Somers         }
219a9e8f807SBrian Somers       }
220a9e8f807SBrian Somers     } while ((bp = bp->next) != NULL);
221a9e8f807SBrian Somers 
222a1e8f937SBrian Somers     if (b > buf) {
223a1e8f937SBrian Somers       strcpy(b, "\n");
224a9e8f807SBrian Somers       LogPrintf(lev, buf);
225a9e8f807SBrian Somers     }
226af57ed9fSAtsushi Murai   }
227a1e8f937SBrian Somers }
228af57ed9fSAtsushi Murai 
229af57ed9fSAtsushi Murai void
230b6e82f33SBrian Somers LogDumpBuff(int lev, const char *hdr, const u_char * ptr, int n)
231af57ed9fSAtsushi Murai {
232927145beSBrian Somers   if (LogIsKept(lev)) {
233a1e8f937SBrian Somers     char buf[50];
234927145beSBrian Somers     char *b;
235af57ed9fSAtsushi Murai 
236927145beSBrian Somers     if (hdr && *hdr)
237a9e8f807SBrian Somers       LogPrintf(lev, "%s\n", hdr);
238927145beSBrian Somers     while (n > 0) {
239927145beSBrian Somers       b = buf;
240a1e8f937SBrian Somers       for (b = buf; b != buf + sizeof(buf) - 2 && n--; b += 3)
241927145beSBrian Somers 	sprintf(b, " %02x", (int) *ptr++);
242a1e8f937SBrian Somers       strcpy(b, "\n");
243927145beSBrian Somers       LogPrintf(lev, buf);
244af57ed9fSAtsushi Murai     }
245af57ed9fSAtsushi Murai   }
246c6c740beSBrian Somers }
247