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