📄 snmp.xs
字号:
/* single regex (1) */ /* partial full symbolic (2) */ /* full symbolic (2) */ /* module::single symbolic (2) */ /* module::partial full symbolic (2) */ if (best_guess == 1 || best_guess == 2) { if (!__scan_num_objid(tag, newname, &newname_len)) { /* make sure it's not a numeric tag */ newname_len = MAX_OID_LEN; if (best_guess == 2) { /* Random search -IR */ if (get_node(tag, newname, &newname_len)) { rtp = tp = get_tree(newname, newname_len, get_tree_head()); } } else if (best_guess == 1) { /* Regex search -Ib */ clear_tree_flags(get_tree_head()); if (get_wild_node(tag, newname, &newname_len)) { rtp = tp = get_tree(newname, newname_len, get_tree_head()); } } } else { rtp = tp = get_tree(newname, newname_len, get_tree_head()); } 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; } /* if best_guess is off and multi part tag or module::tag */ /* numeric scalar */ /* module::single symbolic */ /* module::partial full symbolic */ /* FULL symbolic OID */ else if (strchr(tag,'.') || strchr(tag,':')) { if (!__scan_num_objid(tag, newname, &newname_len)) { /* make sure it's not a numeric tag */ newname_len = MAX_OID_LEN; if (read_objid(tag, newname, &newname_len)) { /* long name */ rtp = tp = get_tree(newname, newname_len, get_tree_head()); } } else { rtp = tp = get_tree(newname, newname_len, get_tree_head()); } 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 best_guess is off and it is a single leaf */ /* single symbolic */ else { rtp = tp = find_node(tag, get_tree_head()); 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 && oid_arr_len) __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){ goto found; } } *lastind=0; return NULL;found: if (len > 1){ return_tree = __oid2tp(oidp + 1, len - 1, subtree->child_list, lastind); (*lastind)++; } else { *lastind=1; } if (return_tree) return return_tree; else return subtree;}/* function: __concat_oid_str * * This function converts a dotted-decimal string, soid_str, to an array * of oid types and concatenates them on doid_arr begining at the index * specified by doid_arr_len. * * returns : SUCCESS, FAILURE */static int__concat_oid_str(doid_arr, doid_arr_len, soid_str)oid *doid_arr;size_t *doid_arr_len;char * soid_str;{ char soid_buf[STR_BUF_SIZE]; char *cp; char *st; if (!soid_str || !*soid_str) return SUCCESS;/* successfully added nothing */ if (*soid_str == '.') soid_str++; strcpy(soid_buf, soid_str); cp = strtok_r(soid_buf,".",&st); while (cp) { sscanf(cp, "%lu", &(doid_arr[(*doid_arr_len)++])); /* doid_arr[(*doid_arr_len)++] = atoi(cp); */ cp = strtok_r(NULL,".",&st); } return(SUCCESS);}/* * add a varbind to PDU */static int__add_var_val_str(pdu, name, name_length, val, len, type) netsnmp_pdu *pdu; oid *name; size_t name_length; char * val; int len; int type;{ netsnmp_variable_list *vars; oid oidbuf[MAX_OID_LEN]; int ret = SUCCESS; if (pdu->variables == NULL){ pdu->variables = vars = (netsnmp_variable_list *)calloc(1,sizeof(netsnmp_variable_list)); } else { for(vars = pdu->variables; vars->next_variable; vars = vars->next_variable) /*EXIT*/; vars->next_variable = (netsnmp_variable_list *)calloc(1,sizeof(netsnmp_variable_list)); vars = vars->next_variable; } vars->next_variable = NULL; vars->name = (oid *)malloc(name_length * sizeof(oid)); memcpy((char *)vars->name, (char *)name, name_length * sizeof(oid)); vars->name_length = name_length; switch (type) { case TYPE_INTEGER: case TYPE_INTEGER32: vars->type = ASN_INTEGER; vars->val.integer = (long *)malloc(sizeof(long)); if (val) *(vars->val.integer) = strtol(val,NULL,0); else { ret = FAILURE; *(vars->val.integer) = 0; } vars->val_len = sizeof(long); break; case TYPE_GAUGE: case TYPE_UNSIGNED32: vars->type = ASN_GAUGE; goto UINT; case TYPE_COUNTER: vars->type = ASN_COUNTER; goto UINT; case TYPE_TIMETICKS: vars->type = ASN_TIMETICKS; goto UINT; case TYPE_UINTEGER: vars->type = ASN_UINTEGER;UINT: vars->val.integer = (long *)malloc(sizeof(long)); if (val) sscanf(val,"%lu",vars->val.integer); else { ret = FAILURE; *(vars->val.integer) = 0; } vars->val_len = sizeof(long); break; case TYPE_OCTETSTR: vars->type = ASN_OCTET_STR; goto OCT; case TYPE_BITSTRING: vars->type = ASN_OCTET_STR; goto OCT; case TYPE_OPAQUE: vars->type = ASN_OCTET_STR;OCT: vars->val.string = (u_char *)malloc(len); vars->val_len = len; if (val && len) memcpy((char *)vars->val.string, val, len); else { ret = FAILURE; vars->val.string = (u_char*)strdup(""); vars->val_len = 0; } break; case TYPE_IPADDR: vars->type = ASN_IPADDRESS; vars->val.integer = (long *)malloc(sizeof(in_addr_t)); if (val) *(vars->val.integer) = inet_addr(val); else { ret = FAILURE; *(vars->val.integer) = 0; } vars->val_len = sizeof(in_addr_t); break; case TYPE_OBJID: vars->type = ASN_OBJECT_ID; vars->val_len = MAX_OID_LEN; /* if (read_objid(val, oidbuf, &(vars->val_len))) { */ /* tp = __tag2oid(val,NULL,oidbuf,&(vars->val_len),NULL,0); */ if (!val || !snmp_parse_oid(val, oidbuf, &vars->val_len)) { vars->val.objid = NULL; ret = FAILURE; } else { vars->val_len *= sizeof(oid); vars->val.objid = (oid *)malloc(vars->val_len); memcpy((char *)vars->val.objid, (char *)oidbuf, vars->val_len); } break; default: vars->type = ASN_NULL; vars->val_len = 0; vars->val.string = NULL; ret = FAILURE; } return ret;}/* takes ss and pdu as input and updates the 'response' argument *//* the input 'pdu' argument will be freed */static int__send_sync_pdu(ss, pdu, response, retry_nosuch, err_str_sv, err_num_sv, err_ind_sv)netsnmp_session *ss;netsnmp_pdu *pdu;netsnmp_pdu **response;int retry_nosuch;SV * err_str_sv;SV * err_num_sv;SV * err_ind_sv;{ int status; long command = pdu->command; *response = NULL;retry: status = snmp_synch_response(ss, pdu, response); if ((*response == NULL) && (status == STAT_SUCCESS)) status = STAT_ERROR; switch (status) { case STAT_SUCCESS: switch ((*response)->errstat) { case SNMP_ERR_NOERROR: break; case SNMP_ERR_NOSUCHNAME: if (retry_nosuch && (pdu = snmp_fix_pdu(*response, command))) { if (*response) snmp_free_pdu(*response); goto retry; } /* Pv1, SNMPsec, Pv2p, v2c, v2u, v2*, and SNMPv3 PDUs */ case SNMP_ERR_TOOBIG: case SNMP_ERR_BADVALUE: case SNMP_ERR_READONLY: case SNMP_ERR_GENERR: /* in SNMPv2p, SNMPv2c, SNMPv2u, SNMPv2*, and SNMPv3 PDUs */ case SNMP_ERR_NOACCESS: case SNMP_ERR_WRONGTYPE: case SNMP_ERR_WRONGLENGTH: case SNMP_ERR_WRONGENCODING: case SNMP_ERR_WRONGVALUE: case SNMP_ERR_NOCREATION: case SNMP_ERR_INCONSISTENTVALUE: case SNMP_ERR_RESOURCEUNAVAILABLE: case SNMP_ERR_COMMITFAILED: case SNMP_ERR_UNDOFAILED: case SNMP_ERR_AUTHORIZATIONERROR: case SNMP_ERR_NOTWRITABLE: /* in SNMPv2c, SNMPv2u, SNMPv2*, and SNMPv3 PDUs */ case SNMP_ERR_INCONSISTENTNAME: default: sv_catpv(err_str_sv, (char*)snmp_errstring((*response)->errstat)); sv_setiv(err_num_sv, (*response)->errstat); sv_setiv(err_ind_sv, (*response)->errindex); status = (*response)->errstat; break; } break; case STAT_TIMEOUT: case STAT_ERROR: sv_catpv(err_str_sv, (char*)snmp_api_errstring(ss->s_snmp_errno)); sv_setiv(err_num_sv, ss->s_snmp_errno); break; default: sv_catpv(err_str_sv, "send_sync_pdu: unknown status"); sv_setiv(err_num_sv, ss->s_snmp_errno); break; } return(status);}static int__snmp_xs_cb (op, ss, reqid, pdu, cb_data)int op;netsnmp_session *ss;int reqid;netsnmp_pdu *pdu;void *cb_data;{ SV *varlist_ref; AV *varlist; SV *varbind_ref; AV *varbind; SV *traplist_ref = NULL; AV *traplist = NULL; netsnmp_variable_list *vars; struct tree *tp; int len; SV *tmp_sv; int type; char tmp_type_str[MAX_TYPE_NAME_LEN]; char str_buf[STR_BUF_SIZE], *str_bufp = str_buf; size_t str_buf_len = sizeof(str_buf); size_t out_len = 0; int buf_over = 0; char *label; char *iid; char *cp; int getlabel_flag = NO_FLAGS; int sprintval_flag = USE_BASIC; netsnmp_pdu *reply_pdu; int old_numeric, old_printfull, old_format; netsnmp_transport *transport = NULL; SV* cb = ((struct snmp_xs_cb_data*)cb_data)->perl_cb; SV* sess_ref = ((struct snmp_xs_cb_data*)cb_data)->sess_ref; SV **err_str_svp = hv_fetch((HV*)SvRV(sess_ref), "ErrorStr", 8, 1); SV **err_num_svp = hv_fetch((HV*)SvRV(sess_ref), "ErrorNum", 8, 1); SV **err_ind_svp = hv_fetch((HV*)SvRV(sess_ref), "ErrorInd", 8, 1); ENTER; SAVETMPS; if (cb_data != ss->callback_magic) free(cb_data); sv_setpv(*err_str_svp, (char*)snmp_errstring(pdu->errstat)); sv_setiv(*err_num_svp, pdu->errstat); sv_setiv(*err_ind_svp, pdu->errindex); varlist_ref = &sv_undef; /* Prevent unintialized use below. */ switch (op) { case NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE: traplist_ref = NULL; switch (pdu->command) { case SNMP_MSG_INFORM: /* * Ideally, we would use the return value from the callback to * decide what response, if any, we send, and what the error status * and error index should be. */ reply_pdu = snmp_clone_pdu(pdu); if (reply_pdu) { reply_pdu->command = SNMP_MSG_RESPONSE; reply_pdu->reqid = pdu->reqid; reply_pdu->errstat = reply_pdu->errindex = 0; snmp_send(ss, reply_pdu); } else { warn("Couldn't clone PDU for inform response"); } /* FALLTHRU */ case SNMP_MSG_TRAP: case SNMP_MSG_TRAP2: traplist = newAV(); traplist_ref = newRV_noinc((SV*)traplist);#if 0 /* of dubious utility... */ av_push(traplist, newSViv(pdu->command));#endif av_push(traplist, newSViv(pdu->reqid)); if ((transport = snmp_sess_transport(snmp_sess_pointer(ss))) != NULL) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -