log.c revision 25561
1139749Simp/*
252245Smdodd *	            PPP logging facility
352245Smdodd *
452245Smdodd *	    Written by Toshiharu OHNO (tony-o@iij.ad.jp)
552245Smdodd *
652245Smdodd *   Copyright (C) 1993, Internet Initiative Japan, Inc. All rights reserverd.
752245Smdodd *
852245Smdodd * Redistribution and use in source and binary forms are permitted
952245Smdodd * provided that the above copyright notice and this paragraph are
1052245Smdodd * duplicated in all such forms and that any documentation,
1152245Smdodd * advertising materials, and other materials related to such
1252245Smdodd * distribution and use acknowledge that the software was developed
1352245Smdodd * by the Internet Initiative Japan, Inc.  The name of the
1452245Smdodd * IIJ may not be used to endorse or promote products derived
1552245Smdodd * from this software without specific prior written permission.
1652245Smdodd * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
1752245Smdodd * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
1852245Smdodd * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
1952245Smdodd *
2052245Smdodd * $Id: log.c,v 1.9 1997/05/04 02:39:03 ache Exp $
2152245Smdodd *
2252245Smdodd */
2352245Smdodd#include "defs.h"
2452245Smdodd#include <time.h>
2552245Smdodd#include <netdb.h>
2652245Smdodd#ifdef __STDC__
2752245Smdodd#include <stdarg.h>
2852245Smdodd#else
29119418Sobrien#include <varargs.h>
30119418Sobrien#endif
31119418Sobrien#ifdef NO_VSPRINTF
32141586Simp#include <stdio.h>
33141586Simp#endif
3452245Smdodd
3552245Smdodd#include "hdlc.h"
3652245Smdodd
3752245Smdodd#define	MAXLOG	70
3852245Smdodd
3952245Smdodd#define USELOGFILE
4052245Smdodd
4152245Smdodd#ifdef USELOGFILE
4252245Smdoddstatic FILE *logfile;
43141932Simp#endif
4452245Smdoddstatic char logbuff[MAX_MRU*3+(MAX_MRU/16+1)*22+80];
4552245Smdoddchar *logptr;
46149558Simpstatic struct mbuf *logtop;
4752245Smdoddstatic struct mbuf *lognext;
4852245Smdoddstatic int  logcnt;
4952245Smdoddstatic int  mypid;
5052245Smdodd
5152245Smdoddint loglevel = LOG_LINK_BIT | LOG_CARRIER_BIT | LOG_PHASE_BIT;
52149558Simp
5352245Smdoddvoid
54142254SimpListLog()
55142254Simp{
5652245Smdodd  struct mbuf *bp;
5752245Smdodd
5852245Smdodd  for (bp = logtop; bp; bp = bp->next) {
59154391Simp    write(1, MBUF_CTOP(bp), bp->cnt);
6052245Smdodd    usleep(10);
61211764Syongari  }
6252245Smdodd}
6352245Smdodd
64154391Simpint
65154391SimpLogOpen(tunno)
66154391Simpint tunno;
67154391Simp{
68154391Simp#ifdef USELOGFILE
6952245Smdodd  char buf[80];
7052245Smdodd
7152245Smdodd  sprintf(buf, LOGFILE,	tunno);
7252245Smdodd  logfile = fopen(buf, "a");
73141932Simp  if (logfile == NULL) {
7452245Smdodd    fprintf(stderr, "can't open	%s.\r\n", buf);
75141932Simp    return(1);
7664777Snyan  }
77141932Simp#endif
78141932Simp  fprintf(stderr, "Log level is %02x\r\n", loglevel);
79141932Simp  logptr = logbuff;
80141932Simp  logcnt = 0;
81141932Simp  logtop = lognext = NULL;
82141932Simp  return(0);
83141932Simp}
84141932Simp
85141932Simpvoid
86154924SimpLogFlush()
87141932Simp{
88141932Simp  struct mbuf *bp;
89147256Sbrooks  int cnt;
90141932Simp
91141932Simp#ifdef USELOGFILE
92141932Simp  *logptr = 0;
93141932Simp  fprintf(logfile, "%s", logbuff);
94141932Simp  fflush(logfile);
95141932Simp#endif
96141932Simp  cnt = logptr - logbuff + 1;
97141932Simp  bp = mballoc(cnt, MB_LOG);
98141932Simp  bcopy(logbuff, MBUF_CTOP(bp), cnt);
99151551Simp  bp->cnt = cnt;
100141932Simp  if (lognext) {
10152245Smdodd    lognext->next = bp;
10252245Smdodd    lognext = bp;
10352245Smdodd    if (++logcnt > MAXLOG) {
10452245Smdodd      logcnt--;
10552245Smdodd      logtop = mbfree(logtop);
10652245Smdodd    }
107141932Simp  } else {
10852245Smdodd    lognext = logtop = bp;
10952245Smdodd  }
11052245Smdodd  logptr = logbuff;
111141932Simp}
11252245Smdodd
11352245Smdoddvoid
11452245SmdoddDupLog()
11552245Smdodd{
11664777Snyan  mypid = 0;
11752245Smdodd#ifdef USELOGFILE
11852245Smdodd  dup2(fileno(logfile), 2);
11952245Smdodd#endif
12052245Smdodd}
121150957Simp
122151550Simpvoid
123151550SimpLogClose()
124150957Simp{
125151550Simp  LogFlush();
126150957Simp#ifdef USELOGFILE
127150957Simp  fclose(logfile);
128141586Simp#endif
12964777Snyan  logptr = NULL;
13052245Smdodd}
13152245Smdodd
13252245Smdodd#ifdef NO_VSPRINTF
133141586Simpvoid
13452245Smdoddvsprintf(buf, fmt, av)
135141586Simpchar *buf;
136121118Sshibachar *fmt;
137121118Sshibava_list av;
138121118Sshiba{
139121118Sshiba  FILE foo;
140141586Simp
141141932Simp  foo._cnt = BUFSIZ;
14252245Smdodd  foo._base = foo._ptr = buf; /* may have to cast(unsigned char *) */
14352245Smdodd  foo._flag = _IOWRT+_IOSTRG;
14452245Smdodd  (void) _doprnt(fmt, (va_list)av, &foo);
14552247Smdodd  *foo._ptr = '\0'; /* plant terminating null character */
146141586Simp}
14764777Snyan#endif
14852245Smdodd
14952245Smdoddstatic void
15052245Smdoddvlogprintf(format, ap)
151141586Simpchar *format;
15252245Smdoddva_list ap;
15352245Smdodd{
15452245Smdodd  vsnprintf(logptr, sizeof(logbuff)-(logptr-logbuff), format, ap);
15552245Smdodd  logptr += strlen(logptr);
15652245Smdodd  LogFlush();
15752245Smdodd}
15852245Smdodd
15952245Smdoddvoid
16052245Smdodd#ifdef __STDC__
161142254Simplogprintf(char *format, ...)
16252245Smdodd#else
16352245Smdoddlogprintf(va_alist)
16452245Smdoddva_dcl
16552245Smdodd#endif
16652245Smdodd{
167191299Simp  va_list ap;
16852245Smdodd#ifdef __STDC__
169191299Simp  va_start(ap, format);
170191299Simp#else
17164777Snyan  char *format;
172191234Simp
173191234Simp  va_start(ap);
174191234Simp  format = va_arg(ap, char *);
17552245Smdodd#endif
17652245Smdodd  vlogprintf(format, ap);
17752245Smdodd  va_end(ap);
17864777Snyan}
179191234Simp
180191234Simpvoid
181191234SimpLogDumpBp(level, header, bp)
182191234Simpint level;
183191234Simpchar *header;
18464777Snyanstruct mbuf *bp;
18552245Smdodd{
18652245Smdodd  u_char *cp;
18752245Smdodd  int cnt, loc;
18852245Smdodd
18952245Smdodd  if (!(loglevel & (1 << level)))
190141494Simp    return;
19152245Smdodd  LogTimeStamp();
19252245Smdodd  snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), "%s\n", header);
19352245Smdodd  logptr += strlen(logptr);
19452245Smdodd  loc = 0;
19552245Smdodd  LogTimeStamp();
19652245Smdodd  while (bp) {
19752245Smdodd    cp = MBUF_CTOP(bp);
19852245Smdodd    cnt = bp->cnt;
19952245Smdodd    while (cnt-- > 0) {
20052245Smdodd      snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), " %02x", *cp++);
201113506Smdodd      logptr += strlen(logptr);
202113506Smdodd      if (++loc == 16) {
203113506Smdodd	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