File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / mpd / src / log.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Nov 1 09:56:12 2016 UTC (7 years, 8 months ago) by misho
Branches: mpd, MAIN
CVS tags: v5_8p1_cross, v5_8p1, v5_8, HEAD
mpd 5.8

    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[1000];
  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>