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 * TODO: 23af57ed9fSAtsushi Murai * 24af57ed9fSAtsushi Murai */ 25af57ed9fSAtsushi Murai #include "defs.h" 26af57ed9fSAtsushi Murai #include <time.h> 27af57ed9fSAtsushi Murai #include <netdb.h> 28af57ed9fSAtsushi Murai 29af57ed9fSAtsushi Murai #include "hdlc.h" 30af57ed9fSAtsushi Murai 31af57ed9fSAtsushi Murai #define MAXLOG 70 32af57ed9fSAtsushi Murai 33af57ed9fSAtsushi Murai #define USELOGFILE 34af57ed9fSAtsushi Murai 35af57ed9fSAtsushi Murai #ifdef USELOGFILE 36af57ed9fSAtsushi Murai static FILE *logfile; 37af57ed9fSAtsushi Murai #endif 38af57ed9fSAtsushi Murai static char logbuff[2000]; 39af57ed9fSAtsushi Murai static char *logptr; 40af57ed9fSAtsushi Murai static struct mbuf *logtop; 41af57ed9fSAtsushi Murai static struct mbuf *lognext; 42af57ed9fSAtsushi Murai static int logcnt; 43af57ed9fSAtsushi Murai static int mypid; 44af57ed9fSAtsushi Murai 45af57ed9fSAtsushi Murai int loglevel = (1 << LOG_LCP)| (1 << LOG_PHASE); 46af57ed9fSAtsushi Murai 47af57ed9fSAtsushi Murai void 48af57ed9fSAtsushi Murai ListLog() 49af57ed9fSAtsushi Murai { 50af57ed9fSAtsushi Murai struct mbuf *bp; 51af57ed9fSAtsushi Murai 52af57ed9fSAtsushi Murai for (bp = logtop; bp; bp = bp->next) { 53af57ed9fSAtsushi Murai write(1, MBUF_CTOP(bp), bp->cnt); 54af57ed9fSAtsushi Murai usleep(10); 55af57ed9fSAtsushi Murai } 56af57ed9fSAtsushi Murai } 57af57ed9fSAtsushi Murai 58af57ed9fSAtsushi Murai int 59af57ed9fSAtsushi Murai LogOpen() 60af57ed9fSAtsushi Murai { 61af57ed9fSAtsushi Murai #ifdef USELOGFILE 62af57ed9fSAtsushi Murai logfile = fopen(LOGFILE, "a"); 63af57ed9fSAtsushi Murai if (logfile == NULL) { 64af57ed9fSAtsushi Murai fprintf(stderr, "can't open %s.\r\n", LOGFILE); 65af57ed9fSAtsushi Murai return(1); 66af57ed9fSAtsushi Murai } 67af57ed9fSAtsushi Murai #endif 68af57ed9fSAtsushi Murai fprintf(stderr, "Log level is %02x\r\n", loglevel); 69af57ed9fSAtsushi Murai logptr = logbuff; 70af57ed9fSAtsushi Murai logcnt = 0; 71af57ed9fSAtsushi Murai logtop = lognext = NULL; 72af57ed9fSAtsushi Murai return(0); 73af57ed9fSAtsushi Murai } 74af57ed9fSAtsushi Murai 75af57ed9fSAtsushi Murai void 76af57ed9fSAtsushi Murai LogFlush() 77af57ed9fSAtsushi Murai { 78af57ed9fSAtsushi Murai struct mbuf *bp; 79af57ed9fSAtsushi Murai int cnt; 80af57ed9fSAtsushi Murai 81af57ed9fSAtsushi Murai #ifdef USELOGFILE 82af57ed9fSAtsushi Murai *logptr = 0; 83af57ed9fSAtsushi Murai fprintf(logfile, "%s", logbuff); 84af57ed9fSAtsushi Murai fflush(logfile); 85af57ed9fSAtsushi Murai #endif 86af57ed9fSAtsushi Murai cnt = logptr - logbuff + 1; 87af57ed9fSAtsushi Murai bp = mballoc(cnt, MB_LOG); 88af57ed9fSAtsushi Murai bcopy(logbuff, MBUF_CTOP(bp), cnt); 89af57ed9fSAtsushi Murai bp->cnt = cnt; 90af57ed9fSAtsushi Murai if (lognext) { 91af57ed9fSAtsushi Murai lognext->next = bp; 92af57ed9fSAtsushi Murai lognext = bp; 93af57ed9fSAtsushi Murai if (++logcnt > MAXLOG) { 94af57ed9fSAtsushi Murai logcnt--; 95af57ed9fSAtsushi Murai logtop = mbfree(logtop); 96af57ed9fSAtsushi Murai } 97af57ed9fSAtsushi Murai } else { 98af57ed9fSAtsushi Murai lognext = logtop = bp; 99af57ed9fSAtsushi Murai } 100af57ed9fSAtsushi Murai logptr = logbuff; 101af57ed9fSAtsushi Murai } 102af57ed9fSAtsushi Murai 103af57ed9fSAtsushi Murai void 104af57ed9fSAtsushi Murai DupLog() 105af57ed9fSAtsushi Murai { 106af57ed9fSAtsushi Murai mypid = 0; 107af57ed9fSAtsushi Murai #ifdef USELOGFILE 108af57ed9fSAtsushi Murai dup2(fileno(logfile), 2); 109af57ed9fSAtsushi Murai #endif 110af57ed9fSAtsushi Murai } 111af57ed9fSAtsushi Murai 112af57ed9fSAtsushi Murai void 113af57ed9fSAtsushi Murai LogClose() 114af57ed9fSAtsushi Murai { 115af57ed9fSAtsushi Murai LogFlush(); 116af57ed9fSAtsushi Murai #ifdef USELOGFILE 117af57ed9fSAtsushi Murai fclose(logfile); 118af57ed9fSAtsushi Murai #endif 119af57ed9fSAtsushi Murai } 120af57ed9fSAtsushi Murai 121af57ed9fSAtsushi Murai void 122af57ed9fSAtsushi Murai logprintf(format, arg1, arg2, arg3, arg4, arg5, arg6) 123af57ed9fSAtsushi Murai char *format; 124af57ed9fSAtsushi Murai void *arg1, *arg2, *arg3, *arg4, *arg5, *arg6; 125af57ed9fSAtsushi Murai { 126af57ed9fSAtsushi Murai sprintf(logptr, format, arg1, arg2, arg3, arg4, arg5, arg6); 127af57ed9fSAtsushi Murai logptr += strlen(logptr); 128af57ed9fSAtsushi Murai LogFlush(); 129af57ed9fSAtsushi Murai } 130af57ed9fSAtsushi Murai 131af57ed9fSAtsushi Murai void 132af57ed9fSAtsushi Murai LogDumpBp(level, header, bp) 133af57ed9fSAtsushi Murai int level; 134af57ed9fSAtsushi Murai char *header; 135af57ed9fSAtsushi Murai struct mbuf *bp; 136af57ed9fSAtsushi Murai { 137af57ed9fSAtsushi Murai u_char *cp; 138af57ed9fSAtsushi Murai int cnt, loc; 139af57ed9fSAtsushi Murai 140af57ed9fSAtsushi Murai if (!(loglevel & (1 << level))) 141af57ed9fSAtsushi Murai return; 142af57ed9fSAtsushi Murai LogTimeStamp(); 143af57ed9fSAtsushi Murai sprintf(logptr, "%s\n", header); 144af57ed9fSAtsushi Murai logptr += strlen(logptr); 145af57ed9fSAtsushi Murai loc = 0; 146af57ed9fSAtsushi Murai LogTimeStamp(); 147af57ed9fSAtsushi Murai while (bp) { 148af57ed9fSAtsushi Murai cp = MBUF_CTOP(bp); 149af57ed9fSAtsushi Murai cnt = bp->cnt; 150af57ed9fSAtsushi Murai while (cnt-- > 0) { 151af57ed9fSAtsushi Murai sprintf(logptr, " %02x", *cp++); 152af57ed9fSAtsushi Murai logptr += strlen(logptr); 153af57ed9fSAtsushi Murai if (++loc == 16) { 154af57ed9fSAtsushi Murai loc = 0; 155af57ed9fSAtsushi Murai *logptr++ = '\n'; 156af57ed9fSAtsushi Murai if (logptr - logbuff > 1500) 157af57ed9fSAtsushi Murai LogFlush(); 158af57ed9fSAtsushi Murai if (cnt) LogTimeStamp(); 159af57ed9fSAtsushi Murai } 160af57ed9fSAtsushi Murai } 161af57ed9fSAtsushi Murai bp = bp->next; 162af57ed9fSAtsushi Murai } 163af57ed9fSAtsushi Murai if (loc) *logptr++ = '\n'; 164af57ed9fSAtsushi Murai LogFlush(); 165af57ed9fSAtsushi Murai } 166af57ed9fSAtsushi Murai 167af57ed9fSAtsushi Murai void 168af57ed9fSAtsushi Murai LogDumpBuff(level, header, ptr, cnt) 169af57ed9fSAtsushi Murai int level; 170af57ed9fSAtsushi Murai char *header; 171af57ed9fSAtsushi Murai u_char *ptr; 172af57ed9fSAtsushi Murai int cnt; 173af57ed9fSAtsushi Murai { 174af57ed9fSAtsushi Murai int loc; 175af57ed9fSAtsushi Murai 176af57ed9fSAtsushi Murai if (cnt < 1) return; 177af57ed9fSAtsushi Murai if (!(loglevel & (1 << level))) 178af57ed9fSAtsushi Murai return; 179af57ed9fSAtsushi Murai LogTimeStamp(); 180af57ed9fSAtsushi Murai sprintf(logptr, "%s\n", header); 181af57ed9fSAtsushi Murai logptr += strlen(logptr); 182af57ed9fSAtsushi Murai LogTimeStamp(); 183af57ed9fSAtsushi Murai loc = 0; 184af57ed9fSAtsushi Murai while (cnt-- > 0) { 185af57ed9fSAtsushi Murai sprintf(logptr, " %02x", *ptr++); 186af57ed9fSAtsushi Murai logptr += strlen(logptr); 187af57ed9fSAtsushi Murai if (++loc == 16) { 188af57ed9fSAtsushi Murai loc = 0; 189af57ed9fSAtsushi Murai *logptr++ = '\n'; 190af57ed9fSAtsushi Murai if (cnt) LogTimeStamp(); 191af57ed9fSAtsushi Murai } 192af57ed9fSAtsushi Murai } 193af57ed9fSAtsushi Murai if (loc) *logptr++ = '\n'; 194af57ed9fSAtsushi Murai LogFlush(); 195af57ed9fSAtsushi Murai } 196af57ed9fSAtsushi Murai 197af57ed9fSAtsushi Murai void 198af57ed9fSAtsushi Murai LogTimeStamp() 199af57ed9fSAtsushi Murai { 200af57ed9fSAtsushi Murai struct tm *ptm; 201af57ed9fSAtsushi Murai time_t ltime; 202af57ed9fSAtsushi Murai 203af57ed9fSAtsushi Murai if (mypid == 0) 204af57ed9fSAtsushi Murai mypid = getpid(); 205af57ed9fSAtsushi Murai ltime = time(0); 206af57ed9fSAtsushi Murai ptm = localtime(<ime); 207af57ed9fSAtsushi Murai sprintf(logptr, "%02d-%02d %02d:%02d:%02d [%d] ", 208af57ed9fSAtsushi Murai ptm->tm_mon + 1, ptm->tm_mday, 209af57ed9fSAtsushi Murai ptm->tm_hour, ptm->tm_min, ptm->tm_sec, mypid); 210af57ed9fSAtsushi Murai logptr += strlen(logptr); 211af57ed9fSAtsushi Murai } 212af57ed9fSAtsushi Murai 213af57ed9fSAtsushi Murai void 214af57ed9fSAtsushi Murai LogPrintf(level, format, arg1, arg2, arg3, arg4, arg5, arg6) 215af57ed9fSAtsushi Murai int level; 216af57ed9fSAtsushi Murai char *format; 217af57ed9fSAtsushi Murai void *arg1, *arg2, *arg3, *arg4, *arg5, *arg6; 218af57ed9fSAtsushi Murai { 219af57ed9fSAtsushi Murai if (!(loglevel & (1 << level))) 220af57ed9fSAtsushi Murai return; 221af57ed9fSAtsushi Murai LogTimeStamp(); 222af57ed9fSAtsushi Murai logprintf(format, arg1, arg2, arg3, arg4, arg5, arg6); 223af57ed9fSAtsushi Murai } 224