Annotation of embedaddon/mpd/src/log.c, revision 1.1.1.1
1.1 misho 1:
2: /*
3: * log.c
4: *
5: * Written by Toshiharu OHNO <tony-o@iij.ad.jp>
6: * Copyright (c) 1993, Internet Initiative Japan, Inc. All rights reserved.
7: * See ``COPYRIGHT.iij''
8: *
9: * Rewritten by Archie Cobbs <archie@freebsd.org>
10: * Copyright (c) 1995-1999 Whistle Communications, Inc. All rights reserved.
11: * See ``COPYRIGHT.whistle''
12: */
13:
14: #include "ppp.h"
15: #ifdef SYSLOG_FACILITY
16: #include <syslog.h>
17: #endif
18:
19: /*
20: * DEFINITIONS
21: */
22:
23: #define DUMP_BYTES_PER_LINE 16
24: #define ROUNDUP(x,r) (((x)%(r))?((x)+((r)-((x)%(r)))):(x))
25: #define MAX_LOG_LINE 500
26:
27: /* Log option descriptor */
28:
29: struct logopt
30: {
31: int mask;
32: const char *name;
33: const char *desc;
34: };
35:
36: /*
37: * GLOBAL VARIABLES
38: */
39:
40: int gLogOptions = LG_DEFAULT_OPT | LG_ALWAYS;
41: #ifdef SYSLOG_FACILITY
42: char gSysLogIdent[32];
43: #endif
44:
45: /*
46: * INTERNAL VARIABLES
47: */
48:
49: #define ADD_OPT(x,d) { LG_ ##x, #x, d },
50:
51: static struct logopt LogOptionList[] =
52: {
53: #ifdef LG_BUND
54: ADD_OPT(BUND, "Bundle events")
55: #endif
56: #ifdef LG_BUND2
57: ADD_OPT(BUND2, "Detailed bundle events")
58: #endif
59: #ifdef LG_LINK
60: ADD_OPT(LINK, "Link events")
61: #endif
62: #ifdef LG_REP
63: ADD_OPT(REP, "Repeater events")
64: #endif
65: #ifdef LG_LCP
66: ADD_OPT(LCP, "LCP negotiation")
67: #endif
68: #ifdef LG_LCP2
69: ADD_OPT(LCP2, "LCP events and debugging")
70: #endif
71: #ifdef LG_AUTH
72: ADD_OPT(AUTH, "Link authentication events")
73: #endif
74: #ifdef LG_AUTH2
75: ADD_OPT(AUTH2, "Link authentication details")
76: #endif
77: #ifdef LG_IPCP
78: ADD_OPT(IPCP, "IPCP negotiation")
79: #endif
80: #ifdef LG_IPCP2
81: ADD_OPT(IPCP2, "IPCP events and debugging")
82: #endif
83: #ifdef LG_IPV6CP
84: ADD_OPT(IPV6CP, "IPV6CP negotiation")
85: #endif
86: #ifdef LG_IPV6CP2
87: ADD_OPT(IPV6CP2, "IPV6CP events and debugging")
88: #endif
89: #ifdef LG_CCP
90: ADD_OPT(CCP, "CCP negotiation")
91: #endif
92: #ifdef LG_CCP2
93: ADD_OPT(CCP2, "CCP events and debugging")
94: #endif
95: #ifdef LG_ECP
96: ADD_OPT(ECP, "ECP negotiation")
97: #endif
98: #ifdef LG_ECP2
99: ADD_OPT(ECP2, "ECP events and debugging")
100: #endif
101: #ifdef LG_FSM
102: ADD_OPT(FSM, "All FSM events (except echo & reset)")
103: #endif
104: #ifdef LG_ECHO
105: ADD_OPT(ECHO, "Echo/reply events for all automata")
106: #endif
107: #ifdef LG_PHYS
108: ADD_OPT(PHYS, "Physical layer events")
109: #endif
110: #ifdef LG_PHYS2
111: ADD_OPT(PHYS2, "Physical layer debug")
112: #endif
113: #ifdef LG_PHYS3
114: ADD_OPT(PHYS3, "Physical layer control packet dump")
115: #endif
116: #ifdef LG_CHAT
117: ADD_OPT(CHAT, "Modem chat script")
118: #endif
119: #ifdef LG_CHAT2
120: ADD_OPT(CHAT2, "Chat script extra debugging output")
121: #endif
122: #ifdef LG_IFACE
123: ADD_OPT(IFACE, "IP interface and route management")
124: #endif
125: #ifdef LG_IFACE2
126: ADD_OPT(IFACE2, "IP interface and route management debug")
127: #endif
128: #ifdef LG_FRAME
129: ADD_OPT(FRAME, "Dump all incoming & outgoing frames")
130: #endif
131: #ifdef LG_RADIUS
132: ADD_OPT(RADIUS, "Radius authentication events")
133: #endif
134: #ifdef LG_RADIUS2
135: ADD_OPT(RADIUS2, "Radius authentication debug")
136: #endif
137: #ifdef LG_CONSOLE
138: ADD_OPT(CONSOLE, "Console events")
139: #endif
140: #ifdef LG_EVENTS
141: ADD_OPT(EVENTS, "Daemon events debug")
142: #endif
143: };
144:
145: #define NUM_LOG_LEVELS (sizeof(LogOptionList) / sizeof(*LogOptionList))
146:
147: /*
148: * LogOpen()
149: */
150:
151: int
152: LogOpen(void)
153: {
154: #ifdef SYSLOG_FACILITY
155: if (!*gSysLogIdent)
156: strcpy(gSysLogIdent, "mpd");
157: openlog(gSysLogIdent, 0, LOG_DAEMON);
158: #endif
159: return(0);
160: }
161:
162: /*
163: * LogClose()
164: */
165:
166: void
167: LogClose(void)
168: {
169: #ifdef SYSLOG_FACILITY
170: closelog();
171: #endif
172: }
173:
174: /*
175: * LogCommand()
176: */
177:
178: int
179: LogCommand(Context ctx, int ac, char *av[], void *arg)
180: {
181: u_int k;
182: int bits, add;
183:
184: if (ac == 0) {
185: #define LG_FMT " %-12s %-10s %s\r\n"
186:
187: Printf(LG_FMT, "Log Option", "Enabled", "Description");
188: Printf(LG_FMT, "----------", "-------", "-----------");
189: for (k = 0; k < NUM_LOG_LEVELS; k++) {
190: Printf(" " LG_FMT, LogOptionList[k].name,
191: (gLogOptions & LogOptionList[k].mask) ? "Yes" : "No",
192: LogOptionList[k].desc);
193: }
194: return(0);
195: }
196:
197: while (ac--) {
198: switch (**av) {
199: case '+':
200: (*av)++;
201: default:
202: add = TRUE;
203: break;
204: case '-':
205: add = FALSE;
206: (*av)++;
207: break;
208: }
209: for (k = 0;
210: k < NUM_LOG_LEVELS && strcasecmp(*av, LogOptionList[k].name);
211: k++);
212: if (k < NUM_LOG_LEVELS)
213: bits = LogOptionList[k].mask;
214: else {
215: if (!strcasecmp(*av, "all")) {
216: for (bits = k = 0; k < NUM_LOG_LEVELS; k++)
217: bits |= LogOptionList[k].mask;
218: } else {
219: Printf("\"%s\" is unknown. Enter \"log\" for list.\r\n", *av);
220: bits = 0;
221: }
222: }
223: if (add)
224: gLogOptions |= bits;
225: else
226: gLogOptions &= ~bits;
227: av++;
228: }
229: return(0);
230: }
231:
232: /*
233: * LogPrintf()
234: *
235: * The way to print something to the log
236: */
237:
238: void
239: LogPrintf(const char *fmt, ...)
240: {
241: va_list args;
242:
243: va_start(args, fmt);
244: vLogPrintf(fmt, args);
245: va_end(args);
246: }
247:
248: void
249: vLogPrintf(const char *fmt, va_list args)
250: {
251: if (!SLIST_EMPTY(&gConsole.sessions)) {
252: char buf[256];
253: ConsoleSession s;
254:
255: vsnprintf(buf, sizeof(buf), fmt, args);
256: #ifdef SYSLOG_FACILITY
257: syslog(LOG_INFO, "%s", buf);
258: #endif
259: RWLOCK_RDLOCK(gConsole.lock);
260: SLIST_FOREACH(s, &gConsole.sessions, next) {
261: if (Enabled(&s->options, CONSOLE_LOGGING))
262: s->write(s, "%s\r\n", buf);
263: }
264: RWLOCK_UNLOCK(gConsole.lock);
265: #ifdef SYSLOG_FACILITY
266: } else {
267: vsyslog(LOG_INFO, fmt, args);
268: #endif
269: }
270: }
271:
272: /*
273: * LogPrintf2()
274: *
275: * The way to print something to the log
276: */
277:
278: void
279: LogPrintf2(const char *fmt, ...)
280: {
281: va_list args;
282:
283: va_start(args, fmt);
284: #ifdef SYSLOG_FACILITY
285: vsyslog(LOG_INFO, fmt, args);
286: #endif
287: va_end(args);
288: }
289:
290: /*
291: * LogDumpBp2()
292: *
293: * Dump the contents of an Mbuf to the log
294: */
295:
296: void
297: LogDumpBp2(Mbuf bp, const char *fmt, ...)
298: {
299: int k, total;
300: u_char bytes[DUMP_BYTES_PER_LINE];
301: char line[128];
302: int linelen;
303: va_list ap;
304:
305: /* Do header */
306: va_start(ap, fmt);
307: vLogPrintf(fmt, ap);
308: va_end(ap);
309:
310: /* Do data */
311: line[0]=' ';
312: line[1]=' ';
313: line[2]=' ';
314: line[3]=0;
315: linelen=3;
316:
317: total = 0;
318: if (bp) {
319: int start, stop, last = 0;
320:
321: stop = ROUNDUP(total + MBLEN(bp), DUMP_BYTES_PER_LINE);
322: for (start = total; total < stop; ) {
323: u_int const byte = (MBDATAU(bp))[total - start];
324:
325: if (total < start + MBLEN(bp)) {
326: sprintf(line+linelen, " %02x", byte);
327: last = total % DUMP_BYTES_PER_LINE;
328: } else
329: sprintf(line+linelen, " ");
330: linelen+=3;
331:
332: bytes[total % DUMP_BYTES_PER_LINE] = byte;
333: total++;
334:
335: if (total % DUMP_BYTES_PER_LINE == 0) {
336: snprintf(line+linelen, sizeof(line), " ");
337: linelen+=2;
338: for (k = 0; k <= last; k++) {
339: line[linelen++] = isgraph(bytes[k]) ? bytes[k] : '.';
340: line[linelen] = 0;
341: }
342: LogPrintf("%s",line);
343: line[0]=' ';
344: line[1]=' ';
345: line[2]=' ';
346: line[3]=0;
347: linelen=3;
348: }
349: }
350: }
351: }
352:
353: /*
354: * LogDumpBuf2()
355: *
356: * Dump the contents of a buffer to the log
357: */
358:
359: void
360: LogDumpBuf2(const u_char *buf, int count, const char *fmt, ...)
361: {
362: int k, stop, total;
363: char line[128];
364: int linelen;
365: va_list ap;
366:
367: /* Do header */
368: va_start(ap, fmt);
369: vLogPrintf(fmt, ap);
370: va_end(ap);
371:
372: /* Do data */
373: line[0]=' ';
374: line[1]=' ';
375: line[2]=' ';
376: line[3]=0;
377: linelen=3;
378:
379: stop = ROUNDUP(count, DUMP_BYTES_PER_LINE);
380: for (total = 0; total < stop; ) {
381: if (total < count)
382: sprintf(line+linelen, " %02x", buf[total]);
383: else
384: sprintf(line+linelen, " ");
385: linelen+=3;
386: total++;
387: if (total % DUMP_BYTES_PER_LINE == 0) {
388: snprintf(line+linelen, sizeof(line), " ");
389: linelen+=2;
390: for (k = total - DUMP_BYTES_PER_LINE; k < total && k < count; k++) {
391: line[linelen++] = isgraph(buf[k]) ? buf[k] : '.';
392: line[linelen] = 0;
393: }
394: LogPrintf("%s",line);
395: line[0]=' ';
396: line[1]=' ';
397: line[2]=' ';
398: line[3]=0;
399: linelen=3;
400: }
401: }
402: }
403:
404: /*
405: * Perror()
406: */
407:
408: void
409: Perror(const char *fmt, ...)
410: {
411: va_list args;
412: char buf[200];
413:
414: va_start(args, fmt);
415: vsnprintf(buf, sizeof(buf), fmt, args);
416: va_end(args);
417: snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
418: ": %s", strerror(errno));
419: Log(LG_ERR, ("%s", buf));
420: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>