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