xref: /freebsd/usr.sbin/ppp/log.c (revision af57ed9fdcc4e2a81940fc2243c0d3949fc0e00f)
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  *      TODO:
23af57ed9fSAtsushi Murai  *
24af57ed9fSAtsushi Murai  */
25af57ed9fSAtsushi Murai #include "defs.h"
26af57ed9fSAtsushi Murai #include <time.h>
27af57ed9fSAtsushi Murai #include <netdb.h>
28af57ed9fSAtsushi Murai 
29af57ed9fSAtsushi Murai #include "hdlc.h"
30af57ed9fSAtsushi Murai 
31af57ed9fSAtsushi Murai #define	MAXLOG	70
32af57ed9fSAtsushi Murai 
33af57ed9fSAtsushi Murai #define USELOGFILE
34af57ed9fSAtsushi Murai 
35af57ed9fSAtsushi Murai #ifdef USELOGFILE
36af57ed9fSAtsushi Murai static FILE *logfile;
37af57ed9fSAtsushi Murai #endif
38af57ed9fSAtsushi Murai static char logbuff[2000];
39af57ed9fSAtsushi Murai static char *logptr;
40af57ed9fSAtsushi Murai static struct mbuf *logtop;
41af57ed9fSAtsushi Murai static struct mbuf *lognext;
42af57ed9fSAtsushi Murai static int  logcnt;
43af57ed9fSAtsushi Murai static int  mypid;
44af57ed9fSAtsushi Murai 
45af57ed9fSAtsushi Murai int loglevel = (1 << LOG_LCP)| (1 << LOG_PHASE);
46af57ed9fSAtsushi Murai 
47af57ed9fSAtsushi Murai void
48af57ed9fSAtsushi Murai ListLog()
49af57ed9fSAtsushi Murai {
50af57ed9fSAtsushi Murai   struct mbuf *bp;
51af57ed9fSAtsushi Murai 
52af57ed9fSAtsushi Murai   for (bp = logtop; bp; bp = bp->next) {
53af57ed9fSAtsushi Murai     write(1, MBUF_CTOP(bp), bp->cnt);
54af57ed9fSAtsushi Murai     usleep(10);
55af57ed9fSAtsushi Murai   }
56af57ed9fSAtsushi Murai }
57af57ed9fSAtsushi Murai 
58af57ed9fSAtsushi Murai int
59af57ed9fSAtsushi Murai LogOpen()
60af57ed9fSAtsushi Murai {
61af57ed9fSAtsushi Murai #ifdef USELOGFILE
62af57ed9fSAtsushi Murai   logfile = fopen(LOGFILE, "a");
63af57ed9fSAtsushi Murai   if (logfile == NULL) {
64af57ed9fSAtsushi Murai     fprintf(stderr, "can't open %s.\r\n", LOGFILE);
65af57ed9fSAtsushi Murai     return(1);
66af57ed9fSAtsushi Murai   }
67af57ed9fSAtsushi Murai #endif
68af57ed9fSAtsushi Murai   fprintf(stderr, "Log level is %02x\r\n", loglevel);
69af57ed9fSAtsushi Murai   logptr = logbuff;
70af57ed9fSAtsushi Murai   logcnt = 0;
71af57ed9fSAtsushi Murai   logtop = lognext = NULL;
72af57ed9fSAtsushi Murai   return(0);
73af57ed9fSAtsushi Murai }
74af57ed9fSAtsushi Murai 
75af57ed9fSAtsushi Murai void
76af57ed9fSAtsushi Murai LogFlush()
77af57ed9fSAtsushi Murai {
78af57ed9fSAtsushi Murai   struct mbuf *bp;
79af57ed9fSAtsushi Murai   int cnt;
80af57ed9fSAtsushi Murai 
81af57ed9fSAtsushi Murai #ifdef USELOGFILE
82af57ed9fSAtsushi Murai   *logptr = 0;
83af57ed9fSAtsushi Murai   fprintf(logfile, "%s", logbuff);
84af57ed9fSAtsushi Murai   fflush(logfile);
85af57ed9fSAtsushi Murai #endif
86af57ed9fSAtsushi Murai   cnt = logptr - logbuff + 1;
87af57ed9fSAtsushi Murai   bp = mballoc(cnt, MB_LOG);
88af57ed9fSAtsushi Murai   bcopy(logbuff, MBUF_CTOP(bp), cnt);
89af57ed9fSAtsushi Murai   bp->cnt = cnt;
90af57ed9fSAtsushi Murai   if (lognext) {
91af57ed9fSAtsushi Murai     lognext->next = bp;
92af57ed9fSAtsushi Murai     lognext = bp;
93af57ed9fSAtsushi Murai     if (++logcnt > MAXLOG) {
94af57ed9fSAtsushi Murai       logcnt--;
95af57ed9fSAtsushi Murai       logtop = mbfree(logtop);
96af57ed9fSAtsushi Murai     }
97af57ed9fSAtsushi Murai   } else {
98af57ed9fSAtsushi Murai     lognext = logtop = bp;
99af57ed9fSAtsushi Murai   }
100af57ed9fSAtsushi Murai   logptr = logbuff;
101af57ed9fSAtsushi Murai }
102af57ed9fSAtsushi Murai 
103af57ed9fSAtsushi Murai void
104af57ed9fSAtsushi Murai DupLog()
105af57ed9fSAtsushi Murai {
106af57ed9fSAtsushi Murai   mypid = 0;
107af57ed9fSAtsushi Murai #ifdef USELOGFILE
108af57ed9fSAtsushi Murai   dup2(fileno(logfile), 2);
109af57ed9fSAtsushi Murai #endif
110af57ed9fSAtsushi Murai }
111af57ed9fSAtsushi Murai 
112af57ed9fSAtsushi Murai void
113af57ed9fSAtsushi Murai LogClose()
114af57ed9fSAtsushi Murai {
115af57ed9fSAtsushi Murai   LogFlush();
116af57ed9fSAtsushi Murai #ifdef USELOGFILE
117af57ed9fSAtsushi Murai   fclose(logfile);
118af57ed9fSAtsushi Murai #endif
119af57ed9fSAtsushi Murai }
120af57ed9fSAtsushi Murai 
121af57ed9fSAtsushi Murai void
122af57ed9fSAtsushi Murai logprintf(format, arg1, arg2, arg3, arg4, arg5, arg6)
123af57ed9fSAtsushi Murai char *format;
124af57ed9fSAtsushi Murai void *arg1, *arg2, *arg3, *arg4, *arg5, *arg6;
125af57ed9fSAtsushi Murai {
126af57ed9fSAtsushi Murai   sprintf(logptr, format, arg1, arg2, arg3, arg4, arg5, arg6);
127af57ed9fSAtsushi Murai   logptr += strlen(logptr);
128af57ed9fSAtsushi Murai   LogFlush();
129af57ed9fSAtsushi Murai }
130af57ed9fSAtsushi Murai 
131af57ed9fSAtsushi Murai void
132af57ed9fSAtsushi Murai LogDumpBp(level, header, bp)
133af57ed9fSAtsushi Murai int level;
134af57ed9fSAtsushi Murai char *header;
135af57ed9fSAtsushi Murai struct mbuf *bp;
136af57ed9fSAtsushi Murai {
137af57ed9fSAtsushi Murai   u_char *cp;
138af57ed9fSAtsushi Murai   int cnt, loc;
139af57ed9fSAtsushi Murai 
140af57ed9fSAtsushi Murai   if (!(loglevel & (1 << level)))
141af57ed9fSAtsushi Murai     return;
142af57ed9fSAtsushi Murai   LogTimeStamp();
143af57ed9fSAtsushi Murai   sprintf(logptr, "%s\n", header);
144af57ed9fSAtsushi Murai   logptr += strlen(logptr);
145af57ed9fSAtsushi Murai   loc = 0;
146af57ed9fSAtsushi Murai   LogTimeStamp();
147af57ed9fSAtsushi Murai   while (bp) {
148af57ed9fSAtsushi Murai     cp = MBUF_CTOP(bp);
149af57ed9fSAtsushi Murai     cnt = bp->cnt;
150af57ed9fSAtsushi Murai     while (cnt-- > 0) {
151af57ed9fSAtsushi Murai       sprintf(logptr, " %02x", *cp++);
152af57ed9fSAtsushi Murai       logptr += strlen(logptr);
153af57ed9fSAtsushi Murai       if (++loc == 16) {
154af57ed9fSAtsushi Murai 	loc = 0;
155af57ed9fSAtsushi Murai 	*logptr++ = '\n';
156af57ed9fSAtsushi Murai 	if (logptr - logbuff > 1500)
157af57ed9fSAtsushi Murai 	  LogFlush();
158af57ed9fSAtsushi Murai   	if (cnt) LogTimeStamp();
159af57ed9fSAtsushi Murai       }
160af57ed9fSAtsushi Murai     }
161af57ed9fSAtsushi Murai     bp = bp->next;
162af57ed9fSAtsushi Murai   }
163af57ed9fSAtsushi Murai   if (loc) *logptr++ = '\n';
164af57ed9fSAtsushi Murai   LogFlush();
165af57ed9fSAtsushi Murai }
166af57ed9fSAtsushi Murai 
167af57ed9fSAtsushi Murai void
168af57ed9fSAtsushi Murai LogDumpBuff(level, header, ptr, cnt)
169af57ed9fSAtsushi Murai int level;
170af57ed9fSAtsushi Murai char *header;
171af57ed9fSAtsushi Murai u_char *ptr;
172af57ed9fSAtsushi Murai int cnt;
173af57ed9fSAtsushi Murai {
174af57ed9fSAtsushi Murai   int loc;
175af57ed9fSAtsushi Murai 
176af57ed9fSAtsushi Murai   if (cnt < 1) return;
177af57ed9fSAtsushi Murai   if (!(loglevel & (1 << level)))
178af57ed9fSAtsushi Murai     return;
179af57ed9fSAtsushi Murai   LogTimeStamp();
180af57ed9fSAtsushi Murai   sprintf(logptr, "%s\n", header);
181af57ed9fSAtsushi Murai   logptr += strlen(logptr);
182af57ed9fSAtsushi Murai   LogTimeStamp();
183af57ed9fSAtsushi Murai   loc = 0;
184af57ed9fSAtsushi Murai   while (cnt-- > 0) {
185af57ed9fSAtsushi Murai     sprintf(logptr, " %02x", *ptr++);
186af57ed9fSAtsushi Murai     logptr += strlen(logptr);
187af57ed9fSAtsushi Murai     if (++loc == 16) {
188af57ed9fSAtsushi Murai       loc = 0;
189af57ed9fSAtsushi Murai       *logptr++ = '\n';
190af57ed9fSAtsushi Murai       if (cnt) LogTimeStamp();
191af57ed9fSAtsushi Murai     }
192af57ed9fSAtsushi Murai   }
193af57ed9fSAtsushi Murai   if (loc) *logptr++ = '\n';
194af57ed9fSAtsushi Murai   LogFlush();
195af57ed9fSAtsushi Murai }
196af57ed9fSAtsushi Murai 
197af57ed9fSAtsushi Murai void
198af57ed9fSAtsushi Murai LogTimeStamp()
199af57ed9fSAtsushi Murai {
200af57ed9fSAtsushi Murai   struct tm *ptm;
201af57ed9fSAtsushi Murai   time_t ltime;
202af57ed9fSAtsushi Murai 
203af57ed9fSAtsushi Murai   if (mypid == 0)
204af57ed9fSAtsushi Murai     mypid = getpid();
205af57ed9fSAtsushi Murai   ltime = time(0);
206af57ed9fSAtsushi Murai   ptm = localtime(&ltime);
207af57ed9fSAtsushi Murai   sprintf(logptr, "%02d-%02d %02d:%02d:%02d [%d] ",
208af57ed9fSAtsushi Murai     ptm->tm_mon + 1, ptm->tm_mday,
209af57ed9fSAtsushi Murai 	ptm->tm_hour, ptm->tm_min, ptm->tm_sec, mypid);
210af57ed9fSAtsushi Murai   logptr += strlen(logptr);
211af57ed9fSAtsushi Murai }
212af57ed9fSAtsushi Murai 
213af57ed9fSAtsushi Murai void
214af57ed9fSAtsushi Murai LogPrintf(level, format, arg1, arg2, arg3, arg4, arg5, arg6)
215af57ed9fSAtsushi Murai int level;
216af57ed9fSAtsushi Murai char *format;
217af57ed9fSAtsushi Murai void *arg1, *arg2, *arg3, *arg4, *arg5, *arg6;
218af57ed9fSAtsushi Murai {
219af57ed9fSAtsushi Murai   if (!(loglevel & (1 << level)))
220af57ed9fSAtsushi Murai     return;
221af57ed9fSAtsushi Murai   LogTimeStamp();
222af57ed9fSAtsushi Murai   logprintf(format, arg1, arg2, arg3, arg4, arg5, arg6);
223af57ed9fSAtsushi Murai }
224