log.c revision 25445
1/* 2 * PPP logging facility 3 * 4 * Written by Toshiharu OHNO (tony-o@iij.ad.jp) 5 * 6 * Copyright (C) 1993, Internet Initiative Japan, Inc. All rights reserverd. 7 * 8 * Redistribution and use in source and binary forms are permitted 9 * provided that the above copyright notice and this paragraph are 10 * duplicated in all such forms and that any documentation, 11 * advertising materials, and other materials related to such 12 * distribution and use acknowledge that the software was developed 13 * by the Internet Initiative Japan, Inc. The name of the 14 * IIJ may not be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 17 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 18 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 19 * 20 * $Id: log.c,v 1.8 1997/03/13 14:53:53 brian Exp $ 21 * 22 */ 23#include "defs.h" 24#include <time.h> 25#include <netdb.h> 26#ifdef __STDC__ 27#include <stdarg.h> 28#else 29#include <varargs.h> 30#endif 31#ifdef NO_VSPRINTF 32#include <stdio.h> 33#endif 34 35#include "hdlc.h" 36 37#define MAXLOG 70 38 39#define USELOGFILE 40 41#ifdef USELOGFILE 42static FILE *logfile; 43#endif 44static char logbuff[2000]; 45char *logptr; 46static struct mbuf *logtop; 47static struct mbuf *lognext; 48static int logcnt; 49static int mypid; 50 51int loglevel = LOG_LINK_BIT | LOG_CARRIER_BIT | LOG_PHASE_BIT; 52 53void 54ListLog() 55{ 56 struct mbuf *bp; 57 58 for (bp = logtop; bp; bp = bp->next) { 59 write(1, MBUF_CTOP(bp), bp->cnt); 60 usleep(10); 61 } 62} 63 64int 65LogOpen(tunno) 66int tunno; 67{ 68#ifdef USELOGFILE 69 char buf[80]; 70 71 sprintf(buf, LOGFILE, tunno); 72 logfile = fopen(buf, "a"); 73 if (logfile == NULL) { 74 fprintf(stderr, "can't open %s.\r\n", buf); 75 return(1); 76 } 77#endif 78 fprintf(stderr, "Log level is %02x\r\n", loglevel); 79 logptr = logbuff; 80 logcnt = 0; 81 logtop = lognext = NULL; 82 return(0); 83} 84 85void 86LogFlush() 87{ 88 struct mbuf *bp; 89 int cnt; 90 91#ifdef USELOGFILE 92 *logptr = 0; 93 fprintf(logfile, "%s", logbuff); 94 fflush(logfile); 95#endif 96 cnt = logptr - logbuff + 1; 97 bp = mballoc(cnt, MB_LOG); 98 bcopy(logbuff, MBUF_CTOP(bp), cnt); 99 bp->cnt = cnt; 100 if (lognext) { 101 lognext->next = bp; 102 lognext = bp; 103 if (++logcnt > MAXLOG) { 104 logcnt--; 105 logtop = mbfree(logtop); 106 } 107 } else { 108 lognext = logtop = bp; 109 } 110 logptr = logbuff; 111} 112 113void 114DupLog() 115{ 116 mypid = 0; 117#ifdef USELOGFILE 118 dup2(fileno(logfile), 2); 119#endif 120} 121 122void 123LogClose() 124{ 125 LogFlush(); 126#ifdef USELOGFILE 127 fclose(logfile); 128#endif 129 logptr = NULL; 130} 131 132#ifdef NO_VSPRINTF 133void 134vsprintf(buf, fmt, av) 135char *buf; 136char *fmt; 137va_list av; 138{ 139 FILE foo; 140 141 foo._cnt = BUFSIZ; 142 foo._base = foo._ptr = buf; /* may have to cast(unsigned char *) */ 143 foo._flag = _IOWRT+_IOSTRG; 144 (void) _doprnt(fmt, (va_list)av, &foo); 145 *foo._ptr = '\0'; /* plant terminating null character */ 146} 147#endif 148 149static void 150vlogprintf(format, ap) 151char *format; 152va_list ap; 153{ 154 vsnprintf(logptr, sizeof(logbuff)-(logptr-logbuff), format, ap); 155 logptr += strlen(logptr); 156 LogFlush(); 157} 158 159void 160#ifdef __STDC__ 161logprintf(char *format, ...) 162#else 163logprintf(va_alist) 164va_dcl 165#endif 166{ 167 va_list ap; 168#ifdef __STDC__ 169 va_start(ap, format); 170#else 171 char *format; 172 173 va_start(ap); 174 format = va_arg(ap, char *); 175#endif 176 vlogprintf(format, ap); 177 va_end(ap); 178} 179 180void 181LogDumpBp(level, header, bp) 182int level; 183char *header; 184struct mbuf *bp; 185{ 186 u_char *cp; 187 int cnt, loc; 188 189 if (!(loglevel & (1 << level))) 190 return; 191 LogTimeStamp(); 192 snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), "%s\n", header); 193 logptr += strlen(logptr); 194 loc = 0; 195 LogTimeStamp(); 196 while (bp) { 197 cp = MBUF_CTOP(bp); 198 cnt = bp->cnt; 199 while (cnt-- > 0) { 200 snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), " %02x", *cp++); 201 logptr += strlen(logptr); 202 if (++loc == 16) { 203 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