mib.c

来自「eCos操作系统源码」· C语言 代码 · 共 2,472 行 · 第 1/5 页

C
2,472
字号
	    sprint_ipaddress(buf, var, enums, hint, units);	    break;	case ASN_NULL:	    sprint_null(buf, var, enums, hint, units);	    break;	case ASN_UINTEGER:	    sprint_uinteger(buf, var, enums, hint, units);	    break;	case ASN_COUNTER64:#ifdef OPAQUE_SPECIAL_TYPES	case ASN_OPAQUE_U64:	case ASN_OPAQUE_I64:	case ASN_OPAQUE_COUNTER64:#endif /* OPAQUE_SPECIAL_TYPES */	    sprint_counter64(buf, var, enums, hint, units);	    break;#ifdef OPAQUE_SPECIAL_TYPES	case ASN_OPAQUE_FLOAT:	    sprint_float(buf, var, enums, hint, units);	    break;	case ASN_OPAQUE_DOUBLE:	    sprint_double(buf, var, enums, hint, units);	    break;#endif /* OPAQUE_SPECIAL_TYPES */	default:            DEBUGMSGTL(("sprint_by_type", "bad type: %d\n", var->type));	    sprint_badtype(buf, var, enums, hint, units);	    break;    }}struct tree *get_tree_head(void){   return(tree_head);}static char *confmibdir=NULL;static char *confmibs=NULL;voidhandle_mibdirs_conf(const char *token,		    char *line){    char *ctmp;    if (confmibdir) {        ctmp = (char *)malloc(strlen(confmibdir) + strlen(line) + 1);        if (*line == '+')            line++;        sprintf(ctmp,"%s%c%s",confmibdir, ENV_SEPARATOR_CHAR, line);        free(confmibdir);        confmibdir = ctmp;    } else {        confmibdir=strdup(line);    }    DEBUGMSGTL(("read_config:initmib", "using mibdirs: %s\n", confmibdir));}voidhandle_mibs_conf(const char *token,		 char *line){    char *ctmp;    if (confmibs) {        ctmp = (char *)malloc(strlen(confmibs) + strlen(line) + 1);        if (*line == '+')            line++;        sprintf(ctmp,"%s%c%s",confmibs, ENV_SEPARATOR_CHAR, line);        free(confmibs);        confmibs = ctmp;    } else {        confmibs=strdup(line);    }    DEBUGMSGTL(("read_config:initmib", "using mibs: %s\n", confmibs));}voidhandle_mibfile_conf(const char *token,		    char *line){  DEBUGMSGTL(("read_config:initmib", "reading mibfile: %s\n", line));  read_mib(line);}char *snmp_out_toggle_options(char *options){    while(*options) {        switch(*options++) {        case 'n':            ds_toggle_boolean(DS_LIBRARY_ID, DS_LIB_PRINT_NUMERIC_OIDS);            break;        case 'e':            ds_toggle_boolean(DS_LIBRARY_ID, DS_LIB_PRINT_NUMERIC_ENUM);            break;        case 'b':            ds_toggle_boolean(DS_LIBRARY_ID, DS_LIB_DONT_BREAKDOWN_OIDS);            break;	case 'q':	    ds_toggle_boolean(DS_LIBRARY_ID, DS_LIB_QUICK_PRINT);	    break;        case 'f':            ds_toggle_boolean(DS_LIBRARY_ID, DS_LIB_PRINT_FULL_OID);	    break;        case 's':	    snmp_set_suffix_only(1);	    break;        case 'S':	    snmp_set_suffix_only(2);	    break;        default:	    return options-1;	}    }    return NULL;}void snmp_out_toggle_options_usage(const char *lead, FILE *outf){  fprintf(outf, "%sOUTOPTS values:\n", lead);  fprintf(outf, "%s    n: Print oids numerically.\n", lead);  fprintf(outf, "%s    e: Print enums numerically.\n", lead);  fprintf(outf, "%s    b: Dont break oid indexes down.\n", lead);  fprintf(outf, "%s    q: Quick print for easier parsing.\n", lead);  fprintf(outf, "%s    f: Print full oids on output.\n", lead);  fprintf(outf, "%s    s: Print only last symbolic element of oid.\n", lead);  fprintf(outf, "%s    S: Print MIB module-id plus last element.\n", lead);}char *snmp_in_toggle_options(char *options){    while(*options) {        switch(*options++) {	case 'R':	    ds_toggle_boolean(DS_LIBRARY_ID, DS_LIB_RANDOM_ACCESS);	    break;	case 'b':	    ds_toggle_boolean(DS_LIBRARY_ID, DS_LIB_REGEX_ACCESS);	    break;        default:	    return options-1;	}    }    return NULL;}void snmp_in_toggle_options_usage(const char *lead, FILE *outf){  fprintf(outf, "%sINOPTS values:\n", lead);  fprintf(outf, "%s    R: Do random access to oid labels.\n", lead);  fprintf(outf, "%s    b: Do best/regex matching to find a MIB node.\n", lead);}voidregister_mib_handlers (void) {    register_premib_handler("snmp","mibdirs",			    handle_mibdirs_conf, NULL,			    "[mib-dirs|+mib-dirs]");    register_premib_handler("snmp","mibs",			    handle_mibs_conf,NULL,			    "[mib-tokens|+mib-tokens]");    register_config_handler("snmp","mibfile",			    handle_mibfile_conf, NULL,			    "mibfile-to-read");    /* register the snmp.conf configuration handlers for default       parsing behaviour */        ds_register_premib(ASN_BOOLEAN, "snmp","showMibErrors",                       DS_LIBRARY_ID, DS_LIB_MIB_ERRORS);    ds_register_premib(ASN_BOOLEAN, "snmp","strictCommentTerm",                       DS_LIBRARY_ID, DS_LIB_MIB_COMMENT_TERM);    ds_register_premib(ASN_BOOLEAN, "snmp","mibAllowUnderline",                       DS_LIBRARY_ID, DS_LIB_MIB_PARSE_LABEL);    ds_register_premib(ASN_INTEGER, "snmp","mibWarningLevel",                       DS_LIBRARY_ID, DS_LIB_MIB_WARNINGS);    ds_register_premib(ASN_BOOLEAN, "snmp","mibReplaceWithLatest",                       DS_LIBRARY_ID, DS_LIB_MIB_REPLACE);    ds_register_config(ASN_BOOLEAN, "snmp","printNumericEnums",                       DS_LIBRARY_ID, DS_LIB_PRINT_NUMERIC_ENUM);    ds_register_config(ASN_BOOLEAN, "snmp","printNumericOids",                       DS_LIBRARY_ID, DS_LIB_PRINT_NUMERIC_OIDS);    ds_register_config(ASN_BOOLEAN, "snmp","dontBreakdownOids",                       DS_LIBRARY_ID, DS_LIB_DONT_BREAKDOWN_OIDS);    ds_register_config(ASN_BOOLEAN, "snmp","quickPrinting",                       DS_LIBRARY_ID, DS_LIB_QUICK_PRINT);    ds_register_config(ASN_INTEGER, "snmp","suffixPrinting",                       DS_LIBRARY_ID, DS_LIB_PRINT_SUFFIX_ONLY);        /* setup the default parser configurations, as specified by configure */#ifdef MIB_COMMENT_IS_EOL_TERMINATED    ds_set_boolean(DS_LIBRARY_ID, DS_LIB_MIB_COMMENT_TERM, 1);#else  /* !MIB_COMMENT_IS_EOL_TERMINATED */    ds_set_boolean(DS_LIBRARY_ID, DS_LIB_MIB_COMMENT_TERM, 0);#endif /* !MIB_COMMENT_IS_EOL_TERMINATED */}voidinit_mib (void){    const char *prefix;    char  *env_var, *entry;    PrefixListPtr pp = &mib_prefixes[0];    char *new_mibdirs, *homepath, *cp_home;        if (Mib) return;    /* Initialise the MIB directory/ies */    /* we can't use the environment variable directly, because strtok       will modify it. */        env_var = getenv("MIBDIRS");    if ( env_var == NULL ) {	if (confmibdir != NULL)	    env_var = strdup(confmibdir);	else	    env_var = strdup(DEFAULT_MIBDIRS);    } else {	env_var = strdup(env_var);    }    if (*env_var == '+') {	entry = (char *)malloc(strlen(DEFAULT_MIBDIRS)+strlen(env_var)+2);	sprintf(entry, "%s%c%s", DEFAULT_MIBDIRS, ENV_SEPARATOR_CHAR, env_var+1);	free(env_var);	env_var = entry;    }    /* replace $HOME in the path with the users home directory */    homepath=getenv("HOME");    if (homepath) {      while((cp_home = strstr(env_var, "$HOME"))) {        new_mibdirs = (char *) malloc(strlen(env_var) - strlen("$HOME") +                                      strlen(homepath)+1);        *cp_home = 0; /* null out the spot where we stop copying */        sprintf(new_mibdirs, "%s%s%s", env_var, homepath,                cp_home + strlen("$HOME"));        /* swap in the new value and repeat */        free(env_var);        env_var = new_mibdirs;      }    }        DEBUGMSGTL(("init_mib","Seen MIBDIRS: Looking in '%s' for mib dirs ...\n",env_var));        entry = strtok( env_var, ENV_SEPARATOR );    while ( entry ) {        add_mibdir(entry);        entry = strtok( NULL, ENV_SEPARATOR);    }    free(env_var);        init_mib_internals();    /* Read in any modules or mibs requested */        env_var = getenv("MIBS");    if ( env_var == NULL ) {	if (confmibs != NULL)        env_var = strdup(confmibs);	else	    env_var = strdup(DEFAULT_MIBS);    } else {	env_var = strdup(env_var);    }    if (*env_var == '+') {	entry = (char *)malloc(strlen(DEFAULT_MIBS)+strlen(env_var)+2);	sprintf(entry, "%s%c%s", DEFAULT_MIBS, ENV_SEPARATOR_CHAR, env_var+1);	free(env_var);	env_var = entry;    }        DEBUGMSGTL(("init_mib","Seen MIBS: Looking in '%s' for mib files ...\n",env_var));    entry = strtok( env_var, ENV_SEPARATOR );    while ( entry ) {        if (strcasecmp(entry, DEBUG_ALWAYS_TOKEN) == 0) {            read_all_mibs();        }        else if (strstr (entry, "/") != 0) {            read_mib(entry);        }        else {            read_module(entry);        }	    entry = strtok( NULL, ENV_SEPARATOR);    }    adopt_orphans();    free(env_var);        env_var = getenv("MIBFILES");    if ( env_var != NULL ) {	if (*env_var == '+') {#ifdef DEFAULT_MIBFILES	    entry = (char *)malloc(strlen(DEFAULT_MIBFILES)+strlen(env_var)+2);	    sprintf(entry, "%s%c%s", DEFAULT_MIBFILES, ENV_SEPARATOR_CHAR,		    env_var+1);	    free(env_var);	    env_var = entry;#else	    env_var = strdup(env_var+1);#endif	} else {	    env_var = strdup(env_var);	}    } else {#ifdef DEFAULT_MIBFILES	env_var = strdup(DEFAULT_MIBFILES);#endif    }    if ( env_var != 0 ) {	DEBUGMSGTL(("init_mib","Seen MIBFILES: Looking in '%s' for mib files ...\n",env_var));	entry = strtok( env_var, ENV_SEPARATOR );	while ( entry ) {	    read_mib(entry);	    entry = strtok( NULL, ENV_SEPARATOR);	}	free(env_var);    }        prefix = getenv("PREFIX");        if (!prefix)        prefix = Standard_Prefix;    Prefix = (char*)malloc(strlen(prefix)+2);    strcpy(Prefix, prefix);    DEBUGMSGTL(("init_mib","Seen PREFIX: Looking in '%s' for prefix ...\n", Prefix));        /* remove trailing dot */    env_var = &Prefix[strlen(Prefix) - 1];    if (*env_var == '.') *env_var = '\0';    pp->str = Prefix;	/* fixup first mib_prefix entry */    /* now that the list of prefixes is built, save each string length. */    while (pp->str) {	pp->len = strlen(pp->str);	pp++;    }    if (getenv("SUFFIX"))	ds_set_boolean(DS_LIBRARY_ID, DS_LIB_PRINT_SUFFIX_ONLY, 1);    Mib = tree_head;          /* Backwards compatibility */}voidprint_mib (FILE *fp){    print_subtree (fp, tree_head, 0);}voidprint_ascii_dump (FILE *fp){  fprintf(fp, "dump DEFINITIONS ::= BEGIN\n");  print_ascii_dump_tree (fp, tree_head, 0);  fprintf(fp, "END\n");}voidset_function(struct tree *subtree){    switch(subtree->type){	case TYPE_OBJID:	    subtree->printer = sprint_object_identifier;	    break;	    case TYPE_OCTETSTR:		subtree->printer = sprint_octet_string;		break;	    case TYPE_INTEGER:		subtree->printer = sprint_integer;		break;	    case TYPE_NETADDR:		subtree->printer = sprint_networkaddress;		break;	    case TYPE_IPADDR:		subtree->printer = sprint_ipaddress;		break;	    case TYPE_COUNTER:		subtree->printer = sprint_counter;		break;	    case TYPE_GAUGE:		subtree->printer = sprint_gauge;		break;	    case TYPE_TIMETICKS:		subtree->printer = sprint_timeticks;		break;	    case TYPE_OPAQUE:		subtree->printer = sprint_opaque;		break;	    case TYPE_NULL:		subtree->printer = sprint_null;		break;	    case TYPE_BITSTRING:		subtree->printer = sprint_bitstring;		break;	    case TYPE_NSAPADDRESS:		subtree->printer = sprint_nsapaddress;		break;	    case TYPE_COUNTER64:		subtree->printer = sprint_counter64;		break;	    case TYPE_UINTEGER:		subtree->printer = sprint_uinteger;		break;	    case TYPE_OTHER:	    default:		subtree->printer = sprint_unknowntype;		break;	}}/* * Read an object identifier from input string into internal OID form. * Returns 1 if successful. * If an error occurs, this function returns 0 and MAY set snmp_errno. * snmp_errno is NOT set if SET_SNMP_ERROR evaluates to nothing. * This can make multi-threaded use a tiny bit more robust. */int read_objid(const char *input,	       oid *output,	       size_t *out_len)   /* number of subid's in "output" */{    struct tree *root = tree_head;    char buf[SPRINT_MAX_LEN];    int ret;    if (strchr(input, ':')) {	return get_node(input, output, out_len);    }    if (*input == '.')	input++;    else {    /* get past leading '.', append '.' to Prefix. */	if (*Prefix == '.')	    strcpy(buf, Prefix+1);	else            strcpy(buf, Prefix);	strcat(buf, ".");	strcat(buf, input);	input = buf;    }    if (root == NULL){	SET_SNMP_ERROR(SNMPERR_NOMIB);	*out_len = 0;	return(0);    }    if ((ret = parse_subtree(root, input, output, out_len)) <= 0)    {	int errc = (ret ? ret : SNMPERR_UNKNOWN_OBJID);	SET_SNMP_ERROR(errc);	return (0);    }    *out_len = ret;    return (1);}/* * RECURSIVE helper methods for read_objid * Returns: * < 0  the SNMPERR_ errorcode * = 0  input string is empty. * > 0  the number of sub-identifiers found in the input string. */ static intparse_subtree(struct tree *subtree,	      const char *input,	      oid *output,	      size_t *out_len)   /* number of subid's */{    char buf[SPRINT_MAX_LEN], *to = buf, *cp;    u_long subid = 0;    struct tree *tp;    int ret, len;    /*     * No empty strings.  Can happen if there is a trailing '.' or two '.'s     * in a row, i.e. "..".     */    if ((*input == '\0') ||	(*input == '.'))	return (0);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?