log.c revision 31061
1/* 2 * $Id: log.c,v 1.18 1997/11/04 01:17:00 brian Exp $ 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 "ID0", 29 "IPCP", 30 "LCP", 31 "Link", 32 "LQM", 33 "Phase", 34 "TCP/IP", 35 "Tun", 36 "Warning", 37 "Error", 38 "Alert" 39}; 40 41#define MSK(n) (1<<((n)-1)) 42 43static u_long LogMask = MSK(LogLINK) | MSK(LogCARRIER) | MSK(LogPHASE); 44static u_long LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN); 45static int LogTunno = -1; 46 47static int 48syslogLevel(int lev) 49{ 50 switch (lev) { 51 case LogDEBUG:return LOG_DEBUG; 52 case LogWARN: 53 return LOG_WARNING; 54 case LogERROR: 55 return LOG_ERR; 56 case LogALERT: 57 return LOG_ALERT; 58 } 59 return lev >= LogMIN && lev <= LogMAX ? LOG_INFO : 0; 60} 61 62const char * 63LogName(int id) 64{ 65 return id < LogMIN || id > LogMAX ? "Unknown" : LogNames[id - 1]; 66} 67 68void 69LogKeep(int id) 70{ 71 if (id >= LogMIN && id <= LogMAXCONF) 72 LogMask |= MSK(id); 73} 74 75void 76LogKeepLocal(int id) 77{ 78 if (id >= LogMIN && id <= LogMAXCONF) 79 LogMaskLocal |= MSK(id); 80} 81 82void 83LogDiscard(int id) 84{ 85 if (id >= LogMIN && id <= LogMAXCONF) 86 LogMask &= ~MSK(id); 87} 88 89void 90LogDiscardLocal(int id) 91{ 92 if (id >= LogMIN && id <= LogMAXCONF) 93 LogMaskLocal &= ~MSK(id); 94} 95 96void 97LogDiscardAll() 98{ 99 LogMask = 0; 100} 101 102void 103LogDiscardAllLocal() 104{ 105 LogMaskLocal = 0; 106} 107 108int 109LogIsKept(int id) 110{ 111 if (id < LogMIN || id > LogMAX) 112 return 0; 113 if (id > LogMAXCONF) 114 return LOG_KEPT_LOCAL | LOG_KEPT_SYSLOG; 115 116 return ((LogMaskLocal & MSK(id)) ? LOG_KEPT_LOCAL : 0) | 117 ((LogMask & MSK(id)) ? LOG_KEPT_SYSLOG : 0); 118} 119 120void 121LogOpen(const char *Name) 122{ 123 openlog(Name, LOG_PID, LOG_DAEMON); 124} 125 126void 127LogSetTun(int tunno) 128{ 129 LogTunno = tunno; 130} 131 132void 133LogClose() 134{ 135 closelog(); 136 LogTunno = -1; 137} 138 139void 140LogPrintf(int lev, char *fmt,...) 141{ 142 va_list ap; 143 144 va_start(ap, fmt); 145 if (LogIsKept(lev)) { 146 static char nfmt[200]; 147 148 if ((LogIsKept(lev) & LOG_KEPT_LOCAL) && VarTerm) { 149 if ((LogIsKept(LogTUN) & LOG_KEPT_LOCAL) && LogTunno != -1) 150 snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s", 151 LogTunno, LogName(lev), fmt); 152 else 153 snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt); 154 vfprintf(VarTerm, nfmt, ap); 155 } 156 157 if ((LogIsKept(lev) & LOG_KEPT_SYSLOG) && (lev != LogWARN || !VarTerm)) { 158 if ((LogIsKept(LogTUN) & LOG_KEPT_SYSLOG) && LogTunno != -1) 159 snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s", 160 LogTunno, LogName(lev), fmt); 161 else 162 snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt); 163 vsyslog(syslogLevel(lev), nfmt, ap); 164 } 165 } 166 va_end(ap); 167} 168 169void 170LogDumpBp(int lev, char *hdr, struct mbuf * bp) 171{ 172 if (LogIsKept(lev)) { 173 char buf[50]; 174 char *b; 175 u_char *ptr; 176 int f; 177 178 if (hdr && *hdr) 179 LogPrintf(lev, "%s\n", hdr); 180 181 b = buf; 182 do { 183 f = bp->cnt; 184 ptr = MBUF_CTOP(bp); 185 while (f--) { 186 sprintf(b, " %02x", (int) *ptr++); 187 b += 3; 188 if (b == buf + sizeof buf - 2) { 189 strcpy(b, "\n"); 190 LogPrintf(lev, buf); 191 b = buf; 192 } 193 } 194 } while ((bp = bp->next) != NULL); 195 196 if (b > buf) { 197 strcpy(b, "\n"); 198 LogPrintf(lev, buf); 199 } 200 } 201} 202 203void 204LogDumpBuff(int lev, char *hdr, u_char * ptr, int n) 205{ 206 if (LogIsKept(lev)) { 207 char buf[50]; 208 char *b; 209 210 if (hdr && *hdr) 211 LogPrintf(lev, "%s\n", hdr); 212 while (n > 0) { 213 b = buf; 214 for (b = buf; b != buf + sizeof(buf) - 2 && n--; b += 3) 215 sprintf(b, " %02x", (int) *ptr++); 216 strcpy(b, "\n"); 217 LogPrintf(lev, buf); 218 } 219 } 220} 221