📄 snmp.xs
字号:
if (flag == USE_SPRINT_VALUE) { sprint_value(buf, 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: printU64(buf,(struct counter64 *)var->val.counter64); len = strlen(buf); break; case ASN_BIT_STR: case ASN_NSAP: default: warn("sprint_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; int newname_len = 0; /* 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;int *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_TRAPTYPE: strcpy(str, "TRAP"); break; case TYPE_OTHER: /* not sure if this is a valid leaf type?? */ case TYPE_BITSTRING: 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;int oida_arr_len;oid *oidb_arr;int 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);}#define MAX_BAD 0xffffffstatic u_intcompute_match(search_base, key)const char *search_base;const char *key;{ int rc; regex_t parsetree; regmatch_t pmatch; rc = regcomp(&parsetree, key, REG_ICASE | REG_EXTENDED); if (rc == 0) rc = regexec(&parsetree, search_base, 1, &pmatch, 0); regfree(&parsetree); if (rc == 0) { return pmatch.rm_so; } return MAX_BAD;}static struct tree *__tag2oid(tag, iid, oid_arr, oid_arr_len, type, best_guess)char * tag;char * iid;oid * oid_arr;int * oid_arr_len;int * type;int best_guess;{ struct tree *tp = NULL; struct tree *rtp = NULL; DLL_IMPORT extern struct tree *tree_head; oid newname[MAX_OID_LEN], *op; int newname_len = 0; if (type) *type = TYPE_UNKNOWN; if (oid_arr_len) *oid_arr_len = 0; if (!tag) goto done; if (best_guess) { tp = rtp = find_best_tree_node(tag, tree_head, NULL); if (tp) { if (type) *type = tp->type; if ((oid_arr == NULL) || (oid_arr_len == NULL)) return rtp; for (op = newname + MAX_OID_LEN - 1; op >= newname; op--) { *op = tp->subid; tp = tp->parent; if (tp == NULL) break; } *oid_arr_len = newname + MAX_OID_LEN - op; memcpy(oid_arr, op, *oid_arr_len * sizeof(oid)); } return(rtp); } if (strchr(tag,'.')) { /* if multi part tag */ if (!__scan_num_objid(tag, newname, &newname_len)) { /* numeric tag */ newname_len = MAX_OID_LEN; read_objid(tag, newname, &newname_len); /* long name */ } if (newname_len) rtp = tp = get_tree(newname, newname_len, Mib); if (type) *type = (tp ? tp->type : TYPE_UNKNOWN); if ((oid_arr == NULL) || (oid_arr_len == NULL)) return rtp; memcpy(oid_arr,(char*)newname,newname_len*sizeof(oid)); *oid_arr_len = newname_len; } else { /* else it is a leaf */ rtp = tp = find_node(tag, Mib); if (tp) { if (type) *type = tp->type; if ((oid_arr == NULL) || (oid_arr_len == NULL)) return rtp; /* 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; } *oid_arr_len = newname + MAX_OID_LEN - op; memcpy(oid_arr, op, *oid_arr_len * sizeof(oid)); } else { return(rtp); /* HACK: otherwise, concat_oid_str confuses things */ } } done: if (iid && *iid) __concat_oid_str(oid_arr, oid_arr_len, iid); return(rtp);}/* searches down the mib tree for the given oid returns the last found tp and its index in lastind */static struct tree *__oid2tp (oidp, len, subtree, lastind)oid* oidp;int len;struct tree * subtree;int* lastind;{ struct tree *return_tree = NULL; for (; subtree; subtree = subtree->next_peer) { if (*oidp == subtree->subid){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -