log.c revision 25561
1139749Simp/* 252245Smdodd * PPP logging facility 352245Smdodd * 452245Smdodd * Written by Toshiharu OHNO (tony-o@iij.ad.jp) 552245Smdodd * 652245Smdodd * Copyright (C) 1993, Internet Initiative Japan, Inc. All rights reserverd. 752245Smdodd * 852245Smdodd * Redistribution and use in source and binary forms are permitted 952245Smdodd * provided that the above copyright notice and this paragraph are 1052245Smdodd * duplicated in all such forms and that any documentation, 1152245Smdodd * advertising materials, and other materials related to such 1252245Smdodd * distribution and use acknowledge that the software was developed 1352245Smdodd * by the Internet Initiative Japan, Inc. The name of the 1452245Smdodd * IIJ may not be used to endorse or promote products derived 1552245Smdodd * from this software without specific prior written permission. 1652245Smdodd * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 1752245Smdodd * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 1852245Smdodd * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 1952245Smdodd * 2052245Smdodd * $Id: log.c,v 1.9 1997/05/04 02:39:03 ache Exp $ 2152245Smdodd * 2252245Smdodd */ 2352245Smdodd#include "defs.h" 2452245Smdodd#include <time.h> 2552245Smdodd#include <netdb.h> 2652245Smdodd#ifdef __STDC__ 2752245Smdodd#include <stdarg.h> 2852245Smdodd#else 29119418Sobrien#include <varargs.h> 30119418Sobrien#endif 31119418Sobrien#ifdef NO_VSPRINTF 32141586Simp#include <stdio.h> 33141586Simp#endif 3452245Smdodd 3552245Smdodd#include "hdlc.h" 3652245Smdodd 3752245Smdodd#define MAXLOG 70 3852245Smdodd 3952245Smdodd#define USELOGFILE 4052245Smdodd 4152245Smdodd#ifdef USELOGFILE 4252245Smdoddstatic FILE *logfile; 43141932Simp#endif 4452245Smdoddstatic char logbuff[MAX_MRU*3+(MAX_MRU/16+1)*22+80]; 4552245Smdoddchar *logptr; 46149558Simpstatic struct mbuf *logtop; 4752245Smdoddstatic struct mbuf *lognext; 4852245Smdoddstatic int logcnt; 4952245Smdoddstatic int mypid; 5052245Smdodd 5152245Smdoddint loglevel = LOG_LINK_BIT | LOG_CARRIER_BIT | LOG_PHASE_BIT; 52149558Simp 5352245Smdoddvoid 54142254SimpListLog() 55142254Simp{ 5652245Smdodd struct mbuf *bp; 5752245Smdodd 5852245Smdodd for (bp = logtop; bp; bp = bp->next) { 59154391Simp write(1, MBUF_CTOP(bp), bp->cnt); 6052245Smdodd usleep(10); 61211764Syongari } 6252245Smdodd} 6352245Smdodd 64154391Simpint 65154391SimpLogOpen(tunno) 66154391Simpint tunno; 67154391Simp{ 68154391Simp#ifdef USELOGFILE 6952245Smdodd char buf[80]; 7052245Smdodd 7152245Smdodd sprintf(buf, LOGFILE, tunno); 7252245Smdodd logfile = fopen(buf, "a"); 73141932Simp if (logfile == NULL) { 7452245Smdodd fprintf(stderr, "can't open %s.\r\n", buf); 75141932Simp return(1); 7664777Snyan } 77141932Simp#endif 78141932Simp fprintf(stderr, "Log level is %02x\r\n", loglevel); 79141932Simp logptr = logbuff; 80141932Simp logcnt = 0; 81141932Simp logtop = lognext = NULL; 82141932Simp return(0); 83141932Simp} 84141932Simp 85141932Simpvoid 86154924SimpLogFlush() 87141932Simp{ 88141932Simp struct mbuf *bp; 89147256Sbrooks int cnt; 90141932Simp 91141932Simp#ifdef USELOGFILE 92141932Simp *logptr = 0; 93141932Simp fprintf(logfile, "%s", logbuff); 94141932Simp fflush(logfile); 95141932Simp#endif 96141932Simp cnt = logptr - logbuff + 1; 97141932Simp bp = mballoc(cnt, MB_LOG); 98141932Simp bcopy(logbuff, MBUF_CTOP(bp), cnt); 99151551Simp bp->cnt = cnt; 100141932Simp if (lognext) { 10152245Smdodd lognext->next = bp; 10252245Smdodd lognext = bp; 10352245Smdodd if (++logcnt > MAXLOG) { 10452245Smdodd logcnt--; 10552245Smdodd logtop = mbfree(logtop); 10652245Smdodd } 107141932Simp } else { 10852245Smdodd lognext = logtop = bp; 10952245Smdodd } 11052245Smdodd logptr = logbuff; 111141932Simp} 11252245Smdodd 11352245Smdoddvoid 11452245SmdoddDupLog() 11552245Smdodd{ 11664777Snyan mypid = 0; 11752245Smdodd#ifdef USELOGFILE 11852245Smdodd dup2(fileno(logfile), 2); 11952245Smdodd#endif 12052245Smdodd} 121150957Simp 122151550Simpvoid 123151550SimpLogClose() 124150957Simp{ 125151550Simp LogFlush(); 126150957Simp#ifdef USELOGFILE 127150957Simp fclose(logfile); 128141586Simp#endif 12964777Snyan logptr = NULL; 13052245Smdodd} 13152245Smdodd 13252245Smdodd#ifdef NO_VSPRINTF 133141586Simpvoid 13452245Smdoddvsprintf(buf, fmt, av) 135141586Simpchar *buf; 136121118Sshibachar *fmt; 137121118Sshibava_list av; 138121118Sshiba{ 139121118Sshiba FILE foo; 140141586Simp 141141932Simp foo._cnt = BUFSIZ; 14252245Smdodd foo._base = foo._ptr = buf; /* may have to cast(unsigned char *) */ 14352245Smdodd foo._flag = _IOWRT+_IOSTRG; 14452245Smdodd (void) _doprnt(fmt, (va_list)av, &foo); 14552247Smdodd *foo._ptr = '\0'; /* plant terminating null character */ 146141586Simp} 14764777Snyan#endif 14852245Smdodd 14952245Smdoddstatic void 15052245Smdoddvlogprintf(format, ap) 151141586Simpchar *format; 15252245Smdoddva_list ap; 15352245Smdodd{ 15452245Smdodd vsnprintf(logptr, sizeof(logbuff)-(logptr-logbuff), format, ap); 15552245Smdodd logptr += strlen(logptr); 15652245Smdodd LogFlush(); 15752245Smdodd} 15852245Smdodd 15952245Smdoddvoid 16052245Smdodd#ifdef __STDC__ 161142254Simplogprintf(char *format, ...) 16252245Smdodd#else 16352245Smdoddlogprintf(va_alist) 16452245Smdoddva_dcl 16552245Smdodd#endif 16652245Smdodd{ 167191299Simp va_list ap; 16852245Smdodd#ifdef __STDC__ 169191299Simp va_start(ap, format); 170191299Simp#else 17164777Snyan char *format; 172191234Simp 173191234Simp va_start(ap); 174191234Simp format = va_arg(ap, char *); 17552245Smdodd#endif 17652245Smdodd vlogprintf(format, ap); 17752245Smdodd va_end(ap); 17864777Snyan} 179191234Simp 180191234Simpvoid 181191234SimpLogDumpBp(level, header, bp) 182191234Simpint level; 183191234Simpchar *header; 18464777Snyanstruct mbuf *bp; 18552245Smdodd{ 18652245Smdodd u_char *cp; 18752245Smdodd int cnt, loc; 18852245Smdodd 18952245Smdodd if (!(loglevel & (1 << level))) 190141494Simp return; 19152245Smdodd LogTimeStamp(); 19252245Smdodd snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), "%s\n", header); 19352245Smdodd logptr += strlen(logptr); 19452245Smdodd loc = 0; 19552245Smdodd LogTimeStamp(); 19652245Smdodd while (bp) { 19752245Smdodd cp = MBUF_CTOP(bp); 19852245Smdodd cnt = bp->cnt; 19952245Smdodd while (cnt-- > 0) { 20052245Smdodd snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), " %02x", *cp++); 201113506Smdodd logptr += strlen(logptr); 202113506Smdodd if (++loc == 16) { 203113506Smdodd loc = 0; 204 *logptr++ = '\n'; 205 if (logptr - logbuff > 1500) 206 LogFlush(); 207 if (cnt) LogTimeStamp(); 208 } 209 } 210 bp = bp->next; 211 } 212 if (loc) *logptr++ = '\n'; 213 LogFlush(); 214} 215 216void 217LogDumpBuff(level, header, ptr, cnt) 218int level; 219char *header; 220u_char *ptr; 221int cnt; 222{ 223 int loc; 224 225 if (cnt < 1) return; 226 if (!(loglevel & (1 << level))) 227 return; 228 LogTimeStamp(); 229 snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), "%s\n", header); 230 logptr += strlen(logptr); 231 LogTimeStamp(); 232 loc = 0; 233 while (cnt-- > 0) { 234 snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), " %02x", *ptr++); 235 logptr += strlen(logptr); 236 if (++loc == 16) { 237 loc = 0; 238 *logptr++ = '\n'; 239 if (cnt) LogTimeStamp(); 240 } 241 } 242 if (loc) *logptr++ = '\n'; 243 LogFlush(); 244} 245 246void 247LogTimeStamp() 248{ 249 struct tm *ptm; 250 time_t ltime; 251 252 if (mypid == 0) 253 mypid = getpid(); 254 ltime = time(0); 255 ptm = localtime(<ime); 256 snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), 257 "%02d-%02d %02d:%02d:%02d [%d] ", 258 ptm->tm_mon + 1, ptm->tm_mday, 259 ptm->tm_hour, ptm->tm_min, ptm->tm_sec, mypid); 260 logptr += strlen(logptr); 261} 262 263void 264#ifdef __STDC__ 265LogPrintf(int level, char *format, ...) 266#else 267LogPrintf(va_alist) 268va_dcl 269#endif 270{ 271 va_list ap; 272#ifdef __STDC__ 273 va_start(ap, format); 274#else 275 int level; 276 char *format; 277 278 va_start(ap); 279 int = va_arg(ap, int); 280 format = va_arg(ap, char *); 281#endif 282 if (!(loglevel & level)) 283 return; 284 LogTimeStamp(); 285 vlogprintf(format, ap); 286 va_end(ap); 287} 288 289void 290LogReOpen( sig ) 291int sig; 292{ 293#ifdef USELOGFILE 294 FILE *nlogfile; 295 char buf[80]; 296 297 sprintf(buf, LOGFILE, tunno); 298 nlogfile = fopen(buf, "a"); 299 if (nlogfile == NULL) { 300 LogPrintf(~0,"can't re-open %s.\r\n", buf); 301 } 302 else { 303 LogPrintf(~0,"log file closed due to signal %d.\r\n",sig); 304 LogFlush(); 305 fclose(logfile); 306 logfile = nlogfile; 307 logptr = logbuff; 308 logcnt = 0; 309 logtop = lognext = NULL; 310 LogPrintf(~0,"log file opened due to signal %d.\r\n",sig); 311 } 312#endif 313 LogFlush(); 314} 315