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