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(&ltime);
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