xref: /freebsd/usr.sbin/ppp/log.c (revision a1e8f9372ac06db2132f3a69b6977c7a4ae01cac)
175240ed1SBrian Somers /*
2a1e8f937SBrian Somers  * $Id: log.c,v 1.17 1997/10/26 01:03:05 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",
28cb611434SBrian Somers   "IPCP",
29927145beSBrian Somers   "LCP",
30927145beSBrian Somers   "Link",
31927145beSBrian Somers   "LQM",
32927145beSBrian Somers   "Phase",
33927145beSBrian Somers   "TCP/IP",
34927145beSBrian Somers   "Tun",
35927145beSBrian Somers   "Warning",
36927145beSBrian Somers   "Error",
37927145beSBrian Somers   "Alert"
38927145beSBrian Somers };
39af57ed9fSAtsushi Murai 
40927145beSBrian Somers #define MSK(n) (1<<((n)-1))
41af57ed9fSAtsushi Murai 
42927145beSBrian Somers static u_long LogMask = MSK(LogLINK) | MSK(LogCARRIER) | MSK(LogPHASE);
43a1e8f937SBrian Somers static u_long LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN);
44927145beSBrian Somers static int LogTunno = -1;
45af57ed9fSAtsushi Murai 
46927145beSBrian Somers static int
47927145beSBrian Somers syslogLevel(int lev)
48927145beSBrian Somers {
49927145beSBrian Somers   switch (lev) {
50927145beSBrian Somers     case LogDEBUG:return LOG_DEBUG;
51944f7098SBrian Somers   case LogWARN:
52944f7098SBrian Somers     return LOG_WARNING;
53944f7098SBrian Somers   case LogERROR:
54944f7098SBrian Somers     return LOG_ERR;
55944f7098SBrian Somers   case LogALERT:
56944f7098SBrian Somers     return LOG_ALERT;
57927145beSBrian Somers   }
58927145beSBrian Somers   return lev >= LogMIN && lev <= LogMAX ? LOG_INFO : 0;
59927145beSBrian Somers }
60af57ed9fSAtsushi Murai 
61927145beSBrian Somers const char *
62927145beSBrian Somers LogName(int id)
63927145beSBrian Somers {
64927145beSBrian Somers   return id < LogMIN || id > LogMAX ? "Unknown" : LogNames[id - 1];
65927145beSBrian Somers }
66af57ed9fSAtsushi Murai 
67af57ed9fSAtsushi Murai void
68927145beSBrian Somers LogKeep(int id)
69af57ed9fSAtsushi Murai {
70927145beSBrian Somers   if (id >= LogMIN && id <= LogMAXCONF)
71927145beSBrian Somers     LogMask |= MSK(id);
72af57ed9fSAtsushi Murai }
73927145beSBrian Somers 
74927145beSBrian Somers void
75a1e8f937SBrian Somers LogKeepLocal(int id)
76a1e8f937SBrian Somers {
77a1e8f937SBrian Somers   if (id >= LogMIN && id <= LogMAXCONF)
78a1e8f937SBrian Somers     LogMaskLocal |= MSK(id);
79a1e8f937SBrian Somers }
80a1e8f937SBrian Somers 
81a1e8f937SBrian Somers void
82927145beSBrian Somers LogDiscard(int id)
83927145beSBrian Somers {
84927145beSBrian Somers   if (id >= LogMIN && id <= LogMAXCONF)
85927145beSBrian Somers     LogMask &= ~MSK(id);
86927145beSBrian Somers }
87927145beSBrian Somers 
88927145beSBrian Somers void
89a1e8f937SBrian Somers LogDiscardLocal(int id)
90a1e8f937SBrian Somers {
91a1e8f937SBrian Somers   if (id >= LogMIN && id <= LogMAXCONF)
92a1e8f937SBrian Somers     LogMaskLocal &= ~MSK(id);
93a1e8f937SBrian Somers }
94a1e8f937SBrian Somers 
95a1e8f937SBrian Somers void
96927145beSBrian Somers LogDiscardAll()
97927145beSBrian Somers {
98927145beSBrian Somers   LogMask = 0;
99af57ed9fSAtsushi Murai }
100af57ed9fSAtsushi Murai 
101a1e8f937SBrian Somers void
102a1e8f937SBrian Somers LogDiscardAllLocal()
103a1e8f937SBrian Somers {
104a1e8f937SBrian Somers   LogMaskLocal = 0;
105a1e8f937SBrian Somers }
106a1e8f937SBrian Somers 
107af57ed9fSAtsushi Murai int
108927145beSBrian Somers LogIsKept(int id)
109af57ed9fSAtsushi Murai {
110a1e8f937SBrian Somers   if (id < LogMIN || id > LogMAX)
111927145beSBrian Somers     return 0;
112a1e8f937SBrian Somers   if (id > LogMAXCONF)
113a1e8f937SBrian Somers     return LOG_KEPT_LOCAL | LOG_KEPT_SYSLOG;
114a1e8f937SBrian Somers 
115a1e8f937SBrian Somers   return ((LogMaskLocal & MSK(id)) ? LOG_KEPT_LOCAL : 0) |
116a1e8f937SBrian Somers     ((LogMask & MSK(id)) ? LOG_KEPT_SYSLOG : 0);
117af57ed9fSAtsushi Murai }
118af57ed9fSAtsushi Murai 
119af57ed9fSAtsushi Murai void
120927145beSBrian Somers LogOpen(const char *Name)
121af57ed9fSAtsushi Murai {
122927145beSBrian Somers   openlog(Name, LOG_PID, LOG_DAEMON);
123af57ed9fSAtsushi Murai }
124af57ed9fSAtsushi Murai 
125af57ed9fSAtsushi Murai void
126927145beSBrian Somers LogSetTun(int tunno)
127af57ed9fSAtsushi Murai {
128927145beSBrian Somers   LogTunno = tunno;
129af57ed9fSAtsushi Murai }
130af57ed9fSAtsushi Murai 
131af57ed9fSAtsushi Murai void
132af57ed9fSAtsushi Murai LogClose()
133af57ed9fSAtsushi Murai {
134927145beSBrian Somers   closelog();
135927145beSBrian Somers   LogTunno = -1;
1366ed9fb2fSBrian Somers }
137af57ed9fSAtsushi Murai 
138af57ed9fSAtsushi Murai void
139927145beSBrian Somers LogPrintf(int lev, char *fmt,...)
14053c9f6c0SAtsushi Murai {
14153c9f6c0SAtsushi Murai   va_list ap;
142944f7098SBrian Somers 
143927145beSBrian Somers   va_start(ap, fmt);
144927145beSBrian Somers   if (LogIsKept(lev)) {
145927145beSBrian Somers     static char nfmt[200];
14653c9f6c0SAtsushi Murai 
147a1e8f937SBrian Somers     if ((LogIsKept(lev) & LOG_KEPT_LOCAL) && VarTerm) {
148a1e8f937SBrian Somers       if ((LogIsKept(LogTUN) & LOG_KEPT_LOCAL) && LogTunno != -1)
149927145beSBrian Somers         snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s",
150927145beSBrian Somers 	         LogTunno, LogName(lev), fmt);
151927145beSBrian Somers       else
152927145beSBrian Somers         snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt);
153a1e8f937SBrian Somers       vfprintf(VarTerm, nfmt, ap);
154a1e8f937SBrian Somers     }
155a1e8f937SBrian Somers 
156a1e8f937SBrian Somers     if ((LogIsKept(lev) & LOG_KEPT_SYSLOG) && (lev != LogWARN || !VarTerm)) {
157a1e8f937SBrian Somers       if ((LogIsKept(LogTUN) & LOG_KEPT_SYSLOG) && LogTunno != -1)
158a1e8f937SBrian Somers         snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s",
159a1e8f937SBrian Somers 	         LogTunno, LogName(lev), fmt);
160a1e8f937SBrian Somers       else
161a1e8f937SBrian Somers         snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt);
162927145beSBrian Somers       vsyslog(syslogLevel(lev), nfmt, ap);
163927145beSBrian Somers     }
164a1e8f937SBrian Somers   }
16553c9f6c0SAtsushi Murai   va_end(ap);
16653c9f6c0SAtsushi Murai }
16753c9f6c0SAtsushi Murai 
16853c9f6c0SAtsushi Murai void
169927145beSBrian Somers LogDumpBp(int lev, char *hdr, struct mbuf * bp)
170af57ed9fSAtsushi Murai {
171a9e8f807SBrian Somers   if (LogIsKept(lev)) {
172a1e8f937SBrian Somers     char buf[50];
173a9e8f807SBrian Somers     char *b;
174a9e8f807SBrian Somers     u_char *ptr;
175a9e8f807SBrian Somers     int f;
176a9e8f807SBrian Somers 
177a9e8f807SBrian Somers     if (hdr && *hdr)
178a9e8f807SBrian Somers       LogPrintf(lev, "%s\n", hdr);
179a9e8f807SBrian Somers 
180a9e8f807SBrian Somers     b = buf;
181a9e8f807SBrian Somers     do {
182a9e8f807SBrian Somers       f = bp->cnt;
183a9e8f807SBrian Somers       ptr = MBUF_CTOP(bp);
184a9e8f807SBrian Somers       while (f--) {
185a9e8f807SBrian Somers 	sprintf(b, " %02x", (int) *ptr++);
186a9e8f807SBrian Somers         b += 3;
187a1e8f937SBrian Somers         if (b == buf + sizeof buf - 2) {
188a1e8f937SBrian Somers           strcpy(b, "\n");
189a9e8f807SBrian Somers           LogPrintf(lev, buf);
190a9e8f807SBrian Somers           b = buf;
191a9e8f807SBrian Somers         }
192a9e8f807SBrian Somers       }
193a9e8f807SBrian Somers     } while ((bp = bp->next) != NULL);
194a9e8f807SBrian Somers 
195a1e8f937SBrian Somers     if (b > buf) {
196a1e8f937SBrian Somers       strcpy(b, "\n");
197a9e8f807SBrian Somers       LogPrintf(lev, buf);
198a9e8f807SBrian Somers     }
199af57ed9fSAtsushi Murai   }
200a1e8f937SBrian Somers }
201af57ed9fSAtsushi Murai 
202af57ed9fSAtsushi Murai void
203927145beSBrian Somers LogDumpBuff(int lev, char *hdr, u_char * ptr, int n)
204af57ed9fSAtsushi Murai {
205927145beSBrian Somers   if (LogIsKept(lev)) {
206a1e8f937SBrian Somers     char buf[50];
207927145beSBrian Somers     char *b;
208af57ed9fSAtsushi Murai 
209927145beSBrian Somers     if (hdr && *hdr)
210a9e8f807SBrian Somers       LogPrintf(lev, "%s\n", hdr);
211927145beSBrian Somers     while (n > 0) {
212927145beSBrian Somers       b = buf;
213a1e8f937SBrian Somers       for (b = buf; b != buf + sizeof(buf) - 2 && n--; b += 3)
214927145beSBrian Somers 	sprintf(b, " %02x", (int) *ptr++);
215a1e8f937SBrian Somers       strcpy(b, "\n");
216927145beSBrian Somers       LogPrintf(lev, buf);
217af57ed9fSAtsushi Murai     }
218af57ed9fSAtsushi Murai   }
219c6c740beSBrian Somers }
220