xref: /freebsd/usr.sbin/ppp/log.c (revision c6c740be8b6a3969e38176aa3047ac1b56bc4f67)
1af57ed9fSAtsushi Murai /*
2af57ed9fSAtsushi Murai  *	            PPP logging facility
3af57ed9fSAtsushi Murai  *
4af57ed9fSAtsushi Murai  *	    Written by Toshiharu OHNO (tony-o@iij.ad.jp)
5af57ed9fSAtsushi Murai  *
6af57ed9fSAtsushi Murai  *   Copyright (C) 1993, Internet Initiative Japan, Inc. All rights reserverd.
7af57ed9fSAtsushi Murai  *
8af57ed9fSAtsushi Murai  * Redistribution and use in source and binary forms are permitted
9af57ed9fSAtsushi Murai  * provided that the above copyright notice and this paragraph are
10af57ed9fSAtsushi Murai  * duplicated in all such forms and that any documentation,
11af57ed9fSAtsushi Murai  * advertising materials, and other materials related to such
12af57ed9fSAtsushi Murai  * distribution and use acknowledge that the software was developed
13af57ed9fSAtsushi Murai  * by the Internet Initiative Japan, Inc.  The name of the
14af57ed9fSAtsushi Murai  * IIJ may not be used to endorse or promote products derived
15af57ed9fSAtsushi Murai  * from this software without specific prior written permission.
16af57ed9fSAtsushi Murai  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
17af57ed9fSAtsushi Murai  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
18af57ed9fSAtsushi Murai  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
19af57ed9fSAtsushi Murai  *
20c6c740beSBrian Somers  * $Id: log.c,v 1.7 1997/02/22 16:10:26 peter Exp $
21af57ed9fSAtsushi Murai  *
22af57ed9fSAtsushi Murai  */
23af57ed9fSAtsushi Murai #include "defs.h"
24af57ed9fSAtsushi Murai #include <time.h>
25af57ed9fSAtsushi Murai #include <netdb.h>
2653c9f6c0SAtsushi Murai #ifdef __STDC__
2753c9f6c0SAtsushi Murai #include <stdarg.h>
2853c9f6c0SAtsushi Murai #else
2953c9f6c0SAtsushi Murai #include <varargs.h>
3053c9f6c0SAtsushi Murai #endif
3153c9f6c0SAtsushi Murai #ifdef NO_VSPRINTF
3253c9f6c0SAtsushi Murai #include <stdio.h>
3353c9f6c0SAtsushi Murai #endif
34af57ed9fSAtsushi Murai 
35af57ed9fSAtsushi Murai #include "hdlc.h"
36af57ed9fSAtsushi Murai 
37af57ed9fSAtsushi Murai #define	MAXLOG	70
38af57ed9fSAtsushi Murai 
39af57ed9fSAtsushi Murai #define USELOGFILE
40af57ed9fSAtsushi Murai 
41af57ed9fSAtsushi Murai #ifdef USELOGFILE
42af57ed9fSAtsushi Murai static FILE *logfile;
43af57ed9fSAtsushi Murai #endif
44af57ed9fSAtsushi Murai static char logbuff[2000];
45af57ed9fSAtsushi Murai static char *logptr;
46af57ed9fSAtsushi Murai static struct mbuf *logtop;
47af57ed9fSAtsushi Murai static struct mbuf *lognext;
48af57ed9fSAtsushi Murai static int  logcnt;
49af57ed9fSAtsushi Murai static int  mypid;
50af57ed9fSAtsushi Murai 
519c749ffbSPoul-Henning Kamp int loglevel = LOG_LINK_BIT | LOG_CARRIER_BIT | LOG_PHASE_BIT;
52af57ed9fSAtsushi Murai 
53af57ed9fSAtsushi Murai void
54af57ed9fSAtsushi Murai ListLog()
55af57ed9fSAtsushi Murai {
56af57ed9fSAtsushi Murai   struct mbuf *bp;
57af57ed9fSAtsushi Murai 
58af57ed9fSAtsushi Murai   for (bp = logtop; bp; bp = bp->next) {
59af57ed9fSAtsushi Murai     write(1, MBUF_CTOP(bp), bp->cnt);
60af57ed9fSAtsushi Murai     usleep(10);
61af57ed9fSAtsushi Murai   }
62af57ed9fSAtsushi Murai }
63af57ed9fSAtsushi Murai 
64af57ed9fSAtsushi Murai int
65af57ed9fSAtsushi Murai LogOpen()
66af57ed9fSAtsushi Murai {
67af57ed9fSAtsushi Murai #ifdef USELOGFILE
68af57ed9fSAtsushi Murai   logfile = fopen(LOGFILE, "a");
69af57ed9fSAtsushi Murai   if (logfile == NULL) {
70af57ed9fSAtsushi Murai     fprintf(stderr, "can't open %s.\r\n", LOGFILE);
71af57ed9fSAtsushi Murai     return(1);
72af57ed9fSAtsushi Murai   }
73af57ed9fSAtsushi Murai #endif
74af57ed9fSAtsushi Murai   fprintf(stderr, "Log level is %02x\r\n", loglevel);
75af57ed9fSAtsushi Murai   logptr = logbuff;
76af57ed9fSAtsushi Murai   logcnt = 0;
77af57ed9fSAtsushi Murai   logtop = lognext = NULL;
78af57ed9fSAtsushi Murai   return(0);
79af57ed9fSAtsushi Murai }
80af57ed9fSAtsushi Murai 
81af57ed9fSAtsushi Murai void
82af57ed9fSAtsushi Murai LogFlush()
83af57ed9fSAtsushi Murai {
84af57ed9fSAtsushi Murai   struct mbuf *bp;
85af57ed9fSAtsushi Murai   int cnt;
86af57ed9fSAtsushi Murai 
87af57ed9fSAtsushi Murai #ifdef USELOGFILE
88af57ed9fSAtsushi Murai   *logptr = 0;
89af57ed9fSAtsushi Murai   fprintf(logfile, "%s", logbuff);
90af57ed9fSAtsushi Murai   fflush(logfile);
91af57ed9fSAtsushi Murai #endif
92af57ed9fSAtsushi Murai   cnt = logptr - logbuff + 1;
93af57ed9fSAtsushi Murai   bp = mballoc(cnt, MB_LOG);
94af57ed9fSAtsushi Murai   bcopy(logbuff, MBUF_CTOP(bp), cnt);
95af57ed9fSAtsushi Murai   bp->cnt = cnt;
96af57ed9fSAtsushi Murai   if (lognext) {
97af57ed9fSAtsushi Murai     lognext->next = bp;
98af57ed9fSAtsushi Murai     lognext = bp;
99af57ed9fSAtsushi Murai     if (++logcnt > MAXLOG) {
100af57ed9fSAtsushi Murai       logcnt--;
101af57ed9fSAtsushi Murai       logtop = mbfree(logtop);
102af57ed9fSAtsushi Murai     }
103af57ed9fSAtsushi Murai   } else {
104af57ed9fSAtsushi Murai     lognext = logtop = bp;
105af57ed9fSAtsushi Murai   }
106af57ed9fSAtsushi Murai   logptr = logbuff;
107af57ed9fSAtsushi Murai }
108af57ed9fSAtsushi Murai 
109af57ed9fSAtsushi Murai void
110af57ed9fSAtsushi Murai DupLog()
111af57ed9fSAtsushi Murai {
112af57ed9fSAtsushi Murai   mypid = 0;
113af57ed9fSAtsushi Murai #ifdef USELOGFILE
114af57ed9fSAtsushi Murai   dup2(fileno(logfile), 2);
115af57ed9fSAtsushi Murai #endif
116af57ed9fSAtsushi Murai }
117af57ed9fSAtsushi Murai 
118af57ed9fSAtsushi Murai void
119af57ed9fSAtsushi Murai LogClose()
120af57ed9fSAtsushi Murai {
121af57ed9fSAtsushi Murai   LogFlush();
122af57ed9fSAtsushi Murai #ifdef USELOGFILE
123af57ed9fSAtsushi Murai   fclose(logfile);
124af57ed9fSAtsushi Murai #endif
125af57ed9fSAtsushi Murai }
126af57ed9fSAtsushi Murai 
12753c9f6c0SAtsushi Murai #ifdef NO_VSPRINTF
128af57ed9fSAtsushi Murai void
12953c9f6c0SAtsushi Murai vsprintf(buf, fmt, av)
13053c9f6c0SAtsushi Murai char *buf;
13153c9f6c0SAtsushi Murai char *fmt;
13253c9f6c0SAtsushi Murai va_list av;
133af57ed9fSAtsushi Murai {
13453c9f6c0SAtsushi Murai   FILE foo;
13553c9f6c0SAtsushi Murai 
13653c9f6c0SAtsushi Murai   foo._cnt = BUFSIZ;
13753c9f6c0SAtsushi Murai   foo._base = foo._ptr = buf; /* may have to cast(unsigned char *) */
13853c9f6c0SAtsushi Murai   foo._flag = _IOWRT+_IOSTRG;
13953c9f6c0SAtsushi Murai   (void) _doprnt(fmt, (va_list)av, &foo);
14053c9f6c0SAtsushi Murai   *foo._ptr = '\0'; /* plant terminating null character */
14153c9f6c0SAtsushi Murai }
14253c9f6c0SAtsushi Murai #endif
14353c9f6c0SAtsushi Murai 
14453c9f6c0SAtsushi Murai static void
14553c9f6c0SAtsushi Murai vlogprintf(format, ap)
14653c9f6c0SAtsushi Murai char *format;
14753c9f6c0SAtsushi Murai va_list ap;
14853c9f6c0SAtsushi Murai {
14999c02d39SWarner Losh   vsnprintf(logptr, sizeof(logbuff)-(logptr-logbuff), format, ap);
150af57ed9fSAtsushi Murai   logptr += strlen(logptr);
151af57ed9fSAtsushi Murai   LogFlush();
152af57ed9fSAtsushi Murai }
153af57ed9fSAtsushi Murai 
154af57ed9fSAtsushi Murai void
15553c9f6c0SAtsushi Murai #ifdef __STDC__
15653c9f6c0SAtsushi Murai logprintf(char *format, ...)
15753c9f6c0SAtsushi Murai #else
15853c9f6c0SAtsushi Murai logprintf(va_alist)
15953c9f6c0SAtsushi Murai va_dcl
16053c9f6c0SAtsushi Murai #endif
16153c9f6c0SAtsushi Murai {
16253c9f6c0SAtsushi Murai   va_list ap;
16353c9f6c0SAtsushi Murai #ifdef __STDC__
16453c9f6c0SAtsushi Murai   va_start(ap, format);
16553c9f6c0SAtsushi Murai #else
16653c9f6c0SAtsushi Murai   char *format;
16753c9f6c0SAtsushi Murai 
16853c9f6c0SAtsushi Murai   va_start(ap);
16953c9f6c0SAtsushi Murai   format = va_arg(ap, char *);
17053c9f6c0SAtsushi Murai #endif
17153c9f6c0SAtsushi Murai   vlogprintf(format, ap);
17253c9f6c0SAtsushi Murai   va_end(ap);
17353c9f6c0SAtsushi Murai }
17453c9f6c0SAtsushi Murai 
17553c9f6c0SAtsushi Murai void
176af57ed9fSAtsushi Murai LogDumpBp(level, header, bp)
177af57ed9fSAtsushi Murai int level;
178af57ed9fSAtsushi Murai char *header;
179af57ed9fSAtsushi Murai struct mbuf *bp;
180af57ed9fSAtsushi Murai {
181af57ed9fSAtsushi Murai   u_char *cp;
182af57ed9fSAtsushi Murai   int cnt, loc;
183af57ed9fSAtsushi Murai 
184af57ed9fSAtsushi Murai   if (!(loglevel & (1 << level)))
185af57ed9fSAtsushi Murai     return;
186af57ed9fSAtsushi Murai   LogTimeStamp();
18799c02d39SWarner Losh   snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), "%s\n", header);
188af57ed9fSAtsushi Murai   logptr += strlen(logptr);
189af57ed9fSAtsushi Murai   loc = 0;
190af57ed9fSAtsushi Murai   LogTimeStamp();
191af57ed9fSAtsushi Murai   while (bp) {
192af57ed9fSAtsushi Murai     cp = MBUF_CTOP(bp);
193af57ed9fSAtsushi Murai     cnt = bp->cnt;
194af57ed9fSAtsushi Murai     while (cnt-- > 0) {
19599c02d39SWarner Losh       snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), " %02x", *cp++);
196af57ed9fSAtsushi Murai       logptr += strlen(logptr);
197af57ed9fSAtsushi Murai       if (++loc == 16) {
198af57ed9fSAtsushi Murai 	loc = 0;
199af57ed9fSAtsushi Murai 	*logptr++ = '\n';
200af57ed9fSAtsushi Murai 	if (logptr - logbuff > 1500)
201af57ed9fSAtsushi Murai 	  LogFlush();
202af57ed9fSAtsushi Murai   	if (cnt) LogTimeStamp();
203af57ed9fSAtsushi Murai       }
204af57ed9fSAtsushi Murai     }
205af57ed9fSAtsushi Murai     bp = bp->next;
206af57ed9fSAtsushi Murai   }
207af57ed9fSAtsushi Murai   if (loc) *logptr++ = '\n';
208af57ed9fSAtsushi Murai   LogFlush();
209af57ed9fSAtsushi Murai }
210af57ed9fSAtsushi Murai 
211af57ed9fSAtsushi Murai void
212af57ed9fSAtsushi Murai LogDumpBuff(level, header, ptr, cnt)
213af57ed9fSAtsushi Murai int level;
214af57ed9fSAtsushi Murai char *header;
215af57ed9fSAtsushi Murai u_char *ptr;
216af57ed9fSAtsushi Murai int cnt;
217af57ed9fSAtsushi Murai {
218af57ed9fSAtsushi Murai   int loc;
219af57ed9fSAtsushi Murai 
220af57ed9fSAtsushi Murai   if (cnt < 1) return;
221af57ed9fSAtsushi Murai   if (!(loglevel & (1 << level)))
222af57ed9fSAtsushi Murai     return;
223af57ed9fSAtsushi Murai   LogTimeStamp();
22499c02d39SWarner Losh   snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), "%s\n", header);
225af57ed9fSAtsushi Murai   logptr += strlen(logptr);
226af57ed9fSAtsushi Murai   LogTimeStamp();
227af57ed9fSAtsushi Murai   loc = 0;
228af57ed9fSAtsushi Murai   while (cnt-- > 0) {
22999c02d39SWarner Losh     snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), " %02x", *ptr++);
230af57ed9fSAtsushi Murai     logptr += strlen(logptr);
231af57ed9fSAtsushi Murai     if (++loc == 16) {
232af57ed9fSAtsushi Murai       loc = 0;
233af57ed9fSAtsushi Murai       *logptr++ = '\n';
234af57ed9fSAtsushi Murai       if (cnt) LogTimeStamp();
235af57ed9fSAtsushi Murai     }
236af57ed9fSAtsushi Murai   }
237af57ed9fSAtsushi Murai   if (loc) *logptr++ = '\n';
238af57ed9fSAtsushi Murai   LogFlush();
239af57ed9fSAtsushi Murai }
240af57ed9fSAtsushi Murai 
241af57ed9fSAtsushi Murai void
242af57ed9fSAtsushi Murai LogTimeStamp()
243af57ed9fSAtsushi Murai {
244af57ed9fSAtsushi Murai   struct tm *ptm;
245af57ed9fSAtsushi Murai   time_t ltime;
246af57ed9fSAtsushi Murai 
247af57ed9fSAtsushi Murai   if (mypid == 0)
248af57ed9fSAtsushi Murai     mypid = getpid();
249af57ed9fSAtsushi Murai   ltime = time(0);
250af57ed9fSAtsushi Murai   ptm = localtime(&ltime);
25199c02d39SWarner Losh   snprintf(logptr, sizeof(logbuff)-(logptr-logbuff),
25299c02d39SWarner Losh     "%02d-%02d %02d:%02d:%02d [%d] ",
253af57ed9fSAtsushi Murai     ptm->tm_mon + 1, ptm->tm_mday,
254af57ed9fSAtsushi Murai 	ptm->tm_hour, ptm->tm_min, ptm->tm_sec, mypid);
255af57ed9fSAtsushi Murai   logptr += strlen(logptr);
256af57ed9fSAtsushi Murai }
257af57ed9fSAtsushi Murai 
258af57ed9fSAtsushi Murai void
25953c9f6c0SAtsushi Murai #ifdef __STDC__
26053c9f6c0SAtsushi Murai LogPrintf(int level, char *format, ...)
26153c9f6c0SAtsushi Murai #else
26253c9f6c0SAtsushi Murai LogPrintf(va_alist)
26353c9f6c0SAtsushi Murai va_dcl
26453c9f6c0SAtsushi Murai #endif
26553c9f6c0SAtsushi Murai {
26653c9f6c0SAtsushi Murai   va_list ap;
26753c9f6c0SAtsushi Murai #ifdef __STDC__
26853c9f6c0SAtsushi Murai   va_start(ap, format);
26953c9f6c0SAtsushi Murai #else
270af57ed9fSAtsushi Murai   int level;
271af57ed9fSAtsushi Murai   char *format;
27253c9f6c0SAtsushi Murai 
27353c9f6c0SAtsushi Murai   va_start(ap);
27453c9f6c0SAtsushi Murai   int = va_arg(ap, int);
27553c9f6c0SAtsushi Murai   format = va_arg(ap, char *);
27653c9f6c0SAtsushi Murai #endif
2779c749ffbSPoul-Henning Kamp   if (!(loglevel & level))
278af57ed9fSAtsushi Murai     return;
279af57ed9fSAtsushi Murai   LogTimeStamp();
28053c9f6c0SAtsushi Murai   vlogprintf(format, ap);
28153c9f6c0SAtsushi Murai   va_end(ap);
282af57ed9fSAtsushi Murai }
283c6c740beSBrian Somers 
284c6c740beSBrian Somers void
285c6c740beSBrian Somers LogReOpen( sig )
286c6c740beSBrian Somers int sig;
287c6c740beSBrian Somers {
288c6c740beSBrian Somers   FILE *nlogfile;
289c6c740beSBrian Somers 
290c6c740beSBrian Somers #ifdef USELOGFILE
291c6c740beSBrian Somers   nlogfile = fopen(LOGFILE, "a");
292c6c740beSBrian Somers   if (nlogfile == NULL) {
293c6c740beSBrian Somers     LogPrintf(~0,"can't re-open %s.\r\n", LOGFILE);
294c6c740beSBrian Somers   }
295c6c740beSBrian Somers   else {
296c6c740beSBrian Somers     LogPrintf(~0,"log file closed due to signal %d.\r\n",sig);
297c6c740beSBrian Somers     LogFlush();
298c6c740beSBrian Somers     fclose(logfile);
299c6c740beSBrian Somers     logfile = nlogfile;
300c6c740beSBrian Somers     logptr = logbuff;
301c6c740beSBrian Somers     logcnt = 0;
302c6c740beSBrian Somers     logtop = lognext = NULL;
303c6c740beSBrian Somers     LogPrintf(~0,"log file opened due to signal %d.\r\n",sig);
304c6c740beSBrian Somers   }
305c6c740beSBrian Somers #endif
306c6c740beSBrian Somers   LogFlush();
307c6c740beSBrian Somers }
308