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