log.c revision 34537
1/*- 2 * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * 26 * $Id: log.c,v 1.25 1998/01/21 02:15:18 brian Exp $ 27 */ 28 29#include <sys/param.h> 30#include <netinet/in.h> 31 32#include <stdarg.h> 33#include <stdio.h> 34#include <string.h> 35#include <syslog.h> 36 37#include "command.h" 38#include "mbuf.h" 39#include "log.h" 40#include "loadalias.h" 41#include "defs.h" 42#include "vars.h" 43 44static const char *LogNames[] = { 45 "Async", 46 "Carrier", 47 "CCP", 48 "Chat", 49 "Command", 50 "Connect", 51 "Debug", 52 "HDLC", 53 "ID0", 54 "IPCP", 55 "LCP", 56 "Link", 57 "LQM", 58 "Phase", 59 "TCP/IP", 60 "Tun", 61 "Warning", 62 "Error", 63 "Alert" 64}; 65 66#define MSK(n) (1<<((n)-1)) 67 68static u_long LogMask = MSK(LogLINK) | MSK(LogCARRIER) | MSK(LogPHASE); 69static u_long LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN); 70static int LogTunno = -1; 71 72static int 73syslogLevel(int lev) 74{ 75 switch (lev) { 76 case LogDEBUG:return LOG_DEBUG; 77 case LogWARN: 78 return LOG_WARNING; 79 case LogERROR: 80 return LOG_ERR; 81 case LogALERT: 82 return LOG_ALERT; 83 } 84 return lev >= LogMIN && lev <= LogMAX ? LOG_INFO : 0; 85} 86 87const char * 88LogName(int id) 89{ 90 return id < LogMIN || id > LogMAX ? "Unknown" : LogNames[id - 1]; 91} 92 93void 94LogKeep(int id) 95{ 96 if (id >= LogMIN && id <= LogMAXCONF) 97 LogMask |= MSK(id); 98} 99 100void 101LogKeepLocal(int id) 102{ 103 if (id >= LogMIN && id <= LogMAXCONF) 104 LogMaskLocal |= MSK(id); 105} 106 107void 108LogDiscard(int id) 109{ 110 if (id >= LogMIN && id <= LogMAXCONF) 111 LogMask &= ~MSK(id); 112} 113 114void 115LogDiscardLocal(int id) 116{ 117 if (id >= LogMIN && id <= LogMAXCONF) 118 LogMaskLocal &= ~MSK(id); 119} 120 121void 122LogDiscardAll() 123{ 124 LogMask = 0; 125} 126 127void 128LogDiscardAllLocal() 129{ 130 LogMaskLocal = 0; 131} 132 133int 134LogIsKept(int id) 135{ 136 if (id < LogMIN || id > LogMAX) 137 return 0; 138 if (id > LogMAXCONF) 139 return LOG_KEPT_LOCAL | LOG_KEPT_SYSLOG; 140 141 return ((LogMaskLocal & MSK(id)) ? LOG_KEPT_LOCAL : 0) | 142 ((LogMask & MSK(id)) ? LOG_KEPT_SYSLOG : 0); 143} 144 145void 146LogOpen(const char *Name) 147{ 148 openlog(Name, LOG_PID, LOG_DAEMON); 149} 150 151void 152LogSetTun(int tunno) 153{ 154 LogTunno = tunno; 155} 156 157void 158LogClose() 159{ 160 closelog(); 161 LogTunno = -1; 162} 163 164void 165LogPrintf(int lev, const char *fmt,...) 166{ 167 va_list ap; 168 169 va_start(ap, fmt); 170 if (LogIsKept(lev)) { 171 static char nfmt[200]; 172 173 if ((LogIsKept(lev) & LOG_KEPT_LOCAL) && VarTerm) { 174 if ((LogIsKept(LogTUN) & LOG_KEPT_LOCAL) && LogTunno != -1) 175 snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s", 176 LogTunno, LogName(lev), fmt); 177 else 178 snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt); 179 vfprintf(VarTerm, nfmt, ap); 180 fflush(VarTerm); 181 } 182 183 if ((LogIsKept(lev) & LOG_KEPT_SYSLOG) && (lev != LogWARN || !VarTerm)) { 184 if ((LogIsKept(LogTUN) & LOG_KEPT_SYSLOG) && LogTunno != -1) 185 snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s", 186 LogTunno, LogName(lev), fmt); 187 else 188 snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt); 189 vsyslog(syslogLevel(lev), nfmt, ap); 190 } 191 } 192 va_end(ap); 193} 194 195void 196LogDumpBp(int lev, const char *hdr, const struct mbuf * bp) 197{ 198 if (LogIsKept(lev)) { 199 char buf[50]; 200 char *b; 201 u_char *ptr; 202 int f; 203 204 if (hdr && *hdr) 205 LogPrintf(lev, "%s\n", hdr); 206 207 b = buf; 208 do { 209 f = bp->cnt; 210 ptr = MBUF_CTOP(bp); 211 while (f--) { 212 sprintf(b, " %02x", (int) *ptr++); 213 b += 3; 214 if (b == buf + sizeof buf - 2) { 215 strcpy(b, "\n"); 216 LogPrintf(lev, buf); 217 b = buf; 218 } 219 } 220 } while ((bp = bp->next) != NULL); 221 222 if (b > buf) { 223 strcpy(b, "\n"); 224 LogPrintf(lev, buf); 225 } 226 } 227} 228 229void 230LogDumpBuff(int lev, const char *hdr, const u_char * ptr, int n) 231{ 232 if (LogIsKept(lev)) { 233 char buf[50]; 234 char *b; 235 236 if (hdr && *hdr) 237 LogPrintf(lev, "%s\n", hdr); 238 while (n > 0) { 239 b = buf; 240 for (b = buf; b != buf + sizeof buf - 2 && n--; b += 3) 241 sprintf(b, " %02x", (int) *ptr++); 242 strcpy(b, "\n"); 243 LogPrintf(lev, buf); 244 } 245 } 246} 247