1af57ed9fSAtsushi Murai /* 2af57ed9fSAtsushi Murai * PPP logging facility 3af57ed9fSAtsushi Murai * 4af57ed9fSAtsushi Murai * Written by Toshiharu OHNO (tony-o@iij.ad.jp) 5af57ed9fSAtsushi Murai * 6af57ed9fSAtsushi Murai * Copyright (C) 1993, Internet Initiative Japan, Inc. All rights reserverd. 7af57ed9fSAtsushi Murai * 8af57ed9fSAtsushi Murai * Redistribution and use in source and binary forms are permitted 9af57ed9fSAtsushi Murai * provided that the above copyright notice and this paragraph are 10af57ed9fSAtsushi Murai * duplicated in all such forms and that any documentation, 11af57ed9fSAtsushi Murai * advertising materials, and other materials related to such 12af57ed9fSAtsushi Murai * distribution and use acknowledge that the software was developed 13af57ed9fSAtsushi Murai * by the Internet Initiative Japan, Inc. The name of the 14af57ed9fSAtsushi Murai * IIJ may not be used to endorse or promote products derived 15af57ed9fSAtsushi Murai * from this software without specific prior written permission. 16af57ed9fSAtsushi Murai * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 17af57ed9fSAtsushi Murai * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 18af57ed9fSAtsushi Murai * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 19af57ed9fSAtsushi Murai * 206ed9fb2fSBrian Somers * $Id: log.c,v 1.10 1997/05/07 23:30:48 brian Exp $ 21af57ed9fSAtsushi Murai * 22af57ed9fSAtsushi Murai */ 23af57ed9fSAtsushi Murai #include "defs.h" 24af57ed9fSAtsushi Murai #include <time.h> 25af57ed9fSAtsushi Murai #include <netdb.h> 2653c9f6c0SAtsushi Murai #ifdef __STDC__ 2753c9f6c0SAtsushi Murai #include <stdarg.h> 2853c9f6c0SAtsushi Murai #else 2953c9f6c0SAtsushi Murai #include <varargs.h> 3053c9f6c0SAtsushi Murai #endif 3153c9f6c0SAtsushi Murai #ifdef NO_VSPRINTF 3253c9f6c0SAtsushi Murai #include <stdio.h> 3353c9f6c0SAtsushi Murai #endif 34af57ed9fSAtsushi Murai 35af57ed9fSAtsushi Murai #include "hdlc.h" 36af57ed9fSAtsushi Murai 37af57ed9fSAtsushi Murai #define MAXLOG 70 38af57ed9fSAtsushi Murai 39af57ed9fSAtsushi Murai #define USELOGFILE 40af57ed9fSAtsushi Murai 41af57ed9fSAtsushi Murai #ifdef USELOGFILE 42af57ed9fSAtsushi Murai static FILE *logfile; 43af57ed9fSAtsushi Murai #endif 442f8fcf44SBrian Somers static char logbuff[MAX_MRU*3+(MAX_MRU/16+1)*22+80]; 4563202ff1SAndrey A. Chernov char *logptr; 46af57ed9fSAtsushi Murai static struct mbuf *logtop; 47af57ed9fSAtsushi Murai static struct mbuf *lognext; 48af57ed9fSAtsushi Murai static int logcnt; 49af57ed9fSAtsushi Murai static int mypid; 50af57ed9fSAtsushi Murai 519c749ffbSPoul-Henning Kamp int loglevel = LOG_LINK_BIT | LOG_CARRIER_BIT | LOG_PHASE_BIT; 52af57ed9fSAtsushi Murai 53af57ed9fSAtsushi Murai void 54af57ed9fSAtsushi Murai ListLog() 55af57ed9fSAtsushi Murai { 56af57ed9fSAtsushi Murai struct mbuf *bp; 57af57ed9fSAtsushi Murai 58af57ed9fSAtsushi Murai for (bp = logtop; bp; bp = bp->next) { 59af57ed9fSAtsushi Murai write(1, MBUF_CTOP(bp), bp->cnt); 60af57ed9fSAtsushi Murai usleep(10); 61af57ed9fSAtsushi Murai } 62af57ed9fSAtsushi Murai } 63af57ed9fSAtsushi Murai 64af57ed9fSAtsushi Murai int 6563202ff1SAndrey A. Chernov LogOpen(tunno) 6663202ff1SAndrey A. Chernov int tunno; 67af57ed9fSAtsushi Murai { 68af57ed9fSAtsushi Murai #ifdef USELOGFILE 6963202ff1SAndrey A. Chernov char buf[80]; 7063202ff1SAndrey A. Chernov 7163202ff1SAndrey A. Chernov sprintf(buf, LOGFILE, tunno); 7263202ff1SAndrey A. Chernov logfile = fopen(buf, "a"); 73af57ed9fSAtsushi Murai if (logfile == NULL) { 7463202ff1SAndrey A. Chernov fprintf(stderr, "can't open %s.\r\n", buf); 75af57ed9fSAtsushi Murai return(1); 76af57ed9fSAtsushi Murai } 77af57ed9fSAtsushi Murai #endif 78af57ed9fSAtsushi Murai fprintf(stderr, "Log level is %02x\r\n", loglevel); 79af57ed9fSAtsushi Murai logptr = logbuff; 80af57ed9fSAtsushi Murai logcnt = 0; 81af57ed9fSAtsushi Murai logtop = lognext = NULL; 82af57ed9fSAtsushi Murai return(0); 83af57ed9fSAtsushi Murai } 84af57ed9fSAtsushi Murai 85af57ed9fSAtsushi Murai void 86af57ed9fSAtsushi Murai LogFlush() 87af57ed9fSAtsushi Murai { 88af57ed9fSAtsushi Murai struct mbuf *bp; 89af57ed9fSAtsushi Murai int cnt; 90af57ed9fSAtsushi Murai 91af57ed9fSAtsushi Murai #ifdef USELOGFILE 92af57ed9fSAtsushi Murai *logptr = 0; 93af57ed9fSAtsushi Murai fprintf(logfile, "%s", logbuff); 94af57ed9fSAtsushi Murai fflush(logfile); 95af57ed9fSAtsushi Murai #endif 96af57ed9fSAtsushi Murai cnt = logptr - logbuff + 1; 97af57ed9fSAtsushi Murai bp = mballoc(cnt, MB_LOG); 98af57ed9fSAtsushi Murai bcopy(logbuff, MBUF_CTOP(bp), cnt); 99af57ed9fSAtsushi Murai bp->cnt = cnt; 100af57ed9fSAtsushi Murai if (lognext) { 101af57ed9fSAtsushi Murai lognext->next = bp; 102af57ed9fSAtsushi Murai lognext = bp; 103af57ed9fSAtsushi Murai if (++logcnt > MAXLOG) { 104af57ed9fSAtsushi Murai logcnt--; 105af57ed9fSAtsushi Murai logtop = mbfree(logtop); 106af57ed9fSAtsushi Murai } 107af57ed9fSAtsushi Murai } else { 108af57ed9fSAtsushi Murai lognext = logtop = bp; 109af57ed9fSAtsushi Murai } 110af57ed9fSAtsushi Murai logptr = logbuff; 111af57ed9fSAtsushi Murai } 112af57ed9fSAtsushi Murai 113af57ed9fSAtsushi Murai void 114af57ed9fSAtsushi Murai DupLog() 115af57ed9fSAtsushi Murai { 116af57ed9fSAtsushi Murai mypid = 0; 117af57ed9fSAtsushi Murai #ifdef USELOGFILE 118af57ed9fSAtsushi Murai dup2(fileno(logfile), 2); 119af57ed9fSAtsushi Murai #endif 120af57ed9fSAtsushi Murai } 121af57ed9fSAtsushi Murai 122af57ed9fSAtsushi Murai void 123af57ed9fSAtsushi Murai LogClose() 124af57ed9fSAtsushi Murai { 125af57ed9fSAtsushi Murai LogFlush(); 126af57ed9fSAtsushi Murai #ifdef USELOGFILE 127af57ed9fSAtsushi Murai fclose(logfile); 128af57ed9fSAtsushi Murai #endif 12963202ff1SAndrey A. Chernov logptr = NULL; 130af57ed9fSAtsushi Murai } 131af57ed9fSAtsushi Murai 13253c9f6c0SAtsushi Murai #ifdef NO_VSPRINTF 133af57ed9fSAtsushi Murai void 13453c9f6c0SAtsushi Murai vsprintf(buf, fmt, av) 13553c9f6c0SAtsushi Murai char *buf; 13653c9f6c0SAtsushi Murai char *fmt; 13753c9f6c0SAtsushi Murai va_list av; 138af57ed9fSAtsushi Murai { 13953c9f6c0SAtsushi Murai FILE foo; 14053c9f6c0SAtsushi Murai 14153c9f6c0SAtsushi Murai foo._cnt = BUFSIZ; 14253c9f6c0SAtsushi Murai foo._base = foo._ptr = buf; /* may have to cast(unsigned char *) */ 14353c9f6c0SAtsushi Murai foo._flag = _IOWRT+_IOSTRG; 14453c9f6c0SAtsushi Murai (void) _doprnt(fmt, (va_list)av, &foo); 14553c9f6c0SAtsushi Murai *foo._ptr = '\0'; /* plant terminating null character */ 14653c9f6c0SAtsushi Murai } 14753c9f6c0SAtsushi Murai #endif 14853c9f6c0SAtsushi Murai 14953c9f6c0SAtsushi Murai static void 15053c9f6c0SAtsushi Murai vlogprintf(format, ap) 15153c9f6c0SAtsushi Murai char *format; 15253c9f6c0SAtsushi Murai va_list ap; 15353c9f6c0SAtsushi Murai { 1546ed9fb2fSBrian Somers if (logptr) { 15599c02d39SWarner Losh vsnprintf(logptr, sizeof(logbuff)-(logptr-logbuff), format, ap); 156af57ed9fSAtsushi Murai logptr += strlen(logptr); 157af57ed9fSAtsushi Murai LogFlush(); 158af57ed9fSAtsushi Murai } 1596ed9fb2fSBrian Somers } 160af57ed9fSAtsushi Murai 161af57ed9fSAtsushi Murai void 16253c9f6c0SAtsushi Murai #ifdef __STDC__ 16353c9f6c0SAtsushi Murai logprintf(char *format, ...) 16453c9f6c0SAtsushi Murai #else 16553c9f6c0SAtsushi Murai logprintf(va_alist) 16653c9f6c0SAtsushi Murai va_dcl 16753c9f6c0SAtsushi Murai #endif 16853c9f6c0SAtsushi Murai { 16953c9f6c0SAtsushi Murai va_list ap; 17053c9f6c0SAtsushi Murai #ifdef __STDC__ 17153c9f6c0SAtsushi Murai va_start(ap, format); 17253c9f6c0SAtsushi Murai #else 17353c9f6c0SAtsushi Murai char *format; 17453c9f6c0SAtsushi Murai 17553c9f6c0SAtsushi Murai va_start(ap); 17653c9f6c0SAtsushi Murai format = va_arg(ap, char *); 17753c9f6c0SAtsushi Murai #endif 17853c9f6c0SAtsushi Murai vlogprintf(format, ap); 17953c9f6c0SAtsushi Murai va_end(ap); 18053c9f6c0SAtsushi Murai } 18153c9f6c0SAtsushi Murai 18253c9f6c0SAtsushi Murai void 183af57ed9fSAtsushi Murai LogDumpBp(level, header, bp) 184af57ed9fSAtsushi Murai int level; 185af57ed9fSAtsushi Murai char *header; 186af57ed9fSAtsushi Murai struct mbuf *bp; 187af57ed9fSAtsushi Murai { 188af57ed9fSAtsushi Murai u_char *cp; 189af57ed9fSAtsushi Murai int cnt, loc; 190af57ed9fSAtsushi Murai 191af57ed9fSAtsushi Murai if (!(loglevel & (1 << level))) 192af57ed9fSAtsushi Murai return; 193af57ed9fSAtsushi Murai LogTimeStamp(); 19499c02d39SWarner Losh snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), "%s\n", header); 195af57ed9fSAtsushi Murai logptr += strlen(logptr); 196af57ed9fSAtsushi Murai loc = 0; 197af57ed9fSAtsushi Murai LogTimeStamp(); 198af57ed9fSAtsushi Murai while (bp) { 199af57ed9fSAtsushi Murai cp = MBUF_CTOP(bp); 200af57ed9fSAtsushi Murai cnt = bp->cnt; 201af57ed9fSAtsushi Murai while (cnt-- > 0) { 20299c02d39SWarner Losh snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), " %02x", *cp++); 203af57ed9fSAtsushi Murai logptr += strlen(logptr); 204af57ed9fSAtsushi Murai if (++loc == 16) { 205af57ed9fSAtsushi Murai loc = 0; 206af57ed9fSAtsushi Murai *logptr++ = '\n'; 207af57ed9fSAtsushi Murai if (logptr - logbuff > 1500) 208af57ed9fSAtsushi Murai LogFlush(); 209af57ed9fSAtsushi Murai if (cnt) LogTimeStamp(); 210af57ed9fSAtsushi Murai } 211af57ed9fSAtsushi Murai } 212af57ed9fSAtsushi Murai bp = bp->next; 213af57ed9fSAtsushi Murai } 214af57ed9fSAtsushi Murai if (loc) *logptr++ = '\n'; 215af57ed9fSAtsushi Murai LogFlush(); 216af57ed9fSAtsushi Murai } 217af57ed9fSAtsushi Murai 218af57ed9fSAtsushi Murai void 219af57ed9fSAtsushi Murai LogDumpBuff(level, header, ptr, cnt) 220af57ed9fSAtsushi Murai int level; 221af57ed9fSAtsushi Murai char *header; 222af57ed9fSAtsushi Murai u_char *ptr; 223af57ed9fSAtsushi Murai int cnt; 224af57ed9fSAtsushi Murai { 225af57ed9fSAtsushi Murai int loc; 226af57ed9fSAtsushi Murai 227af57ed9fSAtsushi Murai if (cnt < 1) return; 228af57ed9fSAtsushi Murai if (!(loglevel & (1 << level))) 229af57ed9fSAtsushi Murai return; 230af57ed9fSAtsushi Murai LogTimeStamp(); 23199c02d39SWarner Losh snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), "%s\n", header); 232af57ed9fSAtsushi Murai logptr += strlen(logptr); 233af57ed9fSAtsushi Murai LogTimeStamp(); 234af57ed9fSAtsushi Murai loc = 0; 235af57ed9fSAtsushi Murai while (cnt-- > 0) { 23699c02d39SWarner Losh snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), " %02x", *ptr++); 237af57ed9fSAtsushi Murai logptr += strlen(logptr); 238af57ed9fSAtsushi Murai if (++loc == 16) { 239af57ed9fSAtsushi Murai loc = 0; 240af57ed9fSAtsushi Murai *logptr++ = '\n'; 241af57ed9fSAtsushi Murai if (cnt) LogTimeStamp(); 242af57ed9fSAtsushi Murai } 243af57ed9fSAtsushi Murai } 244af57ed9fSAtsushi Murai if (loc) *logptr++ = '\n'; 245af57ed9fSAtsushi Murai LogFlush(); 246af57ed9fSAtsushi Murai } 247af57ed9fSAtsushi Murai 248af57ed9fSAtsushi Murai void 249af57ed9fSAtsushi Murai LogTimeStamp() 250af57ed9fSAtsushi Murai { 251af57ed9fSAtsushi Murai struct tm *ptm; 252af57ed9fSAtsushi Murai time_t ltime; 253af57ed9fSAtsushi Murai 254af57ed9fSAtsushi Murai if (mypid == 0) 255af57ed9fSAtsushi Murai mypid = getpid(); 256af57ed9fSAtsushi Murai ltime = time(0); 257af57ed9fSAtsushi Murai ptm = localtime(<ime); 25899c02d39SWarner Losh snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), 25999c02d39SWarner Losh "%02d-%02d %02d:%02d:%02d [%d] ", 260af57ed9fSAtsushi Murai ptm->tm_mon + 1, ptm->tm_mday, 261af57ed9fSAtsushi Murai ptm->tm_hour, ptm->tm_min, ptm->tm_sec, mypid); 262af57ed9fSAtsushi Murai logptr += strlen(logptr); 263af57ed9fSAtsushi Murai } 264af57ed9fSAtsushi Murai 265af57ed9fSAtsushi Murai void 26653c9f6c0SAtsushi Murai #ifdef __STDC__ 26753c9f6c0SAtsushi Murai LogPrintf(int level, char *format, ...) 26853c9f6c0SAtsushi Murai #else 26953c9f6c0SAtsushi Murai LogPrintf(va_alist) 27053c9f6c0SAtsushi Murai va_dcl 27153c9f6c0SAtsushi Murai #endif 27253c9f6c0SAtsushi Murai { 27353c9f6c0SAtsushi Murai va_list ap; 27453c9f6c0SAtsushi Murai #ifdef __STDC__ 27553c9f6c0SAtsushi Murai va_start(ap, format); 27653c9f6c0SAtsushi Murai #else 277af57ed9fSAtsushi Murai int level; 278af57ed9fSAtsushi Murai char *format; 27953c9f6c0SAtsushi Murai 28053c9f6c0SAtsushi Murai va_start(ap); 28153c9f6c0SAtsushi Murai int = va_arg(ap, int); 28253c9f6c0SAtsushi Murai format = va_arg(ap, char *); 28353c9f6c0SAtsushi Murai #endif 2849c749ffbSPoul-Henning Kamp if (!(loglevel & level)) 285af57ed9fSAtsushi Murai return; 286af57ed9fSAtsushi Murai LogTimeStamp(); 28753c9f6c0SAtsushi Murai vlogprintf(format, ap); 28853c9f6c0SAtsushi Murai va_end(ap); 289af57ed9fSAtsushi Murai } 290c6c740beSBrian Somers 291c6c740beSBrian Somers void 292c6c740beSBrian Somers LogReOpen( sig ) 293c6c740beSBrian Somers int sig; 294c6c740beSBrian Somers { 295c6c740beSBrian Somers #ifdef USELOGFILE 29663202ff1SAndrey A. Chernov FILE *nlogfile; 29763202ff1SAndrey A. Chernov char buf[80]; 29863202ff1SAndrey A. Chernov 29963202ff1SAndrey A. Chernov sprintf(buf, LOGFILE, tunno); 30063202ff1SAndrey A. Chernov nlogfile = fopen(buf, "a"); 301c6c740beSBrian Somers if (nlogfile == NULL) { 30263202ff1SAndrey A. Chernov LogPrintf(~0,"can't re-open %s.\r\n", buf); 303c6c740beSBrian Somers } 304c6c740beSBrian Somers else { 305c6c740beSBrian Somers LogPrintf(~0,"log file closed due to signal %d.\r\n",sig); 306c6c740beSBrian Somers LogFlush(); 307c6c740beSBrian Somers fclose(logfile); 308c6c740beSBrian Somers logfile = nlogfile; 309c6c740beSBrian Somers logptr = logbuff; 310c6c740beSBrian Somers logcnt = 0; 311c6c740beSBrian Somers logtop = lognext = NULL; 312c6c740beSBrian Somers LogPrintf(~0,"log file opened due to signal %d.\r\n",sig); 313c6c740beSBrian Somers } 314c6c740beSBrian Somers #endif 315c6c740beSBrian Somers LogFlush(); 316c6c740beSBrian Somers } 317