xref: /freebsd/usr.sbin/ppp/log.c (revision 6ed9fb2fc9f80cea3b99dadecf6d0ad21366b279)
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  *
206ed9fb2fSBrian Somers  * $Id: log.c,v 1.10 1997/05/07 23:30:48 brian 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
442f8fcf44SBrian Somers static char logbuff[MAX_MRU*3+(MAX_MRU/16+1)*22+80];
4563202ff1SAndrey A. Chernov 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
6563202ff1SAndrey A. Chernov LogOpen(tunno)
6663202ff1SAndrey A. Chernov int tunno;
67af57ed9fSAtsushi Murai {
68af57ed9fSAtsushi Murai #ifdef USELOGFILE
6963202ff1SAndrey A. Chernov   char buf[80];
7063202ff1SAndrey A. Chernov 
7163202ff1SAndrey A. Chernov   sprintf(buf, LOGFILE,	tunno);
7263202ff1SAndrey A. Chernov   logfile = fopen(buf, "a");
73af57ed9fSAtsushi Murai   if (logfile == NULL) {
7463202ff1SAndrey A. Chernov     fprintf(stderr, "can't open	%s.\r\n", buf);
75af57ed9fSAtsushi Murai     return(1);
76af57ed9fSAtsushi Murai   }
77af57ed9fSAtsushi Murai #endif
78af57ed9fSAtsushi Murai   fprintf(stderr, "Log level is %02x\r\n", loglevel);
79af57ed9fSAtsushi Murai   logptr = logbuff;
80af57ed9fSAtsushi Murai   logcnt = 0;
81af57ed9fSAtsushi Murai   logtop = lognext = NULL;
82af57ed9fSAtsushi Murai   return(0);
83af57ed9fSAtsushi Murai }
84af57ed9fSAtsushi Murai 
85af57ed9fSAtsushi Murai void
86af57ed9fSAtsushi Murai LogFlush()
87af57ed9fSAtsushi Murai {
88af57ed9fSAtsushi Murai   struct mbuf *bp;
89af57ed9fSAtsushi Murai   int cnt;
90af57ed9fSAtsushi Murai 
91af57ed9fSAtsushi Murai #ifdef USELOGFILE
92af57ed9fSAtsushi Murai   *logptr = 0;
93af57ed9fSAtsushi Murai   fprintf(logfile, "%s", logbuff);
94af57ed9fSAtsushi Murai   fflush(logfile);
95af57ed9fSAtsushi Murai #endif
96af57ed9fSAtsushi Murai   cnt = logptr - logbuff + 1;
97af57ed9fSAtsushi Murai   bp = mballoc(cnt, MB_LOG);
98af57ed9fSAtsushi Murai   bcopy(logbuff, MBUF_CTOP(bp), cnt);
99af57ed9fSAtsushi Murai   bp->cnt = cnt;
100af57ed9fSAtsushi Murai   if (lognext) {
101af57ed9fSAtsushi Murai     lognext->next = bp;
102af57ed9fSAtsushi Murai     lognext = bp;
103af57ed9fSAtsushi Murai     if (++logcnt > MAXLOG) {
104af57ed9fSAtsushi Murai       logcnt--;
105af57ed9fSAtsushi Murai       logtop = mbfree(logtop);
106af57ed9fSAtsushi Murai     }
107af57ed9fSAtsushi Murai   } else {
108af57ed9fSAtsushi Murai     lognext = logtop = bp;
109af57ed9fSAtsushi Murai   }
110af57ed9fSAtsushi Murai   logptr = logbuff;
111af57ed9fSAtsushi Murai }
112af57ed9fSAtsushi Murai 
113af57ed9fSAtsushi Murai void
114af57ed9fSAtsushi Murai DupLog()
115af57ed9fSAtsushi Murai {
116af57ed9fSAtsushi Murai   mypid = 0;
117af57ed9fSAtsushi Murai #ifdef USELOGFILE
118af57ed9fSAtsushi Murai   dup2(fileno(logfile), 2);
119af57ed9fSAtsushi Murai #endif
120af57ed9fSAtsushi Murai }
121af57ed9fSAtsushi Murai 
122af57ed9fSAtsushi Murai void
123af57ed9fSAtsushi Murai LogClose()
124af57ed9fSAtsushi Murai {
125af57ed9fSAtsushi Murai   LogFlush();
126af57ed9fSAtsushi Murai #ifdef USELOGFILE
127af57ed9fSAtsushi Murai   fclose(logfile);
128af57ed9fSAtsushi Murai #endif
12963202ff1SAndrey A. Chernov   logptr = NULL;
130af57ed9fSAtsushi Murai }
131af57ed9fSAtsushi Murai 
13253c9f6c0SAtsushi Murai #ifdef NO_VSPRINTF
133af57ed9fSAtsushi Murai void
13453c9f6c0SAtsushi Murai vsprintf(buf, fmt, av)
13553c9f6c0SAtsushi Murai char *buf;
13653c9f6c0SAtsushi Murai char *fmt;
13753c9f6c0SAtsushi Murai va_list av;
138af57ed9fSAtsushi Murai {
13953c9f6c0SAtsushi Murai   FILE foo;
14053c9f6c0SAtsushi Murai 
14153c9f6c0SAtsushi Murai   foo._cnt = BUFSIZ;
14253c9f6c0SAtsushi Murai   foo._base = foo._ptr = buf; /* may have to cast(unsigned char *) */
14353c9f6c0SAtsushi Murai   foo._flag = _IOWRT+_IOSTRG;
14453c9f6c0SAtsushi Murai   (void) _doprnt(fmt, (va_list)av, &foo);
14553c9f6c0SAtsushi Murai   *foo._ptr = '\0'; /* plant terminating null character */
14653c9f6c0SAtsushi Murai }
14753c9f6c0SAtsushi Murai #endif
14853c9f6c0SAtsushi Murai 
14953c9f6c0SAtsushi Murai static void
15053c9f6c0SAtsushi Murai vlogprintf(format, ap)
15153c9f6c0SAtsushi Murai char *format;
15253c9f6c0SAtsushi Murai va_list ap;
15353c9f6c0SAtsushi Murai {
1546ed9fb2fSBrian Somers   if (logptr) {
15599c02d39SWarner Losh     vsnprintf(logptr, sizeof(logbuff)-(logptr-logbuff), format, ap);
156af57ed9fSAtsushi Murai     logptr += strlen(logptr);
157af57ed9fSAtsushi Murai     LogFlush();
158af57ed9fSAtsushi Murai   }
1596ed9fb2fSBrian Somers }
160af57ed9fSAtsushi Murai 
161af57ed9fSAtsushi Murai void
16253c9f6c0SAtsushi Murai #ifdef __STDC__
16353c9f6c0SAtsushi Murai logprintf(char *format, ...)
16453c9f6c0SAtsushi Murai #else
16553c9f6c0SAtsushi Murai logprintf(va_alist)
16653c9f6c0SAtsushi Murai va_dcl
16753c9f6c0SAtsushi Murai #endif
16853c9f6c0SAtsushi Murai {
16953c9f6c0SAtsushi Murai   va_list ap;
17053c9f6c0SAtsushi Murai #ifdef __STDC__
17153c9f6c0SAtsushi Murai   va_start(ap, format);
17253c9f6c0SAtsushi Murai #else
17353c9f6c0SAtsushi Murai   char *format;
17453c9f6c0SAtsushi Murai 
17553c9f6c0SAtsushi Murai   va_start(ap);
17653c9f6c0SAtsushi Murai   format = va_arg(ap, char *);
17753c9f6c0SAtsushi Murai #endif
17853c9f6c0SAtsushi Murai   vlogprintf(format, ap);
17953c9f6c0SAtsushi Murai   va_end(ap);
18053c9f6c0SAtsushi Murai }
18153c9f6c0SAtsushi Murai 
18253c9f6c0SAtsushi Murai void
183af57ed9fSAtsushi Murai LogDumpBp(level, header, bp)
184af57ed9fSAtsushi Murai int level;
185af57ed9fSAtsushi Murai char *header;
186af57ed9fSAtsushi Murai struct mbuf *bp;
187af57ed9fSAtsushi Murai {
188af57ed9fSAtsushi Murai   u_char *cp;
189af57ed9fSAtsushi Murai   int cnt, loc;
190af57ed9fSAtsushi Murai 
191af57ed9fSAtsushi Murai   if (!(loglevel & (1 << level)))
192af57ed9fSAtsushi Murai     return;
193af57ed9fSAtsushi Murai   LogTimeStamp();
19499c02d39SWarner Losh   snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), "%s\n", header);
195af57ed9fSAtsushi Murai   logptr += strlen(logptr);
196af57ed9fSAtsushi Murai   loc = 0;
197af57ed9fSAtsushi Murai   LogTimeStamp();
198af57ed9fSAtsushi Murai   while (bp) {
199af57ed9fSAtsushi Murai     cp = MBUF_CTOP(bp);
200af57ed9fSAtsushi Murai     cnt = bp->cnt;
201af57ed9fSAtsushi Murai     while (cnt-- > 0) {
20299c02d39SWarner Losh       snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), " %02x", *cp++);
203af57ed9fSAtsushi Murai       logptr += strlen(logptr);
204af57ed9fSAtsushi Murai       if (++loc == 16) {
205af57ed9fSAtsushi Murai 	loc = 0;
206af57ed9fSAtsushi Murai 	*logptr++ = '\n';
207af57ed9fSAtsushi Murai 	if (logptr - logbuff > 1500)
208af57ed9fSAtsushi Murai 	  LogFlush();
209af57ed9fSAtsushi Murai   	if (cnt) LogTimeStamp();
210af57ed9fSAtsushi Murai       }
211af57ed9fSAtsushi Murai     }
212af57ed9fSAtsushi Murai     bp = bp->next;
213af57ed9fSAtsushi Murai   }
214af57ed9fSAtsushi Murai   if (loc) *logptr++ = '\n';
215af57ed9fSAtsushi Murai   LogFlush();
216af57ed9fSAtsushi Murai }
217af57ed9fSAtsushi Murai 
218af57ed9fSAtsushi Murai void
219af57ed9fSAtsushi Murai LogDumpBuff(level, header, ptr, cnt)
220af57ed9fSAtsushi Murai int level;
221af57ed9fSAtsushi Murai char *header;
222af57ed9fSAtsushi Murai u_char *ptr;
223af57ed9fSAtsushi Murai int cnt;
224af57ed9fSAtsushi Murai {
225af57ed9fSAtsushi Murai   int loc;
226af57ed9fSAtsushi Murai 
227af57ed9fSAtsushi Murai   if (cnt < 1) return;
228af57ed9fSAtsushi Murai   if (!(loglevel & (1 << level)))
229af57ed9fSAtsushi Murai     return;
230af57ed9fSAtsushi Murai   LogTimeStamp();
23199c02d39SWarner Losh   snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), "%s\n", header);
232af57ed9fSAtsushi Murai   logptr += strlen(logptr);
233af57ed9fSAtsushi Murai   LogTimeStamp();
234af57ed9fSAtsushi Murai   loc = 0;
235af57ed9fSAtsushi Murai   while (cnt-- > 0) {
23699c02d39SWarner Losh     snprintf(logptr, sizeof(logbuff)-(logptr-logbuff), " %02x", *ptr++);
237af57ed9fSAtsushi Murai     logptr += strlen(logptr);
238af57ed9fSAtsushi Murai     if (++loc == 16) {
239af57ed9fSAtsushi Murai       loc = 0;
240af57ed9fSAtsushi Murai       *logptr++ = '\n';
241af57ed9fSAtsushi Murai       if (cnt) LogTimeStamp();
242af57ed9fSAtsushi Murai     }
243af57ed9fSAtsushi Murai   }
244af57ed9fSAtsushi Murai   if (loc) *logptr++ = '\n';
245af57ed9fSAtsushi Murai   LogFlush();
246af57ed9fSAtsushi Murai }
247af57ed9fSAtsushi Murai 
248af57ed9fSAtsushi Murai void
249af57ed9fSAtsushi Murai LogTimeStamp()
250af57ed9fSAtsushi Murai {
251af57ed9fSAtsushi Murai   struct tm *ptm;
252af57ed9fSAtsushi Murai   time_t ltime;
253af57ed9fSAtsushi Murai 
254af57ed9fSAtsushi Murai   if (mypid == 0)
255af57ed9fSAtsushi Murai     mypid = getpid();
256af57ed9fSAtsushi Murai   ltime = time(0);
257af57ed9fSAtsushi Murai   ptm = localtime(&ltime);
25899c02d39SWarner Losh   snprintf(logptr, sizeof(logbuff)-(logptr-logbuff),
25999c02d39SWarner Losh     "%02d-%02d %02d:%02d:%02d [%d] ",
260af57ed9fSAtsushi Murai     ptm->tm_mon + 1, ptm->tm_mday,
261af57ed9fSAtsushi Murai 	ptm->tm_hour, ptm->tm_min, ptm->tm_sec, mypid);
262af57ed9fSAtsushi Murai   logptr += strlen(logptr);
263af57ed9fSAtsushi Murai }
264af57ed9fSAtsushi Murai 
265af57ed9fSAtsushi Murai void
26653c9f6c0SAtsushi Murai #ifdef __STDC__
26753c9f6c0SAtsushi Murai LogPrintf(int level, char *format, ...)
26853c9f6c0SAtsushi Murai #else
26953c9f6c0SAtsushi Murai LogPrintf(va_alist)
27053c9f6c0SAtsushi Murai va_dcl
27153c9f6c0SAtsushi Murai #endif
27253c9f6c0SAtsushi Murai {
27353c9f6c0SAtsushi Murai   va_list ap;
27453c9f6c0SAtsushi Murai #ifdef __STDC__
27553c9f6c0SAtsushi Murai   va_start(ap, format);
27653c9f6c0SAtsushi Murai #else
277af57ed9fSAtsushi Murai   int level;
278af57ed9fSAtsushi Murai   char *format;
27953c9f6c0SAtsushi Murai 
28053c9f6c0SAtsushi Murai   va_start(ap);
28153c9f6c0SAtsushi Murai   int = va_arg(ap, int);
28253c9f6c0SAtsushi Murai   format = va_arg(ap, char *);
28353c9f6c0SAtsushi Murai #endif
2849c749ffbSPoul-Henning Kamp   if (!(loglevel & level))
285af57ed9fSAtsushi Murai     return;
286af57ed9fSAtsushi Murai   LogTimeStamp();
28753c9f6c0SAtsushi Murai   vlogprintf(format, ap);
28853c9f6c0SAtsushi Murai   va_end(ap);
289af57ed9fSAtsushi Murai }
290c6c740beSBrian Somers 
291c6c740beSBrian Somers void
292c6c740beSBrian Somers LogReOpen( sig )
293c6c740beSBrian Somers int sig;
294c6c740beSBrian Somers {
295c6c740beSBrian Somers #ifdef USELOGFILE
29663202ff1SAndrey A. Chernov   FILE *nlogfile;
29763202ff1SAndrey A. Chernov   char buf[80];
29863202ff1SAndrey A. Chernov 
29963202ff1SAndrey A. Chernov   sprintf(buf, LOGFILE,	tunno);
30063202ff1SAndrey A. Chernov   nlogfile = fopen(buf,	"a");
301c6c740beSBrian Somers   if (nlogfile == NULL) {
30263202ff1SAndrey A. Chernov     LogPrintf(~0,"can't	re-open	%s.\r\n", buf);
303c6c740beSBrian Somers   }
304c6c740beSBrian Somers   else {
305c6c740beSBrian Somers     LogPrintf(~0,"log file closed due to signal %d.\r\n",sig);
306c6c740beSBrian Somers     LogFlush();
307c6c740beSBrian Somers     fclose(logfile);
308c6c740beSBrian Somers     logfile = nlogfile;
309c6c740beSBrian Somers     logptr = logbuff;
310c6c740beSBrian Somers     logcnt = 0;
311c6c740beSBrian Somers     logtop = lognext = NULL;
312c6c740beSBrian Somers     LogPrintf(~0,"log file opened due to signal %d.\r\n",sig);
313c6c740beSBrian Somers   }
314c6c740beSBrian Somers #endif
315c6c740beSBrian Somers   LogFlush();
316c6c740beSBrian Somers }
317