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

📄 snmp.xs

📁 ucd-snmp源代码
💻 XS
📖 第 1 页 / 共 5 页
字号:
   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 + -