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