175240ed1SBrian Somers /* 2a1e8f937SBrian Somers * $Id: log.c,v 1.17 1997/10/26 01:03:05 brian Exp $ 375240ed1SBrian Somers */ 475240ed1SBrian Somers 5927145beSBrian Somers #include <sys/param.h> 6927145beSBrian Somers #include <netinet/in.h> 775240ed1SBrian Somers #include <sys/socket.h> 875240ed1SBrian Somers 953c9f6c0SAtsushi Murai #include <stdarg.h> 1053c9f6c0SAtsushi Murai #include <stdio.h> 1175240ed1SBrian Somers #include <syslog.h> 1275240ed1SBrian Somers 13927145beSBrian Somers #include "mbuf.h" 14927145beSBrian Somers #include "log.h" 15927145beSBrian Somers #include "loadalias.h" 1675240ed1SBrian Somers #include "command.h" 17927145beSBrian Somers #include "vars.h" 18af57ed9fSAtsushi Murai 19927145beSBrian Somers static char *LogNames[] = { 20927145beSBrian Somers "Async", 21927145beSBrian Somers "Carrier", 22cb611434SBrian Somers "CCP", 23927145beSBrian Somers "Chat", 24927145beSBrian Somers "Command", 25927145beSBrian Somers "Connect", 26927145beSBrian Somers "Debug", 27927145beSBrian Somers "HDLC", 28cb611434SBrian Somers "IPCP", 29927145beSBrian Somers "LCP", 30927145beSBrian Somers "Link", 31927145beSBrian Somers "LQM", 32927145beSBrian Somers "Phase", 33927145beSBrian Somers "TCP/IP", 34927145beSBrian Somers "Tun", 35927145beSBrian Somers "Warning", 36927145beSBrian Somers "Error", 37927145beSBrian Somers "Alert" 38927145beSBrian Somers }; 39af57ed9fSAtsushi Murai 40927145beSBrian Somers #define MSK(n) (1<<((n)-1)) 41af57ed9fSAtsushi Murai 42927145beSBrian Somers static u_long LogMask = MSK(LogLINK) | MSK(LogCARRIER) | MSK(LogPHASE); 43a1e8f937SBrian Somers static u_long LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN); 44927145beSBrian Somers static int LogTunno = -1; 45af57ed9fSAtsushi Murai 46927145beSBrian Somers static int 47927145beSBrian Somers syslogLevel(int lev) 48927145beSBrian Somers { 49927145beSBrian Somers switch (lev) { 50927145beSBrian Somers case LogDEBUG:return LOG_DEBUG; 51944f7098SBrian Somers case LogWARN: 52944f7098SBrian Somers return LOG_WARNING; 53944f7098SBrian Somers case LogERROR: 54944f7098SBrian Somers return LOG_ERR; 55944f7098SBrian Somers case LogALERT: 56944f7098SBrian Somers return LOG_ALERT; 57927145beSBrian Somers } 58927145beSBrian Somers return lev >= LogMIN && lev <= LogMAX ? LOG_INFO : 0; 59927145beSBrian Somers } 60af57ed9fSAtsushi Murai 61927145beSBrian Somers const char * 62927145beSBrian Somers LogName(int id) 63927145beSBrian Somers { 64927145beSBrian Somers return id < LogMIN || id > LogMAX ? "Unknown" : LogNames[id - 1]; 65927145beSBrian Somers } 66af57ed9fSAtsushi Murai 67af57ed9fSAtsushi Murai void 68927145beSBrian Somers LogKeep(int id) 69af57ed9fSAtsushi Murai { 70927145beSBrian Somers if (id >= LogMIN && id <= LogMAXCONF) 71927145beSBrian Somers LogMask |= MSK(id); 72af57ed9fSAtsushi Murai } 73927145beSBrian Somers 74927145beSBrian Somers void 75a1e8f937SBrian Somers LogKeepLocal(int id) 76a1e8f937SBrian Somers { 77a1e8f937SBrian Somers if (id >= LogMIN && id <= LogMAXCONF) 78a1e8f937SBrian Somers LogMaskLocal |= MSK(id); 79a1e8f937SBrian Somers } 80a1e8f937SBrian Somers 81a1e8f937SBrian Somers void 82927145beSBrian Somers LogDiscard(int id) 83927145beSBrian Somers { 84927145beSBrian Somers if (id >= LogMIN && id <= LogMAXCONF) 85927145beSBrian Somers LogMask &= ~MSK(id); 86927145beSBrian Somers } 87927145beSBrian Somers 88927145beSBrian Somers void 89a1e8f937SBrian Somers LogDiscardLocal(int id) 90a1e8f937SBrian Somers { 91a1e8f937SBrian Somers if (id >= LogMIN && id <= LogMAXCONF) 92a1e8f937SBrian Somers LogMaskLocal &= ~MSK(id); 93a1e8f937SBrian Somers } 94a1e8f937SBrian Somers 95a1e8f937SBrian Somers void 96927145beSBrian Somers LogDiscardAll() 97927145beSBrian Somers { 98927145beSBrian Somers LogMask = 0; 99af57ed9fSAtsushi Murai } 100af57ed9fSAtsushi Murai 101a1e8f937SBrian Somers void 102a1e8f937SBrian Somers LogDiscardAllLocal() 103a1e8f937SBrian Somers { 104a1e8f937SBrian Somers LogMaskLocal = 0; 105a1e8f937SBrian Somers } 106a1e8f937SBrian Somers 107af57ed9fSAtsushi Murai int 108927145beSBrian Somers LogIsKept(int id) 109af57ed9fSAtsushi Murai { 110a1e8f937SBrian Somers if (id < LogMIN || id > LogMAX) 111927145beSBrian Somers return 0; 112a1e8f937SBrian Somers if (id > LogMAXCONF) 113a1e8f937SBrian Somers return LOG_KEPT_LOCAL | LOG_KEPT_SYSLOG; 114a1e8f937SBrian Somers 115a1e8f937SBrian Somers return ((LogMaskLocal & MSK(id)) ? LOG_KEPT_LOCAL : 0) | 116a1e8f937SBrian Somers ((LogMask & MSK(id)) ? LOG_KEPT_SYSLOG : 0); 117af57ed9fSAtsushi Murai } 118af57ed9fSAtsushi Murai 119af57ed9fSAtsushi Murai void 120927145beSBrian Somers LogOpen(const char *Name) 121af57ed9fSAtsushi Murai { 122927145beSBrian Somers openlog(Name, LOG_PID, LOG_DAEMON); 123af57ed9fSAtsushi Murai } 124af57ed9fSAtsushi Murai 125af57ed9fSAtsushi Murai void 126927145beSBrian Somers LogSetTun(int tunno) 127af57ed9fSAtsushi Murai { 128927145beSBrian Somers LogTunno = tunno; 129af57ed9fSAtsushi Murai } 130af57ed9fSAtsushi Murai 131af57ed9fSAtsushi Murai void 132af57ed9fSAtsushi Murai LogClose() 133af57ed9fSAtsushi Murai { 134927145beSBrian Somers closelog(); 135927145beSBrian Somers LogTunno = -1; 1366ed9fb2fSBrian Somers } 137af57ed9fSAtsushi Murai 138af57ed9fSAtsushi Murai void 139927145beSBrian Somers LogPrintf(int lev, char *fmt,...) 14053c9f6c0SAtsushi Murai { 14153c9f6c0SAtsushi Murai va_list ap; 142944f7098SBrian Somers 143927145beSBrian Somers va_start(ap, fmt); 144927145beSBrian Somers if (LogIsKept(lev)) { 145927145beSBrian Somers static char nfmt[200]; 14653c9f6c0SAtsushi Murai 147a1e8f937SBrian Somers if ((LogIsKept(lev) & LOG_KEPT_LOCAL) && VarTerm) { 148a1e8f937SBrian Somers if ((LogIsKept(LogTUN) & LOG_KEPT_LOCAL) && LogTunno != -1) 149927145beSBrian Somers snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s", 150927145beSBrian Somers LogTunno, LogName(lev), fmt); 151927145beSBrian Somers else 152927145beSBrian Somers snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt); 153a1e8f937SBrian Somers vfprintf(VarTerm, nfmt, ap); 154a1e8f937SBrian Somers } 155a1e8f937SBrian Somers 156a1e8f937SBrian Somers if ((LogIsKept(lev) & LOG_KEPT_SYSLOG) && (lev != LogWARN || !VarTerm)) { 157a1e8f937SBrian Somers if ((LogIsKept(LogTUN) & LOG_KEPT_SYSLOG) && LogTunno != -1) 158a1e8f937SBrian Somers snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s", 159a1e8f937SBrian Somers LogTunno, LogName(lev), fmt); 160a1e8f937SBrian Somers else 161a1e8f937SBrian Somers snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt); 162927145beSBrian Somers vsyslog(syslogLevel(lev), nfmt, ap); 163927145beSBrian Somers } 164a1e8f937SBrian Somers } 16553c9f6c0SAtsushi Murai va_end(ap); 16653c9f6c0SAtsushi Murai } 16753c9f6c0SAtsushi Murai 16853c9f6c0SAtsushi Murai void 169927145beSBrian Somers LogDumpBp(int lev, char *hdr, struct mbuf * bp) 170af57ed9fSAtsushi Murai { 171a9e8f807SBrian Somers if (LogIsKept(lev)) { 172a1e8f937SBrian Somers char buf[50]; 173a9e8f807SBrian Somers char *b; 174a9e8f807SBrian Somers u_char *ptr; 175a9e8f807SBrian Somers int f; 176a9e8f807SBrian Somers 177a9e8f807SBrian Somers if (hdr && *hdr) 178a9e8f807SBrian Somers LogPrintf(lev, "%s\n", hdr); 179a9e8f807SBrian Somers 180a9e8f807SBrian Somers b = buf; 181a9e8f807SBrian Somers do { 182a9e8f807SBrian Somers f = bp->cnt; 183a9e8f807SBrian Somers ptr = MBUF_CTOP(bp); 184a9e8f807SBrian Somers while (f--) { 185a9e8f807SBrian Somers sprintf(b, " %02x", (int) *ptr++); 186a9e8f807SBrian Somers b += 3; 187a1e8f937SBrian Somers if (b == buf + sizeof buf - 2) { 188a1e8f937SBrian Somers strcpy(b, "\n"); 189a9e8f807SBrian Somers LogPrintf(lev, buf); 190a9e8f807SBrian Somers b = buf; 191a9e8f807SBrian Somers } 192a9e8f807SBrian Somers } 193a9e8f807SBrian Somers } while ((bp = bp->next) != NULL); 194a9e8f807SBrian Somers 195a1e8f937SBrian Somers if (b > buf) { 196a1e8f937SBrian Somers strcpy(b, "\n"); 197a9e8f807SBrian Somers LogPrintf(lev, buf); 198a9e8f807SBrian Somers } 199af57ed9fSAtsushi Murai } 200a1e8f937SBrian Somers } 201af57ed9fSAtsushi Murai 202af57ed9fSAtsushi Murai void 203927145beSBrian Somers LogDumpBuff(int lev, char *hdr, u_char * ptr, int n) 204af57ed9fSAtsushi Murai { 205927145beSBrian Somers if (LogIsKept(lev)) { 206a1e8f937SBrian Somers char buf[50]; 207927145beSBrian Somers char *b; 208af57ed9fSAtsushi Murai 209927145beSBrian Somers if (hdr && *hdr) 210a9e8f807SBrian Somers LogPrintf(lev, "%s\n", hdr); 211927145beSBrian Somers while (n > 0) { 212927145beSBrian Somers b = buf; 213a1e8f937SBrian Somers for (b = buf; b != buf + sizeof(buf) - 2 && n--; b += 3) 214927145beSBrian Somers sprintf(b, " %02x", (int) *ptr++); 215a1e8f937SBrian Somers strcpy(b, "\n"); 216927145beSBrian Somers LogPrintf(lev, buf); 217af57ed9fSAtsushi Murai } 218af57ed9fSAtsushi Murai } 219c6c740beSBrian Somers } 220