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

📄 snmp.xs

📁 snmp的源代码,已经在我的ubuntu下编译通过
💻 XS
📖 第 1 页 / 共 5 页
字号:
   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) */   /* 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) __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;int *doid_arr_len;char * soid_str;{   char soid_buf[STR_BUF_SIZE];   char *cp;   if (!soid_str || !*soid_str) return SUCCESS;/* successfully added nothing */   if (*soid_str == '.') soid_str++;   strcpy(soid_buf, soid_str);   cp = strtok(soid_buf,".");   while (cp) {     sscanf(cp, "%lu", &(doid_arr[(*doid_arr_len)++]));     /* doid_arr[(*doid_arr_len)++] =  atoi(cp); */     cp = strtok(NULL,".");   }   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;    int 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 = strdup("");            vars->val_len = 0;        }        break;      case TYPE_IPADDR:        vars->type = ASN_IPADDRESS;        vars->val.integer = (long *)malloc(sizeof(long));        if (val)            *(vars->val.integer) = inet_addr(val);        else {            ret = FAILURE;            *(vars->val.integer) = 0;        }        vars->val_len = sizeof(long);        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__callback_wrapper (op, ss, reqid, pdu, cb_data)int op;netsnmp_session *ss;int reqid;netsnmp_pdu *pdu;void *cb_data;{  /* we should probably just increment the reference counter... */  /*  sv_inc(cb_data); */  return __snmp_xs_cb(op, ss, reqid, pdu, newSVsv(cb_data));}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];  u_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;  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);  dSP;  ENTER;  SAVETMPS;  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:      /*

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -