⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 snmp.xs

📁 开发snmp的开发包有两个开放的SNMP开发库
💻 XS
📖 第 1 页 / 共 5 页
字号:
   /* 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 + -