xref: /freebsd/usr.sbin/ppp/log.c (revision e627b39baccd1ec9129690167cf5e6d860509655)
1 /*
2  *	            PPP logging facility
3  *
4  *	    Written by Toshiharu OHNO (tony-o@iij.ad.jp)
5  *
6  *   Copyright (C) 1993, Internet Initiative Japan, Inc. All rights reserverd.
7  *
8  * Redistribution and use in source and binary forms are permitted
9  * provided that the above copyright notice and this paragraph are
10  * duplicated in all such forms and that any documentation,
11  * advertising materials, and other materials related to such
12  * distribution and use acknowledge that the software was developed
13  * by the Internet Initiative Japan, Inc.  The name of the
14  * IIJ may not be used to endorse or promote products derived
15  * from this software without specific prior written permission.
16  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
17  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
18  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
19  *
20  * $Id: log.c,v 1.3 1995/05/30 03:50:43 rgrimes Exp $
21  *
22  */
23 #include "defs.h"
24 #include <time.h>
25 #include <netdb.h>
26 #ifdef __STDC__
27 #include <stdarg.h>
28 #else
29 #include <varargs.h>
30 #endif
31 #ifdef NO_VSPRINTF
32 #include <stdio.h>
33 #endif
34 
35 #include "hdlc.h"
36 
37 #define	MAXLOG	70
38 
39 #define USELOGFILE
40 
41 #ifdef USELOGFILE
42 static FILE *logfile;
43 #endif
44 static char logbuff[2000];
45 static char *logptr;
46 static struct mbuf *logtop;
47 static struct mbuf *lognext;
48 static int  logcnt;
49 static int  mypid;
50 
51 int loglevel = LOG_LINK_BIT | LOG_CARRIER_BIT | LOG_PHASE_BIT;
52 
53 void
54 ListLog()
55 {
56   struct mbuf *bp;
57 
58   for (bp = logtop; bp; bp = bp->next) {
59     write(1, MBUF_CTOP(bp), bp->cnt);
60     usleep(10);
61   }
62 }
63 
64 int
65 LogOpen()
66 {
67 #ifdef USELOGFILE
68   logfile = fopen(LOGFILE, "a");
69   if (logfile == NULL) {
70     fprintf(stderr, "can't open %s.\r\n", LOGFILE);
71     return(1);
72   }
73 #endif
74   fprintf(stderr, "Log level is %02x\r\n", loglevel);
75   logptr = logbuff;
76   logcnt = 0;
77   logtop = lognext = NULL;
78   return(0);
79 }
80 
81 void
82 LogFlush()
83 {
84   struct mbuf *bp;
85   int cnt;
86 
87 #ifdef USELOGFILE
88   *logptr = 0;
89   fprintf(logfile, "%s", logbuff);
90   fflush(logfile);
91 #endif
92   cnt = logptr - logbuff + 1;
93   bp = mballoc(cnt, MB_LOG);
94   bcopy(logbuff, MBUF_CTOP(bp), cnt);
95   bp->cnt = cnt;
96   if (lognext) {
97     lognext->next = bp;
98     lognext = bp;
99     if (++logcnt > MAXLOG) {
100       logcnt--;
101       logtop = mbfree(logtop);
102     }
103   } else {
104     lognext = logtop = bp;
105   }
106   logptr = logbuff;
107 }
108 
109 void
110 DupLog()
111 {
112   mypid = 0;
113 #ifdef USELOGFILE
114   dup2(fileno(logfile), 2);
115 #endif
116 }
117 
118 void
119 LogClose()
120 {
121   LogFlush();
122 #ifdef USELOGFILE
123   fclose(logfile);
124 #endif
125 }
126 
127 #ifdef NO_VSPRINTF
128 void
129 vsprintf(buf, fmt, av)
130 char *buf;
131 char *fmt;
132 va_list av;
133 {
134   FILE foo;
135 
136   foo._cnt = BUFSIZ;
137   foo._base = foo._ptr = buf; /* may have to cast(unsigned char *) */
138   foo._flag = _IOWRT+_IOSTRG;
139   (void) _doprnt(fmt, (va_list)av, &foo);
140   *foo._ptr = '\0'; /* plant terminating null character */
141 }
142 #endif
143 
144 static void
145 vlogprintf(format, ap)
146 char *format;
147 va_list ap;
148 {
149   vsprintf(logptr, format, ap);
150   logptr += strlen(logptr);
151   LogFlush();
152 }
153 
154 void
155 #ifdef __STDC__
156 logprintf(char *format, ...)
157 #else
158 logprintf(va_alist)
159 va_dcl
160 #endif
161 {
162   va_list ap;
163 #ifdef __STDC__
164   va_start(ap, format);
165 #else
166   char *format;
167 
168   va_start(ap);
169   format = va_arg(ap, char *);
170 #endif
171   vlogprintf(format, ap);
172   va_end(ap);
173 }
174 
175 void
176 LogDumpBp(level, header, bp)
177 int level;
178 char *header;
179 struct mbuf *bp;
180 {
181   u_char *cp;
182   int cnt, loc;
183 
184   if (!(loglevel & (1 << level)))
185     return;
186   LogTimeStamp();
187   sprintf(logptr, "%s\n", header);
188   logptr += strlen(logptr);
189   loc = 0;
190   LogTimeStamp();
191   while (bp) {
192     cp = MBUF_CTOP(bp);
193     cnt = bp->cnt;
194     while (cnt-- > 0) {
195       sprintf(logptr, " %02x", *cp++);
196       logptr += strlen(logptr);
197       if (++loc == 16) {
198 	loc = 0;
199 	*logptr++ = '\n';
200 	if (logptr - logbuff > 1500)
201 	  LogFlush();
202   	if (cnt) LogTimeStamp();
203       }
204     }
205     bp = bp->next;
206   }
207   if (loc) *logptr++ = '\n';
208   LogFlush();
209 }
210 
211 void
212 LogDumpBuff(level, header, ptr, cnt)
213 int level;
214 char *header;
215 u_char *ptr;
216 int cnt;
217 {
218   int loc;
219 
220   if (cnt < 1) return;
221   if (!(loglevel & (1 << level)))
222     return;
223   LogTimeStamp();
224   sprintf(logptr, "%s\n", header);
225   logptr += strlen(logptr);
226   LogTimeStamp();
227   loc = 0;
228   while (cnt-- > 0) {
229     sprintf(logptr, " %02x", *ptr++);
230     logptr += strlen(logptr);
231     if (++loc == 16) {
232       loc = 0;
233       *logptr++ = '\n';
234       if (cnt) LogTimeStamp();
235     }
236   }
237   if (loc) *logptr++ = '\n';
238   LogFlush();
239 }
240 
241 void
242 LogTimeStamp()
243 {
244   struct tm *ptm;
245   time_t ltime;
246 
247   if (mypid == 0)
248     mypid = getpid();
249   ltime = time(0);
250   ptm = localtime(&ltime);
251   sprintf(logptr, "%02d-%02d %02d:%02d:%02d [%d] ",
252     ptm->tm_mon + 1, ptm->tm_mday,
253 	ptm->tm_hour, ptm->tm_min, ptm->tm_sec, mypid);
254   logptr += strlen(logptr);
255 }
256 
257 void
258 #ifdef __STDC__
259 LogPrintf(int level, char *format, ...)
260 #else
261 LogPrintf(va_alist)
262 va_dcl
263 #endif
264 {
265   va_list ap;
266 #ifdef __STDC__
267   va_start(ap, format);
268 #else
269   int level;
270   char *format;
271 
272   va_start(ap);
273   int = va_arg(ap, int);
274   format = va_arg(ap, char *);
275 #endif
276   if (!(loglevel & level))
277     return;
278   LogTimeStamp();
279   vlogprintf(format, ap);
280   va_end(ap);
281 }
282