xref: /freebsd/usr.sbin/ppp/log.c (revision 5106c67149438f0d50a1915bbcb75be1db7aae30)
175240ed1SBrian Somers /*
25106c671SBrian Somers  * $Id: log.c,v 1.18 1997/11/04 01:17:00 brian Exp $
375240ed1SBrian Somers  */
475240ed1SBrian Somers 
5927145beSBrian Somers #include <sys/param.h>
6927145beSBrian Somers #include <netinet/in.h>
775240ed1SBrian Somers #include <sys/socket.h>
875240ed1SBrian Somers 
953c9f6c0SAtsushi Murai #include <stdarg.h>
1053c9f6c0SAtsushi Murai #include <stdio.h>
1175240ed1SBrian Somers #include <syslog.h>
1275240ed1SBrian Somers 
13927145beSBrian Somers #include "mbuf.h"
14927145beSBrian Somers #include "log.h"
15927145beSBrian Somers #include "loadalias.h"
1675240ed1SBrian Somers #include "command.h"
17927145beSBrian Somers #include "vars.h"
18af57ed9fSAtsushi Murai 
19927145beSBrian Somers static char *LogNames[] = {
20927145beSBrian Somers   "Async",
21927145beSBrian Somers   "Carrier",
22cb611434SBrian Somers   "CCP",
23927145beSBrian Somers   "Chat",
24927145beSBrian Somers   "Command",
25927145beSBrian Somers   "Connect",
26927145beSBrian Somers   "Debug",
27927145beSBrian Somers   "HDLC",
285106c671SBrian Somers   "ID0",
29cb611434SBrian Somers   "IPCP",
30927145beSBrian Somers   "LCP",
31927145beSBrian Somers   "Link",
32927145beSBrian Somers   "LQM",
33927145beSBrian Somers   "Phase",
34927145beSBrian Somers   "TCP/IP",
35927145beSBrian Somers   "Tun",
36927145beSBrian Somers   "Warning",
37927145beSBrian Somers   "Error",
38927145beSBrian Somers   "Alert"
39927145beSBrian Somers };
40af57ed9fSAtsushi Murai 
41927145beSBrian Somers #define MSK(n) (1<<((n)-1))
42af57ed9fSAtsushi Murai 
43927145beSBrian Somers static u_long LogMask = MSK(LogLINK) | MSK(LogCARRIER) | MSK(LogPHASE);
44a1e8f937SBrian Somers static u_long LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN);
45927145beSBrian Somers static int LogTunno = -1;
46af57ed9fSAtsushi Murai 
47927145beSBrian Somers static int
48927145beSBrian Somers syslogLevel(int lev)
49927145beSBrian Somers {
50927145beSBrian Somers   switch (lev) {
51927145beSBrian Somers     case LogDEBUG:return LOG_DEBUG;
52944f7098SBrian Somers   case LogWARN:
53944f7098SBrian Somers     return LOG_WARNING;
54944f7098SBrian Somers   case LogERROR:
55944f7098SBrian Somers     return LOG_ERR;
56944f7098SBrian Somers   case LogALERT:
57944f7098SBrian Somers     return LOG_ALERT;
58927145beSBrian Somers   }
59927145beSBrian Somers   return lev >= LogMIN && lev <= LogMAX ? LOG_INFO : 0;
60927145beSBrian Somers }
61af57ed9fSAtsushi Murai 
62927145beSBrian Somers const char *
63927145beSBrian Somers LogName(int id)
64927145beSBrian Somers {
65927145beSBrian Somers   return id < LogMIN || id > LogMAX ? "Unknown" : LogNames[id - 1];
66927145beSBrian Somers }
67af57ed9fSAtsushi Murai 
68af57ed9fSAtsushi Murai void
69927145beSBrian Somers LogKeep(int id)
70af57ed9fSAtsushi Murai {
71927145beSBrian Somers   if (id >= LogMIN && id <= LogMAXCONF)
72927145beSBrian Somers     LogMask |= MSK(id);
73af57ed9fSAtsushi Murai }
74927145beSBrian Somers 
75927145beSBrian Somers void
76a1e8f937SBrian Somers LogKeepLocal(int id)
77a1e8f937SBrian Somers {
78a1e8f937SBrian Somers   if (id >= LogMIN && id <= LogMAXCONF)
79a1e8f937SBrian Somers     LogMaskLocal |= MSK(id);
80a1e8f937SBrian Somers }
81a1e8f937SBrian Somers 
82a1e8f937SBrian Somers void
83927145beSBrian Somers LogDiscard(int id)
84927145beSBrian Somers {
85927145beSBrian Somers   if (id >= LogMIN && id <= LogMAXCONF)
86927145beSBrian Somers     LogMask &= ~MSK(id);
87927145beSBrian Somers }
88927145beSBrian Somers 
89927145beSBrian Somers void
90a1e8f937SBrian Somers LogDiscardLocal(int id)
91a1e8f937SBrian Somers {
92a1e8f937SBrian Somers   if (id >= LogMIN && id <= LogMAXCONF)
93a1e8f937SBrian Somers     LogMaskLocal &= ~MSK(id);
94a1e8f937SBrian Somers }
95a1e8f937SBrian Somers 
96a1e8f937SBrian Somers void
97927145beSBrian Somers LogDiscardAll()
98927145beSBrian Somers {
99927145beSBrian Somers   LogMask = 0;
100af57ed9fSAtsushi Murai }
101af57ed9fSAtsushi Murai 
102a1e8f937SBrian Somers void
103a1e8f937SBrian Somers LogDiscardAllLocal()
104a1e8f937SBrian Somers {
105a1e8f937SBrian Somers   LogMaskLocal = 0;
106a1e8f937SBrian Somers }
107a1e8f937SBrian Somers 
108af57ed9fSAtsushi Murai int
109927145beSBrian Somers LogIsKept(int id)
110af57ed9fSAtsushi Murai {
111a1e8f937SBrian Somers   if (id < LogMIN || id > LogMAX)
112927145beSBrian Somers     return 0;
113a1e8f937SBrian Somers   if (id > LogMAXCONF)
114a1e8f937SBrian Somers     return LOG_KEPT_LOCAL | LOG_KEPT_SYSLOG;
115a1e8f937SBrian Somers 
116a1e8f937SBrian Somers   return ((LogMaskLocal & MSK(id)) ? LOG_KEPT_LOCAL : 0) |
117a1e8f937SBrian Somers     ((LogMask & MSK(id)) ? LOG_KEPT_SYSLOG : 0);
118af57ed9fSAtsushi Murai }
119af57ed9fSAtsushi Murai 
120af57ed9fSAtsushi Murai void
121927145beSBrian Somers LogOpen(const char *Name)
122af57ed9fSAtsushi Murai {
123927145beSBrian Somers   openlog(Name, LOG_PID, LOG_DAEMON);
124af57ed9fSAtsushi Murai }
125af57ed9fSAtsushi Murai 
126af57ed9fSAtsushi Murai void
127927145beSBrian Somers LogSetTun(int tunno)
128af57ed9fSAtsushi Murai {
129927145beSBrian Somers   LogTunno = tunno;
130af57ed9fSAtsushi Murai }
131af57ed9fSAtsushi Murai 
132af57ed9fSAtsushi Murai void
133af57ed9fSAtsushi Murai LogClose()
134af57ed9fSAtsushi Murai {
135927145beSBrian Somers   closelog();
136927145beSBrian Somers   LogTunno = -1;
1376ed9fb2fSBrian Somers }
138af57ed9fSAtsushi Murai 
139af57ed9fSAtsushi Murai void
140927145beSBrian Somers LogPrintf(int lev, char *fmt,...)
14153c9f6c0SAtsushi Murai {
14253c9f6c0SAtsushi Murai   va_list ap;
143944f7098SBrian Somers 
144927145beSBrian Somers   va_start(ap, fmt);
145927145beSBrian Somers   if (LogIsKept(lev)) {
146927145beSBrian Somers     static char nfmt[200];
14753c9f6c0SAtsushi Murai 
148a1e8f937SBrian Somers     if ((LogIsKept(lev) & LOG_KEPT_LOCAL) && VarTerm) {
149a1e8f937SBrian Somers       if ((LogIsKept(LogTUN) & LOG_KEPT_LOCAL) && LogTunno != -1)
150927145beSBrian Somers         snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s",
151927145beSBrian Somers 	         LogTunno, LogName(lev), fmt);
152927145beSBrian Somers       else
153927145beSBrian Somers         snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt);
154a1e8f937SBrian Somers       vfprintf(VarTerm, nfmt, ap);
155a1e8f937SBrian Somers     }
156a1e8f937SBrian Somers 
157a1e8f937SBrian Somers     if ((LogIsKept(lev) & LOG_KEPT_SYSLOG) && (lev != LogWARN || !VarTerm)) {
158a1e8f937SBrian Somers       if ((LogIsKept(LogTUN) & LOG_KEPT_SYSLOG) && LogTunno != -1)
159a1e8f937SBrian Somers         snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s",
160a1e8f937SBrian Somers 	         LogTunno, LogName(lev), fmt);
161a1e8f937SBrian Somers       else
162a1e8f937SBrian Somers         snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt);
163927145beSBrian Somers       vsyslog(syslogLevel(lev), nfmt, ap);
164927145beSBrian Somers     }
165a1e8f937SBrian Somers   }
16653c9f6c0SAtsushi Murai   va_end(ap);
16753c9f6c0SAtsushi Murai }
16853c9f6c0SAtsushi Murai 
16953c9f6c0SAtsushi Murai void
170927145beSBrian Somers LogDumpBp(int lev, char *hdr, struct mbuf * bp)
171af57ed9fSAtsushi Murai {
172a9e8f807SBrian Somers   if (LogIsKept(lev)) {
173a1e8f937SBrian Somers     char buf[50];
174a9e8f807SBrian Somers     char *b;
175a9e8f807SBrian Somers     u_char *ptr;
176a9e8f807SBrian Somers     int f;
177a9e8f807SBrian Somers 
178a9e8f807SBrian Somers     if (hdr && *hdr)
179a9e8f807SBrian Somers       LogPrintf(lev, "%s\n", hdr);
180a9e8f807SBrian Somers 
181a9e8f807SBrian Somers     b = buf;
182a9e8f807SBrian Somers     do {
183a9e8f807SBrian Somers       f = bp->cnt;
184a9e8f807SBrian Somers       ptr = MBUF_CTOP(bp);
185a9e8f807SBrian Somers       while (f--) {
186a9e8f807SBrian Somers 	sprintf(b, " %02x", (int) *ptr++);
187a9e8f807SBrian Somers         b += 3;
188a1e8f937SBrian Somers         if (b == buf + sizeof buf - 2) {
189a1e8f937SBrian Somers           strcpy(b, "\n");
190a9e8f807SBrian Somers           LogPrintf(lev, buf);
191a9e8f807SBrian Somers           b = buf;
192a9e8f807SBrian Somers         }
193a9e8f807SBrian Somers       }
194a9e8f807SBrian Somers     } while ((bp = bp->next) != NULL);
195a9e8f807SBrian Somers 
196a1e8f937SBrian Somers     if (b > buf) {
197a1e8f937SBrian Somers       strcpy(b, "\n");
198a9e8f807SBrian Somers       LogPrintf(lev, buf);
199a9e8f807SBrian Somers     }
200af57ed9fSAtsushi Murai   }
201a1e8f937SBrian Somers }
202af57ed9fSAtsushi Murai 
203af57ed9fSAtsushi Murai void
204927145beSBrian Somers LogDumpBuff(int lev, char *hdr, u_char * ptr, int n)
205af57ed9fSAtsushi Murai {
206927145beSBrian Somers   if (LogIsKept(lev)) {
207a1e8f937SBrian Somers     char buf[50];
208927145beSBrian Somers     char *b;
209af57ed9fSAtsushi Murai 
210927145beSBrian Somers     if (hdr && *hdr)
211a9e8f807SBrian Somers       LogPrintf(lev, "%s\n", hdr);
212927145beSBrian Somers     while (n > 0) {
213927145beSBrian Somers       b = buf;
214a1e8f937SBrian Somers       for (b = buf; b != buf + sizeof(buf) - 2 && n--; b += 3)
215927145beSBrian Somers 	sprintf(b, " %02x", (int) *ptr++);
216a1e8f937SBrian Somers       strcpy(b, "\n");
217927145beSBrian Somers       LogPrintf(lev, buf);
218af57ed9fSAtsushi Murai     }
219af57ed9fSAtsushi Murai   }
220c6c740beSBrian Somers }
221