xref: /freebsd/usr.sbin/ppp/log.c (revision 02f2e93b60c2b91feac8f45c4c889a5a8e40d8a2)
1 /*
2  * $Id: $
3  */
4 
5 #include <sys/param.h>
6 #include <netinet/in.h>
7 #include <sys/socket.h>
8 
9 #include <stdarg.h>
10 #include <stdio.h>
11 #include <syslog.h>
12 
13 #include "mbuf.h"
14 #include "log.h"
15 #include "loadalias.h"
16 #include "command.h"
17 #include "vars.h"
18 
19 static char *LogNames[] = {
20   "Async",
21   "Carrier",
22   "CCP",
23   "Chat",
24   "Command",
25   "Connect",
26   "Debug",
27   "HDLC",
28   "IPCP",
29   "LCP",
30   "Link",
31   "LQM",
32   "Phase",
33   "TCP/IP",
34   "Tun",
35   "Warning",
36   "Error",
37   "Alert"
38 };
39 
40 #define MSK(n) (1<<((n)-1))
41 
42 static u_long LogMask = MSK(LogLINK) | MSK(LogCARRIER) | MSK(LogPHASE);
43 static int LogTunno = -1;
44 
45 static int
46 syslogLevel(int lev)
47 {
48   switch (lev) {
49     case LogDEBUG:return LOG_DEBUG;
50   case LogWARN:
51     return LOG_WARNING;
52   case LogERROR:
53     return LOG_ERR;
54   case LogALERT:
55     return LOG_ALERT;
56   }
57   return lev >= LogMIN && lev <= LogMAX ? LOG_INFO : 0;
58 }
59 
60 const char *
61 LogName(int id)
62 {
63   return id < LogMIN || id > LogMAX ? "Unknown" : LogNames[id - 1];
64 }
65 
66 void
67 LogKeep(int id)
68 {
69   if (id >= LogMIN && id <= LogMAXCONF)
70     LogMask |= MSK(id);
71 }
72 
73 void
74 LogDiscard(int id)
75 {
76   if (id >= LogMIN && id <= LogMAXCONF)
77     LogMask &= ~MSK(id);
78 }
79 
80 void
81 LogDiscardAll()
82 {
83   LogMask = 0;
84 }
85 
86 int
87 LogIsKept(int id)
88 {
89   if (id < LogMIN)
90     return 0;
91   if (id <= LogMAXCONF)
92     return LogMask & MSK(id);
93   return id <= LogMAX;
94 }
95 
96 void
97 LogOpen(const char *Name)
98 {
99   openlog(Name, LOG_PID, LOG_DAEMON);
100 }
101 
102 void
103 LogSetTun(int tunno)
104 {
105   LogTunno = tunno;
106 }
107 
108 void
109 LogClose()
110 {
111   closelog();
112   LogTunno = -1;
113 }
114 
115 void
116 LogPrintf(int lev, char *fmt,...)
117 {
118   va_list ap;
119 
120   va_start(ap, fmt);
121   if (LogIsKept(lev)) {
122     static char nfmt[200];
123 
124     if (LogIsKept(LogTUN) && LogTunno != -1)
125       snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s",
126 	       LogTunno, LogName(lev), fmt);
127     else
128       snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt);
129     if ((lev == LogERROR || lev == LogALERT || lev == LogWARN) && VarTerm)
130       vfprintf(VarTerm, fmt, ap);
131     if (lev != LogWARN || !VarTerm)
132       vsyslog(syslogLevel(lev), nfmt, ap);
133   }
134   va_end(ap);
135 }
136 
137 void
138 LogDumpBp(int lev, char *hdr, struct mbuf * bp)
139 {
140   if (LogIsKept(lev)) {
141     char buf[49];
142     char *b;
143     u_char *ptr;
144     int f;
145 
146     if (hdr && *hdr)
147       LogPrintf(lev, "%s\n", hdr);
148 
149     b = buf;
150     do {
151       f = bp->cnt;
152       ptr = MBUF_CTOP(bp);
153       while (f--) {
154 	sprintf(b, " %02x", (int) *ptr++);
155         b += 3;
156         if (b == buf + sizeof buf - 1) {
157           LogPrintf(lev, buf);
158           b = buf;
159         }
160       }
161     } while ((bp = bp->next) != NULL);
162 
163     if (b > buf)
164       LogPrintf(lev, buf);
165   }
166 }
167 
168 void
169 LogDumpBuff(int lev, char *hdr, u_char * ptr, int n)
170 {
171   if (LogIsKept(lev)) {
172     char buf[49];
173     char *b;
174     int f;
175 
176     if (hdr && *hdr)
177       LogPrintf(lev, "%s\n", hdr);
178     while (n > 0) {
179       b = buf;
180       for (f = 0; f < 16 && n--; f++, b += 3)
181 	sprintf(b, " %02x", (int) *ptr++);
182       LogPrintf(lev, buf);
183     }
184   }
185 }
186