📄 snmp.xs
字号:
case SNMP_NOSUCHOBJECT: case SNMP_NOSUCHINSTANCE: return(type); break; case ASN_UINTEGER: return(TYPE_UINTEGER); break; case ASN_COUNTER64: return(TYPE_COUNTER64); break; default: warn("translate_asn_type: unhandled asn type (%d)\n",type); return(TYPE_OTHER); break; }}#define USE_BASIC 0#define USE_ENUMS 1#define USE_SPRINT_VALUE 2static int__snprint_value (buf, buf_len, var, tp, type, flag)char * buf;size_t buf_len;netsnmp_variable_list * var;struct tree * tp;int type;int flag;{ int len = 0; u_char* ip; struct enum_list *ep; buf[0] = '\0'; if (flag == USE_SPRINT_VALUE) { snprint_value(buf, buf_len, var->name, var->name_length, var); len = strlen(buf); } else { switch (var->type) { case ASN_INTEGER: if (flag == USE_ENUMS) { for(ep = tp->enums; ep; ep = ep->next) { if (ep->value == *var->val.integer) { strcpy(buf, ep->label); len = strlen(buf); break; } } } if (!len) { sprintf(buf,"%ld", *var->val.integer); len = strlen(buf); } break; case ASN_GAUGE: case ASN_COUNTER: case ASN_TIMETICKS: case ASN_UINTEGER: sprintf(buf,"%lu", (unsigned long) *var->val.integer); len = strlen(buf); break; case ASN_OCTET_STR: case ASN_OPAQUE: memcpy(buf, (char*)var->val.string, var->val_len); len = var->val_len; break; case ASN_IPADDRESS: ip = (u_char*)var->val.string; sprintf(buf, "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]); len = strlen(buf); break; case ASN_NULL: break; case ASN_OBJECT_ID: __sprint_num_objid(buf, (oid *)(var->val.objid), var->val_len/sizeof(oid)); len = strlen(buf); break; case SNMP_ENDOFMIBVIEW: sprintf(buf,"%s", "ENDOFMIBVIEW"); break; case SNMP_NOSUCHOBJECT: sprintf(buf,"%s", "NOSUCHOBJECT"); break; case SNMP_NOSUCHINSTANCE: sprintf(buf,"%s", "NOSUCHINSTANCE"); break; case ASN_COUNTER64:#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES case ASN_OPAQUE_COUNTER64: case ASN_OPAQUE_U64:#endif printU64(buf,(struct counter64 *)var->val.counter64); len = strlen(buf); break;#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES case ASN_OPAQUE_I64: printI64(buf,(struct counter64 *)var->val.counter64); len = strlen(buf); break;#endif case ASN_BIT_STR: snprint_bitstring(buf, sizeof(buf), var, NULL, NULL, NULL); len = strlen(buf); break;#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES case ASN_OPAQUE_FLOAT: if (var->val.floatVal) sprintf(buf,"%f", *var->val.floatVal); break; case ASN_OPAQUE_DOUBLE: if (var->val.doubleVal) sprintf(buf,"%f", *var->val.doubleVal); break;#endif case ASN_NSAP: default: warn("snprint_value: asn type not handled %d\n",var->type); } } return(len);}static int__sprint_num_objid (buf, objid, len)char *buf;oid *objid;int len;{ int i; buf[0] = '\0'; for (i=0; i < len; i++) { sprintf(buf,".%lu",*objid++); buf += strlen(buf); } return SUCCESS;}static int__tp_sprint_num_objid (buf, tp)char *buf;SnmpMibNode *tp;{ oid newname[MAX_OID_LEN], *op; /* code taken from get_node in snmp_client.c */ for (op = newname + MAX_OID_LEN - 1; op >= newname; op--) { *op = tp->subid; tp = tp->parent; if (tp == NULL) break; } return __sprint_num_objid(buf, op, newname + MAX_OID_LEN - op);}static int__scan_num_objid (buf, objid, len)char *buf;oid *objid;size_t *len;{ char *cp; *len = 0; if (*buf == '.') buf++; cp = buf; while (*buf) { if (*buf++ == '.') { sscanf(cp, "%lu", objid++); /* *objid++ = atoi(cp); */ (*len)++; cp = buf; } else { if (isalpha((int)*buf)) { return FAILURE; } } } sscanf(cp, "%lu", objid++); /* *objid++ = atoi(cp); */ (*len)++; return SUCCESS;}static int__get_type_str (type, str)int type;char * str;{ switch (type) { case TYPE_OBJID: strcpy(str, "OBJECTID"); break; case TYPE_OCTETSTR: strcpy(str, "OCTETSTR"); break; case TYPE_INTEGER: strcpy(str, "INTEGER"); break; case TYPE_INTEGER32: strcpy(str, "INTEGER32"); break; case TYPE_UNSIGNED32: strcpy(str, "UNSIGNED32"); break; case TYPE_NETADDR: strcpy(str, "NETADDR"); break; case TYPE_IPADDR: strcpy(str, "IPADDR"); break; case TYPE_COUNTER: strcpy(str, "COUNTER"); break; case TYPE_GAUGE: strcpy(str, "GAUGE"); break; case TYPE_TIMETICKS: strcpy(str, "TICKS"); break; case TYPE_OPAQUE: strcpy(str, "OPAQUE"); break; case TYPE_COUNTER64: strcpy(str, "COUNTER64"); break; case TYPE_NULL: strcpy(str, "NULL"); break; case SNMP_ENDOFMIBVIEW: strcpy(str, "ENDOFMIBVIEW"); break; case SNMP_NOSUCHOBJECT: strcpy(str, "NOSUCHOBJECT"); break; case SNMP_NOSUCHINSTANCE: strcpy(str, "NOSUCHINSTANCE"); break; case TYPE_UINTEGER: strcpy(str, "UINTEGER"); /* historic - should not show up */ /* but it does? */ break; case TYPE_NOTIFTYPE: strcpy(str, "NOTIF"); break; case TYPE_BITSTRING: strcpy(str, "BITS"); break; case TYPE_TRAPTYPE: strcpy(str, "TRAP"); break; case TYPE_OTHER: /* not sure if this is a valid leaf type?? */ case TYPE_NSAPADDRESS: default: /* unsupported types for now */ strcpy(str, ""); return(FAILURE); } return SUCCESS;}/* does a destructive disection of <label1>...<labeln>.<iid> returning <labeln> and <iid> in seperate strings (note: will destructively alter input string, 'name') */static int__get_label_iid (name, last_label, iid, flag)char * name;char ** last_label;char ** iid;int flag;{ char *lcp; char *icp; int len = strlen(name); int found_label = 0; *last_label = *iid = NULL; if (len == 0) return(FAILURE); /* Handle case where numeric oid's have been requested. The input 'name' ** in this case should be a numeric OID -- return failure if not. */ if ((flag & USE_NUMERIC_OIDS)) { if (!__is_numeric_oid(name)) return(FAILURE); /* Walk backward through the string, looking for first two '.' chars */ lcp = &(name[len]); icp = NULL; while (lcp > name) { if (*lcp == '.') { /* If this is the first occurence of '.', note it in icp. ** Otherwise, this must be the second occurrence, so break ** out of the loop. */ if (icp == NULL) icp = lcp; else break; } lcp --; } /* Make sure we found at least a label and index. */ if (!icp) return(FAILURE); /* Push forward past leading '.' chars and separate the strings. */ lcp ++; *icp ++ = '\0'; *last_label = (flag & USE_LONG_NAMES) ? name : lcp; *iid = icp; return(SUCCESS); } lcp = icp = &(name[len]); while (lcp > name) { if (*lcp == '.') { if (found_label) { lcp++; break; } else { icp = lcp; } } if (!found_label && isalpha((int)*lcp)) found_label = 1; lcp--; } if (!found_label || (!isdigit((int)*(icp+1)) && (flag & FAIL_ON_NULL_IID))) return(FAILURE); if (flag & NON_LEAF_NAME) { /* dont know where to start instance id */ /* put the whole thing in label */ icp = &(name[len]); flag |= USE_LONG_NAMES; /* special hack in case no mib loaded - object identifiers will * start with .iso.<num>.<num>...., in which case it is preferable * to make the label entirely numeric (i.e., convert "iso" => "1") */ if (*lcp == '.' && lcp == name) { if (!strncmp(".ccitt.",lcp,7)) { name += 2; *name = '.'; *(name+1) = '0'; } else if (!strncmp(".iso.",lcp,5)) { name += 2; *name = '.'; *(name+1) = '1'; } else if (!strncmp(".joint-iso-ccitt.",lcp,17)) { name += 2; *name = '.'; *(name+1) = '2'; } } } else if (*icp) { *(icp++) = '\0'; } *last_label = (flag & USE_LONG_NAMES ? name : lcp); *iid = icp; return(SUCCESS);}static int__oid_cmp(oida_arr, oida_arr_len, oidb_arr, oidb_arr_len)oid *oida_arr;size_t oida_arr_len;oid *oidb_arr;size_t oidb_arr_len;{ for (;oida_arr_len && oidb_arr_len; oida_arr++, oida_arr_len--, oidb_arr++, oidb_arr_len--) { if (*oida_arr == *oidb_arr) continue; return(*oida_arr > *oidb_arr ? 1 : -1); } if (oida_arr_len == oidb_arr_len) return(0); return(oida_arr_len > oidb_arr_len ? 1 : -1);}/* Convert a tag (string) to an OID array *//* Tag can be either a symbolic name, or an OID string */static struct tree *__tag2oid(tag, iid, oid_arr, oid_arr_len, type, best_guess)char * tag;char * iid;oid * oid_arr;size_t * oid_arr_len;int * type;int best_guess;{ struct tree *tp = NULL; struct tree *rtp = NULL; oid newname[MAX_OID_LEN], *op; size_t newname_len = 0; char str_buf[STR_BUF_SIZE]; str_buf[0] = '\0'; if (type) *type = TYPE_UNKNOWN; if (oid_arr_len) *oid_arr_len = 0; if (!tag) goto done; /*********************************************************/ /* best_guess = 0 - same as no switches (read_objid) */ /* if multiple parts, or uses find_node */ /* if a single leaf */ /* best_guess = 1 - same as -Ib (get_wild_node) */ /* best_guess = 2 - same as -IR (get_node) */ /*********************************************************/ /* numeric scalar (1,2) */ /* single symbolic (1,2) */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -