int decode_priority( char *optarg, int *pri_max ) { int pri_low = LOG_DEBUG; switch (*optarg) { case '0': case '!': pri_low = LOG_EMERG; break; case '1': case 'a': case 'A': pri_low = LOG_ALERT; break; case '2': case 'c': case 'C': pri_low = LOG_CRIT; break; case '3': case 'e': case 'E': pri_low = LOG_ERR; break; case '4': case 'w': case 'W': pri_low = LOG_WARNING; break; case '5': case 'n': case 'N': pri_low = LOG_NOTICE; break; case '6': case 'i': case 'I': pri_low = LOG_INFO; break; case '7': case 'd': case 'D': pri_low = LOG_DEBUG; break; default: fprintf(stderr, "invalid priority: %c\n",*optarg); return -1; } if (pri_max && *(optarg+1)=='-') { *pri_max = decode_priority( optarg+2, NULL ); if (*pri_max == -1) return -1; } return pri_low; }
int snmp_log_options(char *optarg, int argc, char *const *argv) { char *cp = optarg; /* * Hmmm... this doesn't seem to work. * The main agent 'getopt' handling assumes * that the -L option takes an argument, * and objects if this is missing. * Trying to differentiate between * new-style "-Lx", and old-style "-L xx" * is likely to be a major headache. */ char missing_opt = 'e'; /* old -L is new -Le */ int priority = LOG_DEBUG; int pri_max = LOG_EMERG; int inc_optind = 0; netsnmp_log_handler *logh; DEBUGMSGT(("logging:options", "optarg: '%s', argc %d, argv '%s'\n", optarg, argc, argv ? argv[0] : "NULL")); optarg++; if (!*cp) cp = &missing_opt; /* * Support '... -Lx=value ....' syntax */ if (*optarg == '=') { optarg++; } /* * and '.... "-Lx value" ....' (*with* the quotes) */ while (*optarg && isspace((unsigned char)(*optarg))) { optarg++; } /* * Finally, handle ".... -Lx value ...." syntax * (*without* surrounding quotes) */ if ((!*optarg) && (NULL != argv)) { /* * We've run off the end of the argument * so move on to the next. * But we might not actually need it, so don't * increment optind just yet! */ optarg = argv[optind]; inc_optind = 1; } DEBUGMSGT(("logging:options", "*cp: '%c'\n", *cp)); switch (*cp) { #ifndef NETSNMP_FEATURE_REMOVE_LOGGING_STDIO /* * Log to Standard Error */ case 'E': priority = decode_priority( &optarg, &pri_max ); if (priority == -1) return -1; if (inc_optind) optind++; /* Fallthrough */ case 'e': logh = netsnmp_register_stdio_loghandler(0, priority, pri_max, "stderr"); break; /* * Log to Standard Output */ case 'O': priority = decode_priority( &optarg, &pri_max ); if (priority == -1) return -1; if (inc_optind) optind++; /* Fallthrough */ case 'o': logh = netsnmp_register_stdio_loghandler( 1, priority, pri_max, "stdout" ); break; #endif /* NETSNMP_FEATURE_REMOVE_LOGGING_STDIO */ /* * Log to a named file */ #ifndef NETSNMP_FEATURE_REMOVE_LOGGING_FILE case 'F': priority = decode_priority( &optarg, &pri_max ); if (priority == -1) return -1; while (*optarg == ' ') optarg++; if (!*optarg && !argv) return -1; else if (!*optarg) optarg = argv[++optind]; /* FALL THROUGH */ case 'f': if (inc_optind) optind++; if (!optarg) { fprintf(stderr, "Missing log file\n"); return -1; } DEBUGMSGTL(("logging:options", "%d-%d: '%s'\n", priority, pri_max, optarg)); logh = netsnmp_register_filelog_handler(optarg, priority, pri_max, -1); break; #endif /* NETSNMP_FEATURE_REMOVE_LOGGING_FILE */ #ifndef NETSNMP_FEATURE_REMOVE_LOGGING_SYSLOG /* * Log to syslog */ case 'S': priority = decode_priority( &optarg, &pri_max ); if (priority == -1 || !argv) return -1; if (!optarg[0]) { /* The command line argument with priority does not contain log * facility. The facility must be in next argument then. */ optind++; if (optind < argc) optarg = argv[optind]; } /* Fallthrough */ case 's': if (inc_optind) optind++; if (!optarg) { fprintf(stderr, "Missing syslog facility\n"); return -1; } logh = netsnmp_register_loghandler(NETSNMP_LOGHANDLER_SYSLOG, priority); if (logh) { int facility = decode_facility(optarg); if (facility == -1) { netsnmp_remove_loghandler(logh); return -1; } logh->pri_max = pri_max; logh->token = strdup(snmp_log_syslogname(NULL)); logh->magic = (void *)(intptr_t)facility; snmp_enable_syslog_ident(snmp_log_syslogname(NULL), facility); } break; #endif /* NETSNMP_FEATURE_REMOVE_LOGGING_SYSLOG */ /* * Don't log */ case 'N': priority = decode_priority( &optarg, &pri_max ); if (priority == -1) return -1; if (inc_optind) optind++; /* Fallthrough */ case 'n': /* * disable all logs to clean them up (close files, etc), * remove all log handlers, then register a null handler. */ snmp_disable_log(); while(NULL != logh_head) netsnmp_remove_loghandler( logh_head ); logh = netsnmp_register_loghandler(NETSNMP_LOGHANDLER_NONE, priority); if (logh) { logh->pri_max = pri_max; } break; default: fprintf(stderr, "Unknown logging option passed to -L: %c.\n", *cp); return -1; } return 0; }
/* * Decodes log priority. * @param optarg - IN - priority to decode, "0" or "0-7" * OUT - points to last character after the decoded priority * @param pri_max - OUT - maximum priority (i.e. 0x7 from "0-7") */ static int decode_priority( char **optarg, int *pri_max ) { int pri_low = LOG_DEBUG; if (*optarg == NULL) return -1; switch (**optarg) { case '0': case '!': pri_low = LOG_EMERG; break; case '1': case 'a': case 'A': pri_low = LOG_ALERT; break; case '2': case 'c': case 'C': pri_low = LOG_CRIT; break; case '3': case 'e': case 'E': pri_low = LOG_ERR; break; case '4': case 'w': case 'W': pri_low = LOG_WARNING; break; case '5': case 'n': case 'N': pri_low = LOG_NOTICE; break; case '6': case 'i': case 'I': pri_low = LOG_INFO; break; case '7': case 'd': case 'D': pri_low = LOG_DEBUG; break; default: fprintf(stderr, "invalid priority: %c\n",**optarg); return -1; } *optarg = *optarg+1; if (pri_max && **optarg=='-') { *optarg = *optarg + 1; /* skip '-' */ *pri_max = decode_priority( optarg, NULL ); if (*pri_max == -1) return -1; if (pri_low < *pri_max) { int tmp = pri_low; pri_low = *pri_max; *pri_max = tmp; } } return pri_low; }
int snmp_log_options(char *optarg, int argc, char *const *argv) { char *cp = optarg; /* * Hmmm... this doesn't seem to work. * The main agent 'getopt' handling assumes * that the -L option takes an argument, * and objects if this is missing. * Trying to differentiate between * new-style "-Lx", and old-style "-L xx" * is likely to be a major headache. */ char missing_opt = 'e'; /* old -L is new -Le */ int priority = LOG_DEBUG; int pri_max = LOG_EMERG; int inc_optind = 0; netsnmp_log_handler *logh; optarg++; if (!*cp) cp = &missing_opt; /* * Support '... -Lx=value ....' syntax */ if (*optarg == '=') { optarg++; } /* * and '.... "-Lx value" ....' (*with* the quotes) */ while (*optarg && isspace(*optarg)) { optarg++; } /* * Finally, handle ".... -Lx value ...." syntax * (*without* surrounding quotes) */ if ((!*optarg) && (NULL != argv)) { /* * We've run off the end of the argument * so move on to the next. * But we might not actually need it, so don't * increment optind just yet! */ optarg = argv[optind]; inc_optind = 1; } switch (*cp) { /* * Log to Standard Error */ case 'E': priority = decode_priority( &optarg, &pri_max ); if (priority == -1) return -1; if (inc_optind) optind++; /* Fallthrough */ case 'e': logh = netsnmp_register_loghandler(NETSNMP_LOGHANDLER_STDERR, priority); if (logh) { logh->pri_max = pri_max; logh->token = strdup("stderr"); } break; /* * Log to Standard Output */ case 'O': priority = decode_priority( &optarg, &pri_max ); if (priority == -1) return -1; if (inc_optind) optind++; /* Fallthrough */ case 'o': logh = netsnmp_register_loghandler(NETSNMP_LOGHANDLER_STDERR, priority); if (logh) { logh->pri_max = pri_max; logh->token = strdup("stdout"); logh->imagic = 1; /* stdout, not stderr */ } break; /* * Log to a named file */ case 'F': priority = decode_priority( &optarg, &pri_max ); if (priority == -1 || !argv) return -1; optarg = argv[++optind]; /* Fallthrough */ case 'f': if (inc_optind) optind++; if (!optarg) { fprintf(stderr, "Missing log file\n"); return -1; } logh = netsnmp_register_loghandler(NETSNMP_LOGHANDLER_FILE, priority); if (logh) { logh->pri_max = pri_max; logh->token = strdup(optarg); netsnmp_enable_filelog(logh, netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_APPEND_LOGFILES)); } break; /* * Log to syslog */ case 'S': priority = decode_priority( &optarg, &pri_max ); if (priority == -1 || !argv) return -1; if (!optarg[0]) { /* The command line argument with priority does not contain log * facility. The facility must be in next argument then. */ optind++; if (optind < argc) optarg = argv[optind]; } /* Fallthrough */ case 's': if (inc_optind) optind++; if (!optarg) { fprintf(stderr, "Missing syslog facility\n"); return -1; } logh = netsnmp_register_loghandler(NETSNMP_LOGHANDLER_SYSLOG, priority); if (logh) { int facility = decode_facility(optarg); if (facility == -1) return -1; logh->pri_max = pri_max; logh->token = strdup(snmp_log_syslogname(0)); logh->magic = (void *)(intptr_t)facility; snmp_enable_syslog_ident(snmp_log_syslogname(0), facility); } break; /* * Don't log */ case 'N': priority = decode_priority( &optarg, &pri_max ); if (priority == -1) return -1; if (inc_optind) optind++; /* Fallthrough */ case 'n': /* * disable all logs to clean them up (close files, etc), * remove all log handlers, then register a null handler. */ snmp_disable_log(); while(NULL != logh_head) netsnmp_remove_loghandler( logh_head ); logh = netsnmp_register_loghandler(NETSNMP_LOGHANDLER_NONE, priority); if (logh) { logh->pri_max = pri_max; } break; default: fprintf(stderr, "Unknown logging option passed to -L: %c.\n", *cp); return -1; } return 0; }