log.c revision 30715
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 19static 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 42static u_long LogMask = MSK(LogLINK) | MSK(LogCARRIER) | MSK(LogPHASE); 43static int LogTunno = -1; 44 45static int 46syslogLevel(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 60const char * 61LogName(int id) 62{ 63 return id < LogMIN || id > LogMAX ? "Unknown" : LogNames[id - 1]; 64} 65 66void 67LogKeep(int id) 68{ 69 if (id >= LogMIN && id <= LogMAXCONF) 70 LogMask |= MSK(id); 71} 72 73void 74LogDiscard(int id) 75{ 76 if (id >= LogMIN && id <= LogMAXCONF) 77 LogMask &= ~MSK(id); 78} 79 80void 81LogDiscardAll() 82{ 83 LogMask = 0; 84} 85 86int 87LogIsKept(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 96void 97LogOpen(const char *Name) 98{ 99 openlog(Name, LOG_PID, LOG_DAEMON); 100} 101 102void 103LogSetTun(int tunno) 104{ 105 LogTunno = tunno; 106} 107 108void 109LogClose() 110{ 111 closelog(); 112 LogTunno = -1; 113} 114 115void 116LogPrintf(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 137void 138LogDumpBp(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 168void 169LogDumpBuff(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