Annotation of embedaddon/mpd/src/log.c, revision 1.1.1.4

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
1.1.1.4 ! misho     179: LogCommand(Context ctx, int ac, const char *const av[], const void *arg)
1.1       misho     180: {
                    181:     u_int      k;
                    182:     int                bits, add;
1.1.1.4 ! misho     183:     const char *s;
1.1       misho     184: 
1.1.1.4 ! misho     185:     (void)arg;
1.1       misho     186:     if (ac == 0) {
                    187: #define LG_FMT "    %-12s  %-10s  %s\r\n"
                    188: 
                    189:        Printf(LG_FMT, "Log Option", "Enabled", "Description");
                    190:        Printf(LG_FMT, "----------", "-------", "-----------");
                    191:        for (k = 0; k < NUM_LOG_LEVELS; k++) {
                    192:            Printf("  " LG_FMT, LogOptionList[k].name,
                    193:                (gLogOptions & LogOptionList[k].mask) ? "Yes" : "No",
                    194:                LogOptionList[k].desc);
                    195:        }
                    196:        return(0);
                    197:     }
                    198: 
                    199:     while (ac--) {
1.1.1.4 ! misho     200:        s = *av;
        !           201:        switch (*s) {
1.1       misho     202:            case '+':
1.1.1.4 ! misho     203:                s++;
1.1       misho     204:            default:
                    205:                add = TRUE;
                    206:                break;
                    207:            case '-':
                    208:                add = FALSE;
1.1.1.4 ! misho     209:                s++;
1.1       misho     210:            break;
                    211:        }
                    212:        for (k = 0;
1.1.1.4 ! misho     213:            k < NUM_LOG_LEVELS && strcasecmp(s, LogOptionList[k].name);
1.1       misho     214:            k++);
                    215:        if (k < NUM_LOG_LEVELS)
                    216:            bits = LogOptionList[k].mask;
                    217:        else {
1.1.1.4 ! misho     218:            if (!strcasecmp(s, "all")) {
1.1       misho     219:                for (bits = k = 0; k < NUM_LOG_LEVELS; k++)
                    220:                    bits |= LogOptionList[k].mask;
                    221:            } else {
1.1.1.4 ! misho     222:                Printf("\"%s\" is unknown. Enter \"log\" for list.\r\n", s);
1.1       misho     223:                bits = 0;
                    224:            }
                    225:        }
                    226:        if (add)
                    227:            gLogOptions |= bits;
                    228:        else
                    229:            gLogOptions &= ~bits;
                    230:        av++;
                    231:     }
                    232:     return(0);
                    233: }
                    234: 
                    235: /*
                    236:  * LogPrintf()
                    237:  *
                    238:  * The way to print something to the log
                    239:  */
                    240: 
                    241: void
                    242: LogPrintf(const char *fmt, ...)
                    243: {
                    244:     va_list       args;
                    245: 
                    246:     va_start(args, fmt);
                    247:     vLogPrintf(fmt, args);
                    248:     va_end(args);
                    249: }
                    250: 
                    251: void
1.1.1.4 ! misho     252: vLogPrintf(const char *fmt, va_list args) NO_THREAD_SAFETY_ANALYSIS
1.1       misho     253: {
                    254:     if (!SLIST_EMPTY(&gConsole.sessions)) {
1.1.1.2   misho     255:        char            buf[1000];
1.1       misho     256:        ConsoleSession  s;
                    257: 
                    258:         vsnprintf(buf, sizeof(buf), fmt, args);
                    259: #ifdef SYSLOG_FACILITY
                    260:         syslog(LOG_INFO, "%s", buf);
                    261: #endif
1.1.1.3   misho     262:        pthread_cleanup_push(ConsoleCancelCleanup, gConsole.lock);
1.1       misho     263:        RWLOCK_RDLOCK(gConsole.lock);
                    264:        SLIST_FOREACH(s, &gConsole.sessions, next) {
                    265:            if (Enabled(&s->options, CONSOLE_LOGGING))
                    266:                s->write(s, "%s\r\n", buf);
                    267:        }
1.1.1.3   misho     268:        pthread_cleanup_pop(1);
1.1       misho     269: #ifdef SYSLOG_FACILITY
                    270:     } else {
                    271:         vsyslog(LOG_INFO, fmt, args);
                    272: #endif
                    273:     }
                    274: }
                    275: 
                    276: /*
                    277:  * LogPrintf2()
                    278:  *
                    279:  * The way to print something to the log
                    280:  */
                    281: 
                    282: void
                    283: LogPrintf2(const char *fmt, ...)
                    284: {
                    285:     va_list       args;
                    286: 
                    287:     va_start(args, fmt);
                    288: #ifdef SYSLOG_FACILITY
                    289:     vsyslog(LOG_INFO, fmt, args);
                    290: #endif
                    291:     va_end(args);
                    292: }
                    293: 
                    294: /*
                    295:  * LogDumpBp2()
                    296:  *
                    297:  * Dump the contents of an Mbuf to the log
                    298:  */
                    299: 
                    300: void
                    301: LogDumpBp2(Mbuf bp, const char *fmt, ...)
                    302: {
1.1.1.4 ! misho     303:     int                k;
        !           304:     unsigned   total;
1.1       misho     305:     u_char     bytes[DUMP_BYTES_PER_LINE];
                    306:     char       line[128];
                    307:     int                linelen;
                    308:     va_list    ap;
                    309: 
                    310:        /* Do header */
                    311:        va_start(ap, fmt);
                    312:        vLogPrintf(fmt, ap);
                    313:        va_end(ap);
                    314: 
                    315:        /* Do data */
                    316:        line[0]=' ';
                    317:        line[1]=' ';
                    318:         line[2]=' ';
                    319:         line[3]=0;
                    320:         linelen=3;
                    321:   
                    322:         total = 0;
                    323:        if (bp) {
1.1.1.4 ! misho     324:            int start, last = 0;
        !           325:            unsigned stop;
1.1       misho     326: 
                    327:            stop = ROUNDUP(total + MBLEN(bp), DUMP_BYTES_PER_LINE);
                    328:            for (start = total; total < stop; ) {
                    329:                u_int   const byte = (MBDATAU(bp))[total - start];
                    330: 
                    331:                if (total < start + MBLEN(bp)) {
                    332:                    sprintf(line+linelen, " %02x", byte);
                    333:                    last = total % DUMP_BYTES_PER_LINE;
                    334:                } else
                    335:                    sprintf(line+linelen, "   ");
                    336:                linelen+=3;
                    337:       
                    338:                bytes[total % DUMP_BYTES_PER_LINE] = byte;
                    339:                total++;
                    340:       
                    341:                if (total % DUMP_BYTES_PER_LINE == 0) {
                    342:                    snprintf(line+linelen, sizeof(line), "  ");
                    343:                    linelen+=2;
                    344:                    for (k = 0; k <= last; k++) {
                    345:                        line[linelen++] = isgraph(bytes[k]) ? bytes[k] : '.';
                    346:                        line[linelen] = 0;
                    347:                    }
                    348:                    LogPrintf("%s",line);
                    349:                    line[0]=' ';
                    350:                    line[1]=' ';
                    351:                    line[2]=' ';
                    352:                    line[3]=0;
                    353:                    linelen=3;
                    354:                }
                    355:            }
                    356:        }
                    357: }
                    358: 
                    359: /*
                    360:  * LogDumpBuf2()
                    361:  *
                    362:  * Dump the contents of a buffer to the log
                    363:  */
                    364: 
                    365: void
                    366: LogDumpBuf2(const u_char *buf, int count, const char *fmt, ...)
                    367: {
                    368:     int                k, stop, total;
                    369:     char       line[128];
                    370:     int                linelen;
                    371:     va_list    ap;
                    372: 
                    373:        /* Do header */
                    374:        va_start(ap, fmt);
                    375:         vLogPrintf(fmt, ap);
                    376:         va_end(ap);
                    377: 
                    378:        /* Do data */
                    379:         line[0]=' ';
                    380:         line[1]=' ';
                    381:         line[2]=' ';
                    382:         line[3]=0;
                    383:         linelen=3;
                    384: 
                    385:         stop = ROUNDUP(count, DUMP_BYTES_PER_LINE);
                    386:         for (total = 0; total < stop; ) {
                    387:            if (total < count)
                    388:                sprintf(line+linelen, " %02x", buf[total]);
                    389:            else
                    390:                sprintf(line+linelen, "   ");
                    391:             linelen+=3;
                    392:            total++;
                    393:            if (total % DUMP_BYTES_PER_LINE == 0) {
                    394:                snprintf(line+linelen, sizeof(line), "  ");
                    395:                linelen+=2;
                    396:                for (k = total - DUMP_BYTES_PER_LINE; k < total && k < count; k++) {
                    397:                    line[linelen++] = isgraph(buf[k]) ? buf[k] : '.';
                    398:                    line[linelen] = 0;
                    399:                }
                    400:                LogPrintf("%s",line);
                    401:                line[0]=' ';
                    402:                line[1]=' ';
                    403:                line[2]=' ';
                    404:                line[3]=0;
                    405:                linelen=3;
                    406:            }
                    407:        }
                    408: }
                    409: 
                    410: /*
                    411:  * Perror()
                    412:  */
                    413: 
                    414: void
                    415: Perror(const char *fmt, ...)
                    416: {
                    417:     va_list    args;
                    418:     char       buf[200];
                    419: 
                    420:     va_start(args, fmt);
                    421:     vsnprintf(buf, sizeof(buf), fmt, args);
                    422:     va_end(args);
                    423:     snprintf(buf + strlen(buf), sizeof(buf) - strlen(buf),
                    424:        ": %s", strerror(errno));
                    425:     Log(LG_ERR, ("%s", buf));
                    426: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>