log.c revision 26328
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.11 1997/05/26 00:44:05 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[MAX_MRU*3+(MAX_MRU/16+1)*22+80]; 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 if (!(mode & MODE_DIRECT)) 79 fprintf(stderr, "Log level is %02x\r\n", loglevel); 80 logptr = logbuff; 81 logcnt = 0; 82 logtop = lognext = NULL; 83 return(0); 84} 85 86void 87LogFlush() 88{ 89 struct mbuf *bp; 90 int cnt; 91 92#ifdef USELOGFILE 93 *logptr = 0; 94 fprintf(logfile, "%s", logbuff); 95 fflush(logfile); 96#endif 97 cnt = logptr - logbuff + 1; 98 bp = mballoc(cnt, MB_LOG); 99 bcopy(logbuff, MBUF_CTOP(bp), cnt); 100 bp->cnt = cnt; 101 if (lognext) { 102 lognext->next = bp; 103 lognext = bp; 104 if (++logcnt > MAXLOG) { 105 logcnt--; 106 logtop = mbfree(logtop); 107 } 108 } else { 109 lognext = logtop = bp; 110 } 111 logptr = logbuff; 112} 113 114void 115DupLog() 116{ 117 mypid = 0; 118#ifdef USELOGFILE 119 dup2(fileno(logfile), 2); 120#endif 121} 122 123void 124LogClose() 125{ 126 LogFlush(); 127#ifdef USELOGFILE 128 fclose(logfile); 129#endif 130 logptr = NULL; 131} 132 133#ifdef NO_VSPRINTF 134void 135vsprintf(buf, fmt, av) 136char *buf; 137char *fmt; 138va_list av; 139{ 140 FILE foo; 141 142 foo._cnt = BUFSIZ; 143 foo._base = foo._ptr = buf; /* may have to cast(unsigned char *) */ 144 foo._flag = _IOWRT+_IOSTRG; 145 (void) _doprnt(fmt, (va_list)av, &foo); 146 *foo._ptr = '\0'; /* plant terminating null character */ 147} 148#endif 149 150static void 151vlogprintf(format, ap) 152char *format; 153va_list ap; 154{ 155 if (logptr) { 156 vsnprintf(logptr, sizeof(logbuff)-(logptr-logbuff), format, ap); 157 logptr += strlen(logptr); 158 LogFlush(); 159 } 160} 161 162void 163#ifdef __STDC__ 164logprintf(char *format, ...) 165#else 166logprintf(va_alist) 167va_dcl 168#endif 169{ 170 va_list ap; 171#ifdef __STDC__ 172 va_start(ap, format); 173#else 174 char *format; 175 176 va_start(ap); 177 format = va_arg(ap, char *); 178#endif 179 vlogprintf(format, ap); 180 va_end(ap); 181} 182 183void 184LogDumpBp(level, header, bp) 185int level; 186char *header; 187struct mbuf *bp; 188{ 189 u_char *cp; 190 int cnt, loc; 191 192 if (!(loglevel & (1 << level))) 193 return; 194 LogTimeStamp(); 195 snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), "%s\n", header); 196 logptr += strlen(logptr); 197 loc = 0; 198 LogTimeStamp(); 199 while (bp) { 200 cp = MBUF_CTOP(bp); 201 cnt = bp->cnt; 202 while (cnt-- > 0) { 203 snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), " %02x", *cp++); 204 logptr += strlen(logptr); 205 if (++loc == 16) { 206 loc = 0; 207 *logptr++ = '\n'; 208 if (logptr - logbuff > 1500) 209 LogFlush(); 210 if (cnt) LogTimeStamp(); 211 } 212 } 213 bp = bp->next; 214 } 215 if (loc) *logptr++ = '\n'; 216 LogFlush(); 217} 218 219void 220LogDumpBuff(level, header, ptr, cnt) 221int level; 222char *header; 223u_char *ptr; 224int cnt; 225{ 226 int loc; 227 228 if (cnt < 1) return; 229 if (!(loglevel & (1 << level))) 230 return; 231 LogTimeStamp(); 232 snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), "%s\n", header); 233 logptr += strlen(logptr); 234 LogTimeStamp(); 235 loc = 0; 236 while (cnt-- > 0) { 237 snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), " %02x", *ptr++); 238 logptr += strlen(logptr); 239 if (++loc == 16) { 240 loc = 0; 241 *logptr++ = '\n'; 242 if (cnt) LogTimeStamp(); 243 } 244 } 245 if (loc) *logptr++ = '\n'; 246 LogFlush(); 247} 248 249void 250LogTimeStamp() 251{ 252 struct tm *ptm; 253 time_t ltime; 254 255 if (mypid == 0) 256 mypid = getpid(); 257 ltime = time(0); 258 ptm = localtime(<ime); 259 snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), 260 "%02d-%02d %02d:%02d:%02d [%d] ", 261 ptm->tm_mon + 1, ptm->tm_mday, 262 ptm->tm_hour, ptm->tm_min, ptm->tm_sec, mypid); 263 logptr += strlen(logptr); 264} 265 266void 267#ifdef __STDC__ 268LogPrintf(int level, char *format, ...) 269#else 270LogPrintf(va_alist) 271va_dcl 272#endif 273{ 274 va_list ap; 275#ifdef __STDC__ 276 va_start(ap, format); 277#else 278 int level; 279 char *format; 280 281 va_start(ap); 282 int = va_arg(ap, int); 283 format = va_arg(ap, char *); 284#endif 285 if (!(loglevel & level)) 286 return; 287 LogTimeStamp(); 288 vlogprintf(format, ap); 289 va_end(ap); 290} 291 292void 293LogReOpen( sig ) 294int sig; 295{ 296#ifdef USELOGFILE 297 FILE *nlogfile; 298 char buf[80]; 299 300 sprintf(buf, LOGFILE, tunno); 301 nlogfile = fopen(buf, "a"); 302 if (nlogfile == NULL) { 303 LogPrintf(~0,"can't re-open %s.\r\n", buf); 304 } 305 else { 306 LogPrintf(~0,"log file closed due to signal %d.\r\n",sig); 307 LogFlush(); 308 fclose(logfile); 309 logfile = nlogfile; 310 logptr = logbuff; 311 logcnt = 0; 312 logtop = lognext = NULL; 313 LogPrintf(~0,"log file opened due to signal %d.\r\n",sig); 314 } 315#endif 316 LogFlush(); 317} 318