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