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 * 20af57ed9fSAtsushi Murai * $Id:$ 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 44af57ed9fSAtsushi Murai static char logbuff[2000]; 45af57ed9fSAtsushi Murai static 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 51af57ed9fSAtsushi Murai int loglevel = (1 << LOG_LCP)| (1 << LOG_PHASE); 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 65af57ed9fSAtsushi Murai LogOpen() 66af57ed9fSAtsushi Murai { 67af57ed9fSAtsushi Murai #ifdef USELOGFILE 68af57ed9fSAtsushi Murai logfile = fopen(LOGFILE, "a"); 69af57ed9fSAtsushi Murai if (logfile == NULL) { 70af57ed9fSAtsushi Murai fprintf(stderr, "can't open %s.\r\n", LOGFILE); 71af57ed9fSAtsushi Murai return(1); 72af57ed9fSAtsushi Murai } 73af57ed9fSAtsushi Murai #endif 74af57ed9fSAtsushi Murai fprintf(stderr, "Log level is %02x\r\n", loglevel); 75af57ed9fSAtsushi Murai logptr = logbuff; 76af57ed9fSAtsushi Murai logcnt = 0; 77af57ed9fSAtsushi Murai logtop = lognext = NULL; 78af57ed9fSAtsushi Murai return(0); 79af57ed9fSAtsushi Murai } 80af57ed9fSAtsushi Murai 81af57ed9fSAtsushi Murai void 82af57ed9fSAtsushi Murai LogFlush() 83af57ed9fSAtsushi Murai { 84af57ed9fSAtsushi Murai struct mbuf *bp; 85af57ed9fSAtsushi Murai int cnt; 86af57ed9fSAtsushi Murai 87af57ed9fSAtsushi Murai #ifdef USELOGFILE 88af57ed9fSAtsushi Murai *logptr = 0; 89af57ed9fSAtsushi Murai fprintf(logfile, "%s", logbuff); 90af57ed9fSAtsushi Murai fflush(logfile); 91af57ed9fSAtsushi Murai #endif 92af57ed9fSAtsushi Murai cnt = logptr - logbuff + 1; 93af57ed9fSAtsushi Murai bp = mballoc(cnt, MB_LOG); 94af57ed9fSAtsushi Murai bcopy(logbuff, MBUF_CTOP(bp), cnt); 95af57ed9fSAtsushi Murai bp->cnt = cnt; 96af57ed9fSAtsushi Murai if (lognext) { 97af57ed9fSAtsushi Murai lognext->next = bp; 98af57ed9fSAtsushi Murai lognext = bp; 99af57ed9fSAtsushi Murai if (++logcnt > MAXLOG) { 100af57ed9fSAtsushi Murai logcnt--; 101af57ed9fSAtsushi Murai logtop = mbfree(logtop); 102af57ed9fSAtsushi Murai } 103af57ed9fSAtsushi Murai } else { 104af57ed9fSAtsushi Murai lognext = logtop = bp; 105af57ed9fSAtsushi Murai } 106af57ed9fSAtsushi Murai logptr = logbuff; 107af57ed9fSAtsushi Murai } 108af57ed9fSAtsushi Murai 109af57ed9fSAtsushi Murai void 110af57ed9fSAtsushi Murai DupLog() 111af57ed9fSAtsushi Murai { 112af57ed9fSAtsushi Murai mypid = 0; 113af57ed9fSAtsushi Murai #ifdef USELOGFILE 114af57ed9fSAtsushi Murai dup2(fileno(logfile), 2); 115af57ed9fSAtsushi Murai #endif 116af57ed9fSAtsushi Murai } 117af57ed9fSAtsushi Murai 118af57ed9fSAtsushi Murai void 119af57ed9fSAtsushi Murai LogClose() 120af57ed9fSAtsushi Murai { 121af57ed9fSAtsushi Murai LogFlush(); 122af57ed9fSAtsushi Murai #ifdef USELOGFILE 123af57ed9fSAtsushi Murai fclose(logfile); 124af57ed9fSAtsushi Murai #endif 125af57ed9fSAtsushi Murai } 126af57ed9fSAtsushi Murai 12753c9f6c0SAtsushi Murai #ifdef NO_VSPRINTF 128af57ed9fSAtsushi Murai void 12953c9f6c0SAtsushi Murai vsprintf(buf, fmt, av) 13053c9f6c0SAtsushi Murai char *buf; 13153c9f6c0SAtsushi Murai char *fmt; 13253c9f6c0SAtsushi Murai va_list av; 133af57ed9fSAtsushi Murai { 13453c9f6c0SAtsushi Murai FILE foo; 13553c9f6c0SAtsushi Murai 13653c9f6c0SAtsushi Murai foo._cnt = BUFSIZ; 13753c9f6c0SAtsushi Murai foo._base = foo._ptr = buf; /* may have to cast(unsigned char *) */ 13853c9f6c0SAtsushi Murai foo._flag = _IOWRT+_IOSTRG; 13953c9f6c0SAtsushi Murai (void) _doprnt(fmt, (va_list)av, &foo); 14053c9f6c0SAtsushi Murai *foo._ptr = '\0'; /* plant terminating null character */ 14153c9f6c0SAtsushi Murai } 14253c9f6c0SAtsushi Murai #endif 14353c9f6c0SAtsushi Murai 14453c9f6c0SAtsushi Murai static void 14553c9f6c0SAtsushi Murai vlogprintf(format, ap) 14653c9f6c0SAtsushi Murai char *format; 14753c9f6c0SAtsushi Murai va_list ap; 14853c9f6c0SAtsushi Murai { 14953c9f6c0SAtsushi Murai vsprintf(logptr, format, ap); 150af57ed9fSAtsushi Murai logptr += strlen(logptr); 151af57ed9fSAtsushi Murai LogFlush(); 152af57ed9fSAtsushi Murai } 153af57ed9fSAtsushi Murai 154af57ed9fSAtsushi Murai void 15553c9f6c0SAtsushi Murai #ifdef __STDC__ 15653c9f6c0SAtsushi Murai logprintf(char *format, ...) 15753c9f6c0SAtsushi Murai #else 15853c9f6c0SAtsushi Murai logprintf(va_alist) 15953c9f6c0SAtsushi Murai va_dcl 16053c9f6c0SAtsushi Murai #endif 16153c9f6c0SAtsushi Murai { 16253c9f6c0SAtsushi Murai va_list ap; 16353c9f6c0SAtsushi Murai #ifdef __STDC__ 16453c9f6c0SAtsushi Murai va_start(ap, format); 16553c9f6c0SAtsushi Murai #else 16653c9f6c0SAtsushi Murai char *format; 16753c9f6c0SAtsushi Murai 16853c9f6c0SAtsushi Murai va_start(ap); 16953c9f6c0SAtsushi Murai format = va_arg(ap, char *); 17053c9f6c0SAtsushi Murai #endif 17153c9f6c0SAtsushi Murai vlogprintf(format, ap); 17253c9f6c0SAtsushi Murai va_end(ap); 17353c9f6c0SAtsushi Murai } 17453c9f6c0SAtsushi Murai 17553c9f6c0SAtsushi Murai void 176af57ed9fSAtsushi Murai LogDumpBp(level, header, bp) 177af57ed9fSAtsushi Murai int level; 178af57ed9fSAtsushi Murai char *header; 179af57ed9fSAtsushi Murai struct mbuf *bp; 180af57ed9fSAtsushi Murai { 181af57ed9fSAtsushi Murai u_char *cp; 182af57ed9fSAtsushi Murai int cnt, loc; 183af57ed9fSAtsushi Murai 184af57ed9fSAtsushi Murai if (!(loglevel & (1 << level))) 185af57ed9fSAtsushi Murai return; 186af57ed9fSAtsushi Murai LogTimeStamp(); 187af57ed9fSAtsushi Murai sprintf(logptr, "%s\n", header); 188af57ed9fSAtsushi Murai logptr += strlen(logptr); 189af57ed9fSAtsushi Murai loc = 0; 190af57ed9fSAtsushi Murai LogTimeStamp(); 191af57ed9fSAtsushi Murai while (bp) { 192af57ed9fSAtsushi Murai cp = MBUF_CTOP(bp); 193af57ed9fSAtsushi Murai cnt = bp->cnt; 194af57ed9fSAtsushi Murai while (cnt-- > 0) { 195af57ed9fSAtsushi Murai sprintf(logptr, " %02x", *cp++); 196af57ed9fSAtsushi Murai logptr += strlen(logptr); 197af57ed9fSAtsushi Murai if (++loc == 16) { 198af57ed9fSAtsushi Murai loc = 0; 199af57ed9fSAtsushi Murai *logptr++ = '\n'; 200af57ed9fSAtsushi Murai if (logptr - logbuff > 1500) 201af57ed9fSAtsushi Murai LogFlush(); 202af57ed9fSAtsushi Murai if (cnt) LogTimeStamp(); 203af57ed9fSAtsushi Murai } 204af57ed9fSAtsushi Murai } 205af57ed9fSAtsushi Murai bp = bp->next; 206af57ed9fSAtsushi Murai } 207af57ed9fSAtsushi Murai if (loc) *logptr++ = '\n'; 208af57ed9fSAtsushi Murai LogFlush(); 209af57ed9fSAtsushi Murai } 210af57ed9fSAtsushi Murai 211af57ed9fSAtsushi Murai void 212af57ed9fSAtsushi Murai LogDumpBuff(level, header, ptr, cnt) 213af57ed9fSAtsushi Murai int level; 214af57ed9fSAtsushi Murai char *header; 215af57ed9fSAtsushi Murai u_char *ptr; 216af57ed9fSAtsushi Murai int cnt; 217af57ed9fSAtsushi Murai { 218af57ed9fSAtsushi Murai int loc; 219af57ed9fSAtsushi Murai 220af57ed9fSAtsushi Murai if (cnt < 1) return; 221af57ed9fSAtsushi Murai if (!(loglevel & (1 << level))) 222af57ed9fSAtsushi Murai return; 223af57ed9fSAtsushi Murai LogTimeStamp(); 224af57ed9fSAtsushi Murai sprintf(logptr, "%s\n", header); 225af57ed9fSAtsushi Murai logptr += strlen(logptr); 226af57ed9fSAtsushi Murai LogTimeStamp(); 227af57ed9fSAtsushi Murai loc = 0; 228af57ed9fSAtsushi Murai while (cnt-- > 0) { 229af57ed9fSAtsushi Murai sprintf(logptr, " %02x", *ptr++); 230af57ed9fSAtsushi Murai logptr += strlen(logptr); 231af57ed9fSAtsushi Murai if (++loc == 16) { 232af57ed9fSAtsushi Murai loc = 0; 233af57ed9fSAtsushi Murai *logptr++ = '\n'; 234af57ed9fSAtsushi Murai if (cnt) LogTimeStamp(); 235af57ed9fSAtsushi Murai } 236af57ed9fSAtsushi Murai } 237af57ed9fSAtsushi Murai if (loc) *logptr++ = '\n'; 238af57ed9fSAtsushi Murai LogFlush(); 239af57ed9fSAtsushi Murai } 240af57ed9fSAtsushi Murai 241af57ed9fSAtsushi Murai void 242af57ed9fSAtsushi Murai LogTimeStamp() 243af57ed9fSAtsushi Murai { 244af57ed9fSAtsushi Murai struct tm *ptm; 245af57ed9fSAtsushi Murai time_t ltime; 246af57ed9fSAtsushi Murai 247af57ed9fSAtsushi Murai if (mypid == 0) 248af57ed9fSAtsushi Murai mypid = getpid(); 249af57ed9fSAtsushi Murai ltime = time(0); 250af57ed9fSAtsushi Murai ptm = localtime(<ime); 251af57ed9fSAtsushi Murai sprintf(logptr, "%02d-%02d %02d:%02d:%02d [%d] ", 252af57ed9fSAtsushi Murai ptm->tm_mon + 1, ptm->tm_mday, 253af57ed9fSAtsushi Murai ptm->tm_hour, ptm->tm_min, ptm->tm_sec, mypid); 254af57ed9fSAtsushi Murai logptr += strlen(logptr); 255af57ed9fSAtsushi Murai } 256af57ed9fSAtsushi Murai 257af57ed9fSAtsushi Murai void 25853c9f6c0SAtsushi Murai #ifdef __STDC__ 25953c9f6c0SAtsushi Murai LogPrintf(int level, char *format, ...) 26053c9f6c0SAtsushi Murai #else 26153c9f6c0SAtsushi Murai LogPrintf(va_alist) 26253c9f6c0SAtsushi Murai va_dcl 26353c9f6c0SAtsushi Murai #endif 26453c9f6c0SAtsushi Murai { 26553c9f6c0SAtsushi Murai va_list ap; 26653c9f6c0SAtsushi Murai #ifdef __STDC__ 26753c9f6c0SAtsushi Murai va_start(ap, format); 26853c9f6c0SAtsushi Murai #else 269af57ed9fSAtsushi Murai int level; 270af57ed9fSAtsushi Murai char *format; 27153c9f6c0SAtsushi Murai 27253c9f6c0SAtsushi Murai va_start(ap); 27353c9f6c0SAtsushi Murai int = va_arg(ap, int); 27453c9f6c0SAtsushi Murai format = va_arg(ap, char *); 27553c9f6c0SAtsushi Murai #endif 276af57ed9fSAtsushi Murai if (!(loglevel & (1 << level))) 277af57ed9fSAtsushi Murai return; 278af57ed9fSAtsushi Murai LogTimeStamp(); 27953c9f6c0SAtsushi Murai vlogprintf(format, ap); 28053c9f6c0SAtsushi Murai va_end(ap); 281af57ed9fSAtsushi Murai } 282