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