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