1c39934eaSBrian Somers /*- 2c39934eaSBrian Somers * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org> 3c39934eaSBrian Somers * All rights reserved. 4c39934eaSBrian Somers * 5c39934eaSBrian Somers * Redistribution and use in source and binary forms, with or without 6c39934eaSBrian Somers * modification, are permitted provided that the following conditions 7c39934eaSBrian Somers * are met: 8c39934eaSBrian Somers * 1. Redistributions of source code must retain the above copyright 9c39934eaSBrian Somers * notice, this list of conditions and the following disclaimer. 10c39934eaSBrian Somers * 2. Redistributions in binary form must reproduce the above copyright 11c39934eaSBrian Somers * notice, this list of conditions and the following disclaimer in the 12c39934eaSBrian Somers * documentation and/or other materials provided with the distribution. 13c39934eaSBrian Somers * 14c39934eaSBrian Somers * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15c39934eaSBrian Somers * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16c39934eaSBrian Somers * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17c39934eaSBrian Somers * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18c39934eaSBrian Somers * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19c39934eaSBrian Somers * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20c39934eaSBrian Somers * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21c39934eaSBrian Somers * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22c39934eaSBrian Somers * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23c39934eaSBrian Somers * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24c39934eaSBrian Somers * SUCH DAMAGE. 25c39934eaSBrian Somers * 26c39934eaSBrian Somers * $Id$ 2775240ed1SBrian Somers */ 2875240ed1SBrian Somers 29927145beSBrian Somers #include <sys/param.h> 30927145beSBrian Somers #include <netinet/in.h> 3175240ed1SBrian Somers #include <sys/socket.h> 3275240ed1SBrian Somers 3353c9f6c0SAtsushi Murai #include <stdarg.h> 3453c9f6c0SAtsushi Murai #include <stdio.h> 3575240ed1SBrian Somers #include <syslog.h> 3675240ed1SBrian Somers 37b6e82f33SBrian Somers #include "command.h" 38927145beSBrian Somers #include "mbuf.h" 39927145beSBrian Somers #include "log.h" 40927145beSBrian Somers #include "loadalias.h" 4186e02934SBrian Somers #include "defs.h" 42927145beSBrian Somers #include "vars.h" 43af57ed9fSAtsushi Murai 44b6e82f33SBrian Somers static const char *LogNames[] = { 45927145beSBrian Somers "Async", 46927145beSBrian Somers "Carrier", 47cb611434SBrian Somers "CCP", 48927145beSBrian Somers "Chat", 49927145beSBrian Somers "Command", 50927145beSBrian Somers "Connect", 51927145beSBrian Somers "Debug", 52927145beSBrian Somers "HDLC", 535106c671SBrian Somers "ID0", 54cb611434SBrian Somers "IPCP", 55927145beSBrian Somers "LCP", 56927145beSBrian Somers "Link", 57927145beSBrian Somers "LQM", 58927145beSBrian Somers "Phase", 59927145beSBrian Somers "TCP/IP", 60927145beSBrian Somers "Tun", 61927145beSBrian Somers "Warning", 62927145beSBrian Somers "Error", 63927145beSBrian Somers "Alert" 64927145beSBrian Somers }; 65af57ed9fSAtsushi Murai 66927145beSBrian Somers #define MSK(n) (1<<((n)-1)) 67af57ed9fSAtsushi Murai 68927145beSBrian Somers static u_long LogMask = MSK(LogLINK) | MSK(LogCARRIER) | MSK(LogPHASE); 69a1e8f937SBrian Somers static u_long LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN); 70927145beSBrian Somers static int LogTunno = -1; 71af57ed9fSAtsushi Murai 72927145beSBrian Somers static int 73927145beSBrian Somers syslogLevel(int lev) 74927145beSBrian Somers { 75927145beSBrian Somers switch (lev) { 76927145beSBrian Somers case LogDEBUG:return LOG_DEBUG; 77944f7098SBrian Somers case LogWARN: 78944f7098SBrian Somers return LOG_WARNING; 79944f7098SBrian Somers case LogERROR: 80944f7098SBrian Somers return LOG_ERR; 81944f7098SBrian Somers case LogALERT: 82944f7098SBrian Somers return LOG_ALERT; 83927145beSBrian Somers } 84927145beSBrian Somers return lev >= LogMIN && lev <= LogMAX ? LOG_INFO : 0; 85927145beSBrian Somers } 86af57ed9fSAtsushi Murai 87927145beSBrian Somers const char * 88927145beSBrian Somers LogName(int id) 89927145beSBrian Somers { 90927145beSBrian Somers return id < LogMIN || id > LogMAX ? "Unknown" : LogNames[id - 1]; 91927145beSBrian Somers } 92af57ed9fSAtsushi Murai 93af57ed9fSAtsushi Murai void 94927145beSBrian Somers LogKeep(int id) 95af57ed9fSAtsushi Murai { 96927145beSBrian Somers if (id >= LogMIN && id <= LogMAXCONF) 97927145beSBrian Somers LogMask |= MSK(id); 98af57ed9fSAtsushi Murai } 99927145beSBrian Somers 100927145beSBrian Somers void 101a1e8f937SBrian Somers LogKeepLocal(int id) 102a1e8f937SBrian Somers { 103a1e8f937SBrian Somers if (id >= LogMIN && id <= LogMAXCONF) 104a1e8f937SBrian Somers LogMaskLocal |= MSK(id); 105a1e8f937SBrian Somers } 106a1e8f937SBrian Somers 107a1e8f937SBrian Somers void 108927145beSBrian Somers LogDiscard(int id) 109927145beSBrian Somers { 110927145beSBrian Somers if (id >= LogMIN && id <= LogMAXCONF) 111927145beSBrian Somers LogMask &= ~MSK(id); 112927145beSBrian Somers } 113927145beSBrian Somers 114927145beSBrian Somers void 115a1e8f937SBrian Somers LogDiscardLocal(int id) 116a1e8f937SBrian Somers { 117a1e8f937SBrian Somers if (id >= LogMIN && id <= LogMAXCONF) 118a1e8f937SBrian Somers LogMaskLocal &= ~MSK(id); 119a1e8f937SBrian Somers } 120a1e8f937SBrian Somers 121a1e8f937SBrian Somers void 122927145beSBrian Somers LogDiscardAll() 123927145beSBrian Somers { 124927145beSBrian Somers LogMask = 0; 125af57ed9fSAtsushi Murai } 126af57ed9fSAtsushi Murai 127a1e8f937SBrian Somers void 128a1e8f937SBrian Somers LogDiscardAllLocal() 129a1e8f937SBrian Somers { 130a1e8f937SBrian Somers LogMaskLocal = 0; 131a1e8f937SBrian Somers } 132a1e8f937SBrian Somers 133af57ed9fSAtsushi Murai int 134927145beSBrian Somers LogIsKept(int id) 135af57ed9fSAtsushi Murai { 136a1e8f937SBrian Somers if (id < LogMIN || id > LogMAX) 137927145beSBrian Somers return 0; 138a1e8f937SBrian Somers if (id > LogMAXCONF) 139a1e8f937SBrian Somers return LOG_KEPT_LOCAL | LOG_KEPT_SYSLOG; 140a1e8f937SBrian Somers 141a1e8f937SBrian Somers return ((LogMaskLocal & MSK(id)) ? LOG_KEPT_LOCAL : 0) | 142a1e8f937SBrian Somers ((LogMask & MSK(id)) ? LOG_KEPT_SYSLOG : 0); 143af57ed9fSAtsushi Murai } 144af57ed9fSAtsushi Murai 145af57ed9fSAtsushi Murai void 146927145beSBrian Somers LogOpen(const char *Name) 147af57ed9fSAtsushi Murai { 148927145beSBrian Somers openlog(Name, LOG_PID, LOG_DAEMON); 149af57ed9fSAtsushi Murai } 150af57ed9fSAtsushi Murai 151af57ed9fSAtsushi Murai void 152927145beSBrian Somers LogSetTun(int tunno) 153af57ed9fSAtsushi Murai { 154927145beSBrian Somers LogTunno = tunno; 155af57ed9fSAtsushi Murai } 156af57ed9fSAtsushi Murai 157af57ed9fSAtsushi Murai void 158af57ed9fSAtsushi Murai LogClose() 159af57ed9fSAtsushi Murai { 160927145beSBrian Somers closelog(); 161927145beSBrian Somers LogTunno = -1; 1626ed9fb2fSBrian Somers } 163af57ed9fSAtsushi Murai 164af57ed9fSAtsushi Murai void 165b6e82f33SBrian Somers LogPrintf(int lev, const char *fmt,...) 16653c9f6c0SAtsushi Murai { 16753c9f6c0SAtsushi Murai va_list ap; 168944f7098SBrian Somers 169927145beSBrian Somers va_start(ap, fmt); 170927145beSBrian Somers if (LogIsKept(lev)) { 171927145beSBrian Somers static char nfmt[200]; 17253c9f6c0SAtsushi Murai 173a1e8f937SBrian Somers if ((LogIsKept(lev) & LOG_KEPT_LOCAL) && VarTerm) { 174a1e8f937SBrian Somers if ((LogIsKept(LogTUN) & LOG_KEPT_LOCAL) && LogTunno != -1) 175927145beSBrian Somers snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s", 176927145beSBrian Somers LogTunno, LogName(lev), fmt); 177927145beSBrian Somers else 178927145beSBrian Somers snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt); 179a1e8f937SBrian Somers vfprintf(VarTerm, nfmt, ap); 1803aa7aa46SBrian Somers fflush(VarTerm); 181a1e8f937SBrian Somers } 182a1e8f937SBrian Somers 183a1e8f937SBrian Somers if ((LogIsKept(lev) & LOG_KEPT_SYSLOG) && (lev != LogWARN || !VarTerm)) { 184a1e8f937SBrian Somers if ((LogIsKept(LogTUN) & LOG_KEPT_SYSLOG) && LogTunno != -1) 185a1e8f937SBrian Somers snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s", 186a1e8f937SBrian Somers LogTunno, LogName(lev), fmt); 187a1e8f937SBrian Somers else 188a1e8f937SBrian Somers snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt); 189927145beSBrian Somers vsyslog(syslogLevel(lev), nfmt, ap); 190927145beSBrian Somers } 191a1e8f937SBrian Somers } 19253c9f6c0SAtsushi Murai va_end(ap); 19353c9f6c0SAtsushi Murai } 19453c9f6c0SAtsushi Murai 19553c9f6c0SAtsushi Murai void 196b6e82f33SBrian Somers LogDumpBp(int lev, const char *hdr, const struct mbuf * bp) 197af57ed9fSAtsushi Murai { 198a9e8f807SBrian Somers if (LogIsKept(lev)) { 199a1e8f937SBrian Somers char buf[50]; 200a9e8f807SBrian Somers char *b; 201a9e8f807SBrian Somers u_char *ptr; 202a9e8f807SBrian Somers int f; 203a9e8f807SBrian Somers 204a9e8f807SBrian Somers if (hdr && *hdr) 205a9e8f807SBrian Somers LogPrintf(lev, "%s\n", hdr); 206a9e8f807SBrian Somers 207a9e8f807SBrian Somers b = buf; 208a9e8f807SBrian Somers do { 209a9e8f807SBrian Somers f = bp->cnt; 210a9e8f807SBrian Somers ptr = MBUF_CTOP(bp); 211a9e8f807SBrian Somers while (f--) { 212a9e8f807SBrian Somers sprintf(b, " %02x", (int) *ptr++); 213a9e8f807SBrian Somers b += 3; 214a1e8f937SBrian Somers if (b == buf + sizeof buf - 2) { 215a1e8f937SBrian Somers strcpy(b, "\n"); 216a9e8f807SBrian Somers LogPrintf(lev, buf); 217a9e8f807SBrian Somers b = buf; 218a9e8f807SBrian Somers } 219a9e8f807SBrian Somers } 220a9e8f807SBrian Somers } while ((bp = bp->next) != NULL); 221a9e8f807SBrian Somers 222a1e8f937SBrian Somers if (b > buf) { 223a1e8f937SBrian Somers strcpy(b, "\n"); 224a9e8f807SBrian Somers LogPrintf(lev, buf); 225a9e8f807SBrian Somers } 226af57ed9fSAtsushi Murai } 227a1e8f937SBrian Somers } 228af57ed9fSAtsushi Murai 229af57ed9fSAtsushi Murai void 230b6e82f33SBrian Somers LogDumpBuff(int lev, const char *hdr, const u_char * ptr, int n) 231af57ed9fSAtsushi Murai { 232927145beSBrian Somers if (LogIsKept(lev)) { 233a1e8f937SBrian Somers char buf[50]; 234927145beSBrian Somers char *b; 235af57ed9fSAtsushi Murai 236927145beSBrian Somers if (hdr && *hdr) 237a9e8f807SBrian Somers LogPrintf(lev, "%s\n", hdr); 238927145beSBrian Somers while (n > 0) { 239927145beSBrian Somers b = buf; 240a1e8f937SBrian Somers for (b = buf; b != buf + sizeof(buf) - 2 && n--; b += 3) 241927145beSBrian Somers sprintf(b, " %02x", (int) *ptr++); 242a1e8f937SBrian Somers strcpy(b, "\n"); 243927145beSBrian Somers LogPrintf(lev, buf); 244af57ed9fSAtsushi Murai } 245af57ed9fSAtsushi Murai } 246c6c740beSBrian Somers } 247