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 + -
显示快捷键?