int show_all_matched_objects(FILE * fp, const char *patmatch, oid * name, size_t * name_length, int f_desc, /* non-zero if descriptions should be shown */ int width) { int result = 0, count = 0; size_t savlen = *name_length; #ifndef NETSNMP_DISABLE_MIB_LOADING clear_tree_flags(get_tree_head()); #endif /* NETSNMP_DISABLE_MIB_LOADING */ while (1) { *name_length = savlen; #ifndef NETSNMP_DISABLE_MIB_LOADING result = get_wild_node(patmatch, name, name_length); #endif /* NETSNMP_DISABLE_MIB_LOADING */ if (!result) break; count++; fprint_objid(fp, name, *name_length); #ifndef NETSNMP_DISABLE_MIB_LOADING if (f_desc) fprint_description(fp, name, *name_length, width); #endif /* NETSNMP_DISABLE_MIB_LOADING */ } return (count); }
oid *snmp_parse_oid(const char *argv, oid *root, size_t *rootlen) { size_t savlen = *rootlen; /* printf("parse_oid: read_objid\n"); */ if (read_objid(argv,root,rootlen)) { return root; } *rootlen = savlen; /* printf("parse_oid: get_node\n"); */ if (get_node(argv,root,rootlen)) { return root; } *rootlen = savlen; /* printf("parse_oid: wildly parsing\n"); */ if (get_wild_node(argv,root,rootlen)) { return root; } return NULL; }
int show_all_matched_objects(FILE * fp, const char *patmatch, oid * name, size_t * name_length, int f_desc, /* non-zero if descriptions should be shown */ int width) { int result, count = 0; size_t savlen = *name_length; clear_tree_flags(get_tree_head()); while (1) { *name_length = savlen; result = get_wild_node(patmatch, name, name_length); if (!result) break; count++; fprint_objid(fp, name, *name_length); if (f_desc) fprint_description(fp, name, *name_length, width); } return (count); }
unsigned int encode_vbind (char *oid_string, char oid_asntype, union t_val *value, unsigned char *out_buffer, size_t out_size) { oid var_name[MAX_OID_LEN]; size_t name_len = MAX_OID_LEN; oid oid_value[MAX_OID_LEN]; size_t oid_value_len = MAX_OID_LEN; unsigned char *data_ptr; unsigned char buf[SPRINT_MAX_LEN]; unsigned int ltmp; struct tree *tp; struct range_list *rp; long len=0; int rv; long longval; unsigned long ulongval; memset (buf, 0, SPRINT_MAX_LEN); if (!get_node (oid_string, var_name, &name_len)) { if (!read_objid (oid_string, var_name, &name_len)) { /* enable random access */ if (!netsnmp_ds_get_boolean (NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_RANDOM_ACCESS)) { netsnmp_ds_toggle_boolean (NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_RANDOM_ACCESS); } if (!get_node (oid_string, var_name, &name_len)) { /* Not found, try UCD style OID access */ netsnmp_ds_toggle_boolean (NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_READ_UCD_STYLE_OID); if (!netsnmp_ds_get_boolean (NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_READ_UCD_STYLE_OID)) { netsnmp_ds_toggle_boolean (NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_READ_UCD_STYLE_OID); } if (!read_objid (oid_string, var_name, &name_len)) { /* Hmm, still not found, go back to net-snmp-style OID and try regex access */ netsnmp_ds_toggle_boolean (NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_READ_UCD_STYLE_OID); if (!netsnmp_ds_get_boolean (NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_REGEX_ACCESS)) { netsnmp_ds_toggle_boolean (NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_REGEX_ACCESS); } if (!get_wild_node (oid_string, var_name, &name_len)) { /* Ran out of ideas. */ fprintf(stderr, "/* Error: Can't find oid %s at line %d */\n", oid_string, line); snmp_perror ("encode_vbind"); return 0; } } } } } switch (oid_asntype) { case 'i': longval = value->intval; data_ptr = _docsis_snmp_build_var_op (out_buffer, var_name, &name_len, ASN_INTEGER, sizeof (long), (unsigned char *) &longval, &out_size); return data_ptr - out_buffer; break; ;; case 'g': ulongval = value->intval; data_ptr = _docsis_snmp_build_var_op (out_buffer, var_name, &name_len, ASN_GAUGE, sizeof (unsigned long), (unsigned char *) &ulongval, &out_size); return data_ptr - out_buffer; break; ;; case 'c': ulongval = value->intval; data_ptr = _docsis_snmp_build_var_op (out_buffer, var_name, &name_len, ASN_COUNTER, sizeof (unsigned long), (unsigned char *) &ulongval, &out_size); return data_ptr - out_buffer; break; ;; case 'u': ulongval = value->intval; data_ptr = _docsis_snmp_build_var_op (out_buffer, var_name, &name_len, ASN_GAUGE, sizeof (unsigned long), (unsigned char *) &ulongval, &out_size); return data_ptr - out_buffer; break; ;; case 't': ulongval = value->intval; data_ptr = _docsis_snmp_build_var_op (out_buffer, var_name, &name_len, ASN_TIMETICKS, sizeof (unsigned long), (unsigned char *) &ulongval, &out_size); return data_ptr - out_buffer; break; ;; case 's': case 'x': case 'd': if (oid_asntype == 'd') { /* ltmp = ascii_to_binary(value->strval, buf); strncpy((char*)buf, value, SPRINT_MAX_BUF); ltmp = strlen((char*)buf); */ } else if (oid_asntype == 's') { strncpy ((char *) buf, value->strval, SPRINT_MAX_LEN); len = strlen ((char *) buf); } else if (oid_asntype == 'x') { if ((rv = hexadecimal_to_binary (value->strval, buf)) == -1) { fprintf(stderr, "Invalid hexadecimal string at line %d\n", line); return 0; } ltmp = (unsigned int) rv; len = ltmp; } if (len < 0 || len > SPRINT_MAX_LEN - 1) { fprintf(stderr, "String too long at line %d, max allowed %d\n", line, SPRINT_MAX_LEN); return 0; break; } tp = get_tree (var_name, name_len, get_tree_head ()); if (tp && tp->ranges && !netsnmp_ds_get_boolean (NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_DONT_CHECK_RANGE)) { rp = tp->ranges; while (rp) { if (rp->low <= len && len <= rp->high) break; rp = rp->next; } if (!rp) { fprintf(stderr, "Value too long at line %d\n", line); return 0; break; } } /* If length is more than 127, won't fit into a 1-byte quantity */ if (len+name_len+8 < 0x7f ) { data_ptr = _docsis_snmp_build_var_op (out_buffer, var_name, &name_len, ASN_OCTET_STR, len, (unsigned char *) buf, &out_size); } else { data_ptr = snmp_build_var_op (out_buffer, var_name, &name_len, ASN_OCTET_STR, len, (unsigned char *) buf, &out_size); } #ifdef DEBUG fprintf (stderr, "encoded len %ld var_len %d leftover %ud difference %d\n", len, name_len, out_size, (data_ptr - out_buffer) ); #endif return data_ptr - out_buffer; break; ;; case 'a': if (!inet_aton (value->strval, (struct in_addr *) <mp)) { fprintf(stderr, "Invalid IP address %s at line %d\n", value->strval, line); return 0; } data_ptr = _docsis_snmp_build_var_op (out_buffer, var_name, &name_len, ASN_IPADDRESS, sizeof (struct in_addr), (unsigned char *) <mp, &out_size); return data_ptr - out_buffer; break; ;; case 'o': strncpy ((char *) buf, value->strval, SPRINT_MAX_LEN); len = strlen ((char *) buf); if (!read_objid ((char *) buf, oid_value, &oid_value_len)) { fprintf(stderr, "Can't find oid %s at line %d\n", buf, line); return 0; } data_ptr = _docsis_snmp_build_var_op (out_buffer, var_name, &name_len, ASN_OBJECT_ID, oid_value_len*sizeof(oid), (unsigned char *) &oid_value, &out_size); return data_ptr - out_buffer; break; ;; default: fprintf(stderr, "Variable type %s not supported yet\n", &oid_asntype); return 0; ;; } /* NOTREACHED */ }
int main(int argc, char *argv[]) { int arg; char *current_name = NULL, *cp = NULL; oid name[MAX_OID_LEN]; size_t name_length; int description = 0; int print = 0; int find_all = 0; int width = 1000000; /* * usage: snmptranslate name */ while ((arg = getopt(argc, argv, "Vhm:M:w:D:P:T:O:I:L:")) != EOF) { switch (arg) { case 'h': usage(); exit(1); case 'm': setenv("MIBS", optarg, 1); break; case 'M': setenv("MIBDIRS", optarg, 1); break; case 'D': debug_register_tokens(optarg); snmp_set_do_debugging(1); break; case 'V': fprintf(stderr, "NET-SNMP version: %s\n", netsnmp_get_version()); exit(0); break; case 'w': width = atoi(optarg); if (width <= 0) { fprintf(stderr, "Invalid width specification: %s\n", optarg); exit (1); } break; #ifndef NETSNMP_DISABLE_MIB_LOADING case 'P': cp = snmp_mib_toggle_options(optarg); if (cp != NULL) { fprintf(stderr, "Unknown parser option to -P: %c.\n", *cp); usage(); exit(1); } break; #endif /* NETSNMP_DISABLE_MIB_LOADING */ case 'O': cp = snmp_out_toggle_options(optarg); if (cp != NULL) { fprintf(stderr, "Unknown OID option to -O: %c.\n", *cp); usage(); exit(1); } break; case 'I': cp = snmp_in_toggle_options(optarg); if (cp != NULL) { fprintf(stderr, "Unknown OID option to -I: %c.\n", *cp); usage(); exit(1); } break; case 'T': for (cp = optarg; *cp; cp++) { switch (*cp) { #ifndef NETSNMP_DISABLE_MIB_LOADING case 'l': print = 3; print_oid_report_enable_labeledoid(); break; case 'o': print = 3; print_oid_report_enable_oid(); break; case 's': print = 3; print_oid_report_enable_symbolic(); break; case 't': print = 3; print_oid_report_enable_suffix(); break; case 'z': print = 3; print_oid_report_enable_mibchildoid(); break; #endif /* NETSNMP_DISABLE_MIB_LOADING */ case 'd': description = 1; snmp_set_save_descriptions(1); break; case 'B': find_all = 1; break; case 'p': print = 1; break; case 'a': print = 2; break; default: fprintf(stderr, "Invalid -T<lostpad> character: %c\n", *cp); usage(); exit(1); break; } } break; case 'L': if (snmp_log_options(optarg, argc, argv) < 0) { return (-1); } break; default: fprintf(stderr, "invalid option: -%c\n", arg); usage(); exit(1); break; } } init_snmp("snmpapp"); if (optind < argc) current_name = argv[optind]; if (current_name == NULL) { switch (print) { default: usage(); exit(1); #ifndef NETSNMP_DISABLE_MIB_LOADING case 1: print_mib_tree(stdout, get_tree_head(), width); break; case 2: print_ascii_dump(stdout); break; case 3: print_oid_report(stdout); break; #endif /* NETSNMP_DISABLE_MIB_LOADING */ } exit(0); } do { name_length = MAX_OID_LEN; if (snmp_get_random_access()) { #ifndef NETSNMP_DISABLE_MIB_LOADING if (!get_node(current_name, name, &name_length)) { #endif /* NETSNMP_DISABLE_MIB_LOADING */ fprintf(stderr, "Unknown object identifier: %s\n", current_name); exit(2); #ifndef NETSNMP_DISABLE_MIB_LOADING } #endif /* NETSNMP_DISABLE_MIB_LOADING */ } else if (find_all) { if (0 == show_all_matched_objects(stdout, current_name, name, &name_length, description, width)) { fprintf(stderr, "Unable to find a matching object identifier for \"%s\"\n", current_name); exit(1); } exit(0); } else if (netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_REGEX_ACCESS)) { #ifndef NETSNMP_DISABLE_MIB_LOADING if (0 == get_wild_node(current_name, name, &name_length)) { #endif /* NETSNMP_DISABLE_MIB_LOADING */ fprintf(stderr, "Unable to find a matching object identifier for \"%s\"\n", current_name); exit(1); #ifndef NETSNMP_DISABLE_MIB_LOADING } #endif /* NETSNMP_DISABLE_MIB_LOADING */ } else { if (!read_objid(current_name, name, &name_length)) { snmp_perror(current_name); exit(2); } } if (print == 1) { #ifndef NETSNMP_DISABLE_MIB_LOADING struct tree *tp; tp = get_tree(name, name_length, get_tree_head()); if (tp == NULL) { #endif /* NETSNMP_DISABLE_MIB_LOADING */ snmp_log(LOG_ERR, "Unable to find a matching object identifier for \"%s\"\n", current_name); exit(1); #ifndef NETSNMP_DISABLE_MIB_LOADING } print_mib_tree(stdout, tp, width); #endif /* NETSNMP_DISABLE_MIB_LOADING */ } else { print_objid(name, name_length); if (description) { #ifndef NETSNMP_DISABLE_MIB_LOADING print_description(name, name_length, width); #endif /* NETSNMP_DISABLE_MIB_LOADING */ } } current_name = argv[++optind]; if (current_name != NULL) printf("\n"); } while (optind < argc); return (0); }