xref: /freebsd/usr.sbin/ppp/log.c (revision 53c9f6c0c48df668bb8fa282cd0b12cb8690bcce)
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  *
20af57ed9fSAtsushi Murai  * $Id:$
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 
51af57ed9fSAtsushi Murai int loglevel = (1 << LOG_LCP)| (1 << LOG_PHASE);
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 {
14953c9f6c0SAtsushi Murai   vsprintf(logptr, 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();
187af57ed9fSAtsushi Murai   sprintf(logptr, "%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) {
195af57ed9fSAtsushi Murai       sprintf(logptr, " %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();
224af57ed9fSAtsushi Murai   sprintf(logptr, "%s\n", header);
225af57ed9fSAtsushi Murai   logptr += strlen(logptr);
226af57ed9fSAtsushi Murai   LogTimeStamp();
227af57ed9fSAtsushi Murai   loc = 0;
228af57ed9fSAtsushi Murai   while (cnt-- > 0) {
229af57ed9fSAtsushi Murai     sprintf(logptr, " %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);
251af57ed9fSAtsushi Murai   sprintf(logptr, "%02d-%02d %02d:%02d:%02d [%d] ",
252af57ed9fSAtsushi Murai     ptm->tm_mon + 1, ptm->tm_mday,
253af57ed9fSAtsushi Murai 	ptm->tm_hour, ptm->tm_min, ptm->tm_sec, mypid);
254af57ed9fSAtsushi Murai   logptr += strlen(logptr);
255af57ed9fSAtsushi Murai }
256af57ed9fSAtsushi Murai 
257af57ed9fSAtsushi Murai void
25853c9f6c0SAtsushi Murai #ifdef __STDC__
25953c9f6c0SAtsushi Murai LogPrintf(int level, char *format, ...)
26053c9f6c0SAtsushi Murai #else
26153c9f6c0SAtsushi Murai LogPrintf(va_alist)
26253c9f6c0SAtsushi Murai va_dcl
26353c9f6c0SAtsushi Murai #endif
26453c9f6c0SAtsushi Murai {
26553c9f6c0SAtsushi Murai   va_list ap;
26653c9f6c0SAtsushi Murai #ifdef __STDC__
26753c9f6c0SAtsushi Murai   va_start(ap, format);
26853c9f6c0SAtsushi Murai #else
269af57ed9fSAtsushi Murai   int level;
270af57ed9fSAtsushi Murai   char *format;
27153c9f6c0SAtsushi Murai 
27253c9f6c0SAtsushi Murai   va_start(ap);
27353c9f6c0SAtsushi Murai   int = va_arg(ap, int);
27453c9f6c0SAtsushi Murai   format = va_arg(ap, char *);
27553c9f6c0SAtsushi Murai #endif
276af57ed9fSAtsushi Murai   if (!(loglevel & (1 << level)))
277af57ed9fSAtsushi Murai     return;
278af57ed9fSAtsushi Murai   LogTimeStamp();
27953c9f6c0SAtsushi Murai   vlogprintf(format, ap);
28053c9f6c0SAtsushi Murai   va_end(ap);
281af57ed9fSAtsushi Murai }
282