📄 mib.c
字号:
sprint_badtype(char *buf,
struct variable_list *var,
struct enum_list *enums,
const char *hint,
const char *units)
{
sprintf(buf, "Variable has bad type");
}
static void
sprint_by_type(char *buf,
struct variable_list *var,
struct enum_list *enums,
const char *hint,
const char *units)
{
switch (var->type){
case ASN_INTEGER:
sprint_integer(buf, var, enums, hint, units);
break;
case ASN_OCTET_STR:
sprint_octet_string(buf, var, enums, hint, units);
break;
case ASN_BIT_STR:
sprint_bitstring(buf, var, enums, hint, units);
break;
case ASN_OPAQUE:
sprint_opaque(buf, var, enums, hint, units);
break;
case ASN_OBJECT_ID:
sprint_object_identifier(buf, var, enums, hint, units);
break;
case ASN_TIMETICKS:
sprint_timeticks(buf, var, enums, hint, units);
break;
case ASN_GAUGE:
sprint_gauge(buf, var, enums, hint, units);
break;
case ASN_COUNTER:
sprint_counter(buf, var, enums, hint, units);
break;
case ASN_IPADDRESS:
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;
void
handle_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));
}
void
handle_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));
}
void
handle_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);
}
void
register_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 */
}
void
init_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 */
}
void
print_mib (FILE *fp)
{
print_subtree (fp, tree_head, 0);
}
void
print_ascii_dump (FILE *fp)
{
fprintf(fp, "dump DEFINITIONS ::= BEGIN\n");
print_ascii_dump_tree (fp, tree_head, 0);
fprintf(fp, "END\n");
}
void
set_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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -