xref: /freebsd/usr.sbin/ppp/log.c (revision a9e8f8073960443c66e987e8fbd7136a1c066017)
1927145beSBrian Somers #include <sys/types.h>
2927145beSBrian Somers #include <sys/socket.h>
3927145beSBrian Somers #include <sys/param.h>
4927145beSBrian Somers #include <netinet/in.h>
5927145beSBrian Somers #include <syslog.h>
653c9f6c0SAtsushi Murai #include <stdarg.h>
753c9f6c0SAtsushi Murai #include <stdio.h>
8927145beSBrian Somers #include "mbuf.h"
9927145beSBrian Somers #include "log.h"
10927145beSBrian Somers #include "loadalias.h"
11927145beSBrian Somers #include "vars.h"
12af57ed9fSAtsushi Murai 
13927145beSBrian Somers static char *LogNames[] = {
14927145beSBrian Somers   "Async",
15927145beSBrian Somers   "Carrier",
16cb611434SBrian Somers   "CCP",
17927145beSBrian Somers   "Chat",
18927145beSBrian Somers   "Command",
19927145beSBrian Somers   "Connect",
20927145beSBrian Somers   "Debug",
21927145beSBrian Somers   "HDLC",
22cb611434SBrian Somers   "IPCP",
23927145beSBrian Somers   "LCP",
24927145beSBrian Somers   "Link",
25927145beSBrian Somers   "LQM",
26927145beSBrian Somers   "Phase",
27927145beSBrian Somers   "TCP/IP",
28927145beSBrian Somers   "Tun",
29927145beSBrian Somers   "Warning",
30927145beSBrian Somers   "Error",
31927145beSBrian Somers   "Alert"
32927145beSBrian Somers };
33af57ed9fSAtsushi Murai 
34927145beSBrian Somers #define MSK(n) (1<<((n)-1))
35af57ed9fSAtsushi Murai 
36927145beSBrian Somers static u_long LogMask = MSK(LogLINK) | MSK(LogCARRIER) | MSK(LogPHASE);
37927145beSBrian Somers static int LogTunno = -1;
38af57ed9fSAtsushi Murai 
39927145beSBrian Somers static int
40927145beSBrian Somers syslogLevel(int lev)
41927145beSBrian Somers {
42927145beSBrian Somers   switch (lev) {
43927145beSBrian Somers     case LogDEBUG:return LOG_DEBUG;
44944f7098SBrian Somers   case LogWARN:
45944f7098SBrian Somers     return LOG_WARNING;
46944f7098SBrian Somers   case LogERROR:
47944f7098SBrian Somers     return LOG_ERR;
48944f7098SBrian Somers   case LogALERT:
49944f7098SBrian Somers     return LOG_ALERT;
50927145beSBrian Somers   }
51927145beSBrian Somers   return lev >= LogMIN && lev <= LogMAX ? LOG_INFO : 0;
52927145beSBrian Somers }
53af57ed9fSAtsushi Murai 
54927145beSBrian Somers const char *
55927145beSBrian Somers LogName(int id)
56927145beSBrian Somers {
57927145beSBrian Somers   return id < LogMIN || id > LogMAX ? "Unknown" : LogNames[id - 1];
58927145beSBrian Somers }
59af57ed9fSAtsushi Murai 
60af57ed9fSAtsushi Murai void
61927145beSBrian Somers LogKeep(int id)
62af57ed9fSAtsushi Murai {
63927145beSBrian Somers   if (id >= LogMIN && id <= LogMAXCONF)
64927145beSBrian Somers     LogMask |= MSK(id);
65af57ed9fSAtsushi Murai }
66927145beSBrian Somers 
67927145beSBrian Somers void
68927145beSBrian Somers LogDiscard(int id)
69927145beSBrian Somers {
70927145beSBrian Somers   if (id >= LogMIN && id <= LogMAXCONF)
71927145beSBrian Somers     LogMask &= ~MSK(id);
72927145beSBrian Somers }
73927145beSBrian Somers 
74927145beSBrian Somers void
75927145beSBrian Somers LogDiscardAll()
76927145beSBrian Somers {
77927145beSBrian Somers   LogMask = 0;
78af57ed9fSAtsushi Murai }
79af57ed9fSAtsushi Murai 
80af57ed9fSAtsushi Murai int
81927145beSBrian Somers LogIsKept(int id)
82af57ed9fSAtsushi Murai {
83927145beSBrian Somers   if (id < LogMIN)
84927145beSBrian Somers     return 0;
85927145beSBrian Somers   if (id <= LogMAXCONF)
86927145beSBrian Somers     return LogMask & MSK(id);
87927145beSBrian Somers   return id <= LogMAX;
88af57ed9fSAtsushi Murai }
89af57ed9fSAtsushi Murai 
90af57ed9fSAtsushi Murai void
91927145beSBrian Somers LogOpen(const char *Name)
92af57ed9fSAtsushi Murai {
93927145beSBrian Somers   openlog(Name, LOG_PID, LOG_DAEMON);
94af57ed9fSAtsushi Murai }
95af57ed9fSAtsushi Murai 
96af57ed9fSAtsushi Murai void
97927145beSBrian Somers LogSetTun(int tunno)
98af57ed9fSAtsushi Murai {
99927145beSBrian Somers   LogTunno = tunno;
100af57ed9fSAtsushi Murai }
101af57ed9fSAtsushi Murai 
102af57ed9fSAtsushi Murai void
103af57ed9fSAtsushi Murai LogClose()
104af57ed9fSAtsushi Murai {
105927145beSBrian Somers   closelog();
106927145beSBrian Somers   LogTunno = -1;
1076ed9fb2fSBrian Somers }
108af57ed9fSAtsushi Murai 
109af57ed9fSAtsushi Murai void
110927145beSBrian Somers LogPrintf(int lev, char *fmt,...)
11153c9f6c0SAtsushi Murai {
11253c9f6c0SAtsushi Murai   va_list ap;
113944f7098SBrian Somers 
114927145beSBrian Somers   va_start(ap, fmt);
115927145beSBrian Somers   if (LogIsKept(lev)) {
116927145beSBrian Somers     static char nfmt[200];
11753c9f6c0SAtsushi Murai 
118927145beSBrian Somers     if (LogIsKept(LogTUN) && LogTunno != -1)
119927145beSBrian Somers       snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s",
120927145beSBrian Somers 	       LogTunno, LogName(lev), fmt);
121927145beSBrian Somers     else
122927145beSBrian Somers       snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt);
123927145beSBrian Somers     if ((lev == LogERROR || lev == LogALERT || lev == LogWARN) && VarTerm)
124927145beSBrian Somers       vfprintf(VarTerm, fmt, ap);
125927145beSBrian Somers     if (lev != LogWARN || !VarTerm)
126927145beSBrian Somers       vsyslog(syslogLevel(lev), nfmt, ap);
127927145beSBrian Somers   }
12853c9f6c0SAtsushi Murai   va_end(ap);
12953c9f6c0SAtsushi Murai }
13053c9f6c0SAtsushi Murai 
13153c9f6c0SAtsushi Murai void
132927145beSBrian Somers LogDumpBp(int lev, char *hdr, struct mbuf * bp)
133af57ed9fSAtsushi Murai {
134a9e8f807SBrian Somers   if (LogIsKept(lev)) {
135a9e8f807SBrian Somers     char buf[49];
136a9e8f807SBrian Somers     char *b;
137a9e8f807SBrian Somers     u_char *ptr;
138a9e8f807SBrian Somers     int f;
139a9e8f807SBrian Somers 
140a9e8f807SBrian Somers     if (hdr && *hdr)
141a9e8f807SBrian Somers       LogPrintf(lev, "%s\n", hdr);
142a9e8f807SBrian Somers 
143a9e8f807SBrian Somers     b = buf;
144a9e8f807SBrian Somers     do {
145a9e8f807SBrian Somers       f = bp->cnt;
146a9e8f807SBrian Somers       ptr = MBUF_CTOP(bp);
147a9e8f807SBrian Somers       while (f--) {
148a9e8f807SBrian Somers 	sprintf(b, " %02x", (int) *ptr++);
149a9e8f807SBrian Somers         b += 3;
150a9e8f807SBrian Somers         if (b == buf + sizeof buf - 1) {
151a9e8f807SBrian Somers           LogPrintf(lev, buf);
152a9e8f807SBrian Somers           b = buf;
153a9e8f807SBrian Somers         }
154a9e8f807SBrian Somers       }
155a9e8f807SBrian Somers     } while ((bp = bp->next) != NULL);
156a9e8f807SBrian Somers 
157a9e8f807SBrian Somers     if (b > buf)
158a9e8f807SBrian Somers       LogPrintf(lev, buf);
159a9e8f807SBrian Somers   }
160af57ed9fSAtsushi Murai }
161af57ed9fSAtsushi Murai 
162af57ed9fSAtsushi Murai void
163927145beSBrian Somers LogDumpBuff(int lev, char *hdr, u_char * ptr, int n)
164af57ed9fSAtsushi Murai {
165927145beSBrian Somers   if (LogIsKept(lev)) {
166927145beSBrian Somers     char buf[49];
167927145beSBrian Somers     char *b;
168927145beSBrian Somers     int f;
169af57ed9fSAtsushi Murai 
170927145beSBrian Somers     if (hdr && *hdr)
171a9e8f807SBrian Somers       LogPrintf(lev, "%s\n", hdr);
172927145beSBrian Somers     while (n > 0) {
173927145beSBrian Somers       b = buf;
174927145beSBrian Somers       for (f = 0; f < 16 && n--; f++, b += 3)
175927145beSBrian Somers 	sprintf(b, " %02x", (int) *ptr++);
176927145beSBrian Somers       LogPrintf(lev, buf);
177af57ed9fSAtsushi Murai     }
178af57ed9fSAtsushi Murai   }
179c6c740beSBrian Somers }
180