log.c revision 8857
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.2 1995/02/26 12:17:38 amurai 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];
45static char *logptr;
46static struct mbuf *logtop;
47static struct mbuf *lognext;
48static int  logcnt;
49static int  mypid;
50
51int loglevel = (1 << LOG_LCP)| (1 << LOG_PHASE);
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()
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
81void
82LogFlush()
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
109void
110DupLog()
111{
112  mypid = 0;
113#ifdef USELOGFILE
114  dup2(fileno(logfile), 2);
115#endif
116}
117
118void
119LogClose()
120{
121  LogFlush();
122#ifdef USELOGFILE
123  fclose(logfile);
124#endif
125}
126
127#ifdef NO_VSPRINTF
128void
129vsprintf(buf, fmt, av)
130char *buf;
131char *fmt;
132va_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
144static void
145vlogprintf(format, ap)
146char *format;
147va_list ap;
148{
149  vsprintf(logptr, format, ap);
150  logptr += strlen(logptr);
151  LogFlush();
152}
153
154void
155#ifdef __STDC__
156logprintf(char *format, ...)
157#else
158logprintf(va_alist)
159va_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
175void
176LogDumpBp(level, header, bp)
177int level;
178char *header;
179struct 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
211void
212LogDumpBuff(level, header, ptr, cnt)
213int level;
214char *header;
215u_char *ptr;
216int 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
241void
242LogTimeStamp()
243{
244  struct tm *ptm;
245  time_t ltime;
246
247  if (mypid == 0)
248    mypid = getpid();
249  ltime = time(0);
250  ptm = localtime(&ltime);
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
257void
258#ifdef __STDC__
259LogPrintf(int level, char *format, ...)
260#else
261LogPrintf(va_alist)
262va_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 & (1 << level)))
277    return;
278  LogTimeStamp();
279  vlogprintf(format, ap);
280  va_end(ap);
281}
282