175240ed1SBrian Somers /* 25106c671SBrian Somers * $Id: log.c,v 1.18 1997/11/04 01:17:00 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", 285106c671SBrian Somers "ID0", 29cb611434SBrian Somers "IPCP", 30927145beSBrian Somers "LCP", 31927145beSBrian Somers "Link", 32927145beSBrian Somers "LQM", 33927145beSBrian Somers "Phase", 34927145beSBrian Somers "TCP/IP", 35927145beSBrian Somers "Tun", 36927145beSBrian Somers "Warning", 37927145beSBrian Somers "Error", 38927145beSBrian Somers "Alert" 39927145beSBrian Somers }; 40af57ed9fSAtsushi Murai 41927145beSBrian Somers #define MSK(n) (1<<((n)-1)) 42af57ed9fSAtsushi Murai 43927145beSBrian Somers static u_long LogMask = MSK(LogLINK) | MSK(LogCARRIER) | MSK(LogPHASE); 44a1e8f937SBrian Somers static u_long LogMaskLocal = MSK(LogERROR) | MSK(LogALERT) | MSK(LogWARN); 45927145beSBrian Somers static int LogTunno = -1; 46af57ed9fSAtsushi Murai 47927145beSBrian Somers static int 48927145beSBrian Somers syslogLevel(int lev) 49927145beSBrian Somers { 50927145beSBrian Somers switch (lev) { 51927145beSBrian Somers case LogDEBUG:return LOG_DEBUG; 52944f7098SBrian Somers case LogWARN: 53944f7098SBrian Somers return LOG_WARNING; 54944f7098SBrian Somers case LogERROR: 55944f7098SBrian Somers return LOG_ERR; 56944f7098SBrian Somers case LogALERT: 57944f7098SBrian Somers return LOG_ALERT; 58927145beSBrian Somers } 59927145beSBrian Somers return lev >= LogMIN && lev <= LogMAX ? LOG_INFO : 0; 60927145beSBrian Somers } 61af57ed9fSAtsushi Murai 62927145beSBrian Somers const char * 63927145beSBrian Somers LogName(int id) 64927145beSBrian Somers { 65927145beSBrian Somers return id < LogMIN || id > LogMAX ? "Unknown" : LogNames[id - 1]; 66927145beSBrian Somers } 67af57ed9fSAtsushi Murai 68af57ed9fSAtsushi Murai void 69927145beSBrian Somers LogKeep(int id) 70af57ed9fSAtsushi Murai { 71927145beSBrian Somers if (id >= LogMIN && id <= LogMAXCONF) 72927145beSBrian Somers LogMask |= MSK(id); 73af57ed9fSAtsushi Murai } 74927145beSBrian Somers 75927145beSBrian Somers void 76a1e8f937SBrian Somers LogKeepLocal(int id) 77a1e8f937SBrian Somers { 78a1e8f937SBrian Somers if (id >= LogMIN && id <= LogMAXCONF) 79a1e8f937SBrian Somers LogMaskLocal |= MSK(id); 80a1e8f937SBrian Somers } 81a1e8f937SBrian Somers 82a1e8f937SBrian Somers void 83927145beSBrian Somers LogDiscard(int id) 84927145beSBrian Somers { 85927145beSBrian Somers if (id >= LogMIN && id <= LogMAXCONF) 86927145beSBrian Somers LogMask &= ~MSK(id); 87927145beSBrian Somers } 88927145beSBrian Somers 89927145beSBrian Somers void 90a1e8f937SBrian Somers LogDiscardLocal(int id) 91a1e8f937SBrian Somers { 92a1e8f937SBrian Somers if (id >= LogMIN && id <= LogMAXCONF) 93a1e8f937SBrian Somers LogMaskLocal &= ~MSK(id); 94a1e8f937SBrian Somers } 95a1e8f937SBrian Somers 96a1e8f937SBrian Somers void 97927145beSBrian Somers LogDiscardAll() 98927145beSBrian Somers { 99927145beSBrian Somers LogMask = 0; 100af57ed9fSAtsushi Murai } 101af57ed9fSAtsushi Murai 102a1e8f937SBrian Somers void 103a1e8f937SBrian Somers LogDiscardAllLocal() 104a1e8f937SBrian Somers { 105a1e8f937SBrian Somers LogMaskLocal = 0; 106a1e8f937SBrian Somers } 107a1e8f937SBrian Somers 108af57ed9fSAtsushi Murai int 109927145beSBrian Somers LogIsKept(int id) 110af57ed9fSAtsushi Murai { 111a1e8f937SBrian Somers if (id < LogMIN || id > LogMAX) 112927145beSBrian Somers return 0; 113a1e8f937SBrian Somers if (id > LogMAXCONF) 114a1e8f937SBrian Somers return LOG_KEPT_LOCAL | LOG_KEPT_SYSLOG; 115a1e8f937SBrian Somers 116a1e8f937SBrian Somers return ((LogMaskLocal & MSK(id)) ? LOG_KEPT_LOCAL : 0) | 117a1e8f937SBrian Somers ((LogMask & MSK(id)) ? LOG_KEPT_SYSLOG : 0); 118af57ed9fSAtsushi Murai } 119af57ed9fSAtsushi Murai 120af57ed9fSAtsushi Murai void 121927145beSBrian Somers LogOpen(const char *Name) 122af57ed9fSAtsushi Murai { 123927145beSBrian Somers openlog(Name, LOG_PID, LOG_DAEMON); 124af57ed9fSAtsushi Murai } 125af57ed9fSAtsushi Murai 126af57ed9fSAtsushi Murai void 127927145beSBrian Somers LogSetTun(int tunno) 128af57ed9fSAtsushi Murai { 129927145beSBrian Somers LogTunno = tunno; 130af57ed9fSAtsushi Murai } 131af57ed9fSAtsushi Murai 132af57ed9fSAtsushi Murai void 133af57ed9fSAtsushi Murai LogClose() 134af57ed9fSAtsushi Murai { 135927145beSBrian Somers closelog(); 136927145beSBrian Somers LogTunno = -1; 1376ed9fb2fSBrian Somers } 138af57ed9fSAtsushi Murai 139af57ed9fSAtsushi Murai void 140927145beSBrian Somers LogPrintf(int lev, char *fmt,...) 14153c9f6c0SAtsushi Murai { 14253c9f6c0SAtsushi Murai va_list ap; 143944f7098SBrian Somers 144927145beSBrian Somers va_start(ap, fmt); 145927145beSBrian Somers if (LogIsKept(lev)) { 146927145beSBrian Somers static char nfmt[200]; 14753c9f6c0SAtsushi Murai 148a1e8f937SBrian Somers if ((LogIsKept(lev) & LOG_KEPT_LOCAL) && VarTerm) { 149a1e8f937SBrian Somers if ((LogIsKept(LogTUN) & LOG_KEPT_LOCAL) && LogTunno != -1) 150927145beSBrian Somers snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s", 151927145beSBrian Somers LogTunno, LogName(lev), fmt); 152927145beSBrian Somers else 153927145beSBrian Somers snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt); 154a1e8f937SBrian Somers vfprintf(VarTerm, nfmt, ap); 155a1e8f937SBrian Somers } 156a1e8f937SBrian Somers 157a1e8f937SBrian Somers if ((LogIsKept(lev) & LOG_KEPT_SYSLOG) && (lev != LogWARN || !VarTerm)) { 158a1e8f937SBrian Somers if ((LogIsKept(LogTUN) & LOG_KEPT_SYSLOG) && LogTunno != -1) 159a1e8f937SBrian Somers snprintf(nfmt, sizeof nfmt, "tun%d: %s: %s", 160a1e8f937SBrian Somers LogTunno, LogName(lev), fmt); 161a1e8f937SBrian Somers else 162a1e8f937SBrian Somers snprintf(nfmt, sizeof nfmt, "%s: %s", LogName(lev), fmt); 163927145beSBrian Somers vsyslog(syslogLevel(lev), nfmt, ap); 164927145beSBrian Somers } 165a1e8f937SBrian Somers } 16653c9f6c0SAtsushi Murai va_end(ap); 16753c9f6c0SAtsushi Murai } 16853c9f6c0SAtsushi Murai 16953c9f6c0SAtsushi Murai void 170927145beSBrian Somers LogDumpBp(int lev, char *hdr, struct mbuf * bp) 171af57ed9fSAtsushi Murai { 172a9e8f807SBrian Somers if (LogIsKept(lev)) { 173a1e8f937SBrian Somers char buf[50]; 174a9e8f807SBrian Somers char *b; 175a9e8f807SBrian Somers u_char *ptr; 176a9e8f807SBrian Somers int f; 177a9e8f807SBrian Somers 178a9e8f807SBrian Somers if (hdr && *hdr) 179a9e8f807SBrian Somers LogPrintf(lev, "%s\n", hdr); 180a9e8f807SBrian Somers 181a9e8f807SBrian Somers b = buf; 182a9e8f807SBrian Somers do { 183a9e8f807SBrian Somers f = bp->cnt; 184a9e8f807SBrian Somers ptr = MBUF_CTOP(bp); 185a9e8f807SBrian Somers while (f--) { 186a9e8f807SBrian Somers sprintf(b, " %02x", (int) *ptr++); 187a9e8f807SBrian Somers b += 3; 188a1e8f937SBrian Somers if (b == buf + sizeof buf - 2) { 189a1e8f937SBrian Somers strcpy(b, "\n"); 190a9e8f807SBrian Somers LogPrintf(lev, buf); 191a9e8f807SBrian Somers b = buf; 192a9e8f807SBrian Somers } 193a9e8f807SBrian Somers } 194a9e8f807SBrian Somers } while ((bp = bp->next) != NULL); 195a9e8f807SBrian Somers 196a1e8f937SBrian Somers if (b > buf) { 197a1e8f937SBrian Somers strcpy(b, "\n"); 198a9e8f807SBrian Somers LogPrintf(lev, buf); 199a9e8f807SBrian Somers } 200af57ed9fSAtsushi Murai } 201a1e8f937SBrian Somers } 202af57ed9fSAtsushi Murai 203af57ed9fSAtsushi Murai void 204927145beSBrian Somers LogDumpBuff(int lev, char *hdr, u_char * ptr, int n) 205af57ed9fSAtsushi Murai { 206927145beSBrian Somers if (LogIsKept(lev)) { 207a1e8f937SBrian Somers char buf[50]; 208927145beSBrian Somers char *b; 209af57ed9fSAtsushi Murai 210927145beSBrian Somers if (hdr && *hdr) 211a9e8f807SBrian Somers LogPrintf(lev, "%s\n", hdr); 212927145beSBrian Somers while (n > 0) { 213927145beSBrian Somers b = buf; 214a1e8f937SBrian Somers for (b = buf; b != buf + sizeof(buf) - 2 && n--; b += 3) 215927145beSBrian Somers sprintf(b, " %02x", (int) *ptr++); 216a1e8f937SBrian Somers strcpy(b, "\n"); 217927145beSBrian Somers LogPrintf(lev, buf); 218af57ed9fSAtsushi Murai } 219af57ed9fSAtsushi Murai } 220c6c740beSBrian Somers } 221