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.3 1995/05/30 03:50:43 rgrimes 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 vsprintf(logptr, 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 sprintf(logptr, "%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 sprintf(logptr, " %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 sprintf(logptr, "%s\n", header); 225 logptr += strlen(logptr); 226 LogTimeStamp(); 227 loc = 0; 228 while (cnt-- > 0) { 229 sprintf(logptr, " %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 sprintf(logptr, "%02d-%02d %02d:%02d:%02d [%d] ", 252 ptm->tm_mon + 1, ptm->tm_mday, 253 ptm->tm_hour, ptm->tm_min, ptm->tm_sec, mypid); 254 logptr += strlen(logptr); 255 } 256 257 void 258 #ifdef __STDC__ 259 LogPrintf(int level, char *format, ...) 260 #else 261 LogPrintf(va_alist) 262 va_dcl 263 #endif 264 { 265 va_list ap; 266 #ifdef __STDC__ 267 va_start(ap, format); 268 #else 269 int level; 270 char *format; 271 272 va_start(ap); 273 int = va_arg(ap, int); 274 format = va_arg(ap, char *); 275 #endif 276 if (!(loglevel & level)) 277 return; 278 LogTimeStamp(); 279 vlogprintf(format, ap); 280 va_end(ap); 281 } 282