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

📄 snmp.xs

📁 snmp的源代码,已经在我的ubuntu下编译通过
💻 XS
📖 第 1 页 / 共 5 页
字号:
        }}#define USE_BASIC 0#define USE_ENUMS 1#define USE_SPRINT_VALUE 2static int__snprint_value (buf, buf_len, var, tp, type, flag)char * buf;size_t buf_len;netsnmp_variable_list * var;struct tree * tp;int type;int flag;{   int len = 0;   u_char* ip;   struct enum_list *ep;   buf[0] = '\0';   if (flag == USE_SPRINT_VALUE) {	snprint_value(buf, buf_len, 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:            snprint_bitstring(buf, sizeof(buf), var, NULL, NULL, NULL);            len = strlen(buf);            break;        case ASN_NSAP:        default:           warn("snprint_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;   /* 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_BITSTRING:		strcpy(str, "BITS");		break;	case TYPE_TRAPTYPE:		strcpy(str, "TRAP");		break;	case TYPE_OTHER: /* not sure if this is a valid leaf type?? */	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;{#if defined(HAVE_REGEX_H) && defined(HAVE_REGCOMP)    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) {        /*         * found          */        return pmatch.rm_so;    }#else                           /* use our own wildcard matcher */    /*     * first find the longest matching substring (ick)      */    char           *first = NULL, *result = NULL, *entry;    const char     *position;    char           *newkey = strdup(key);    entry = strtok(newkey, "*");    position = search_base;    while (entry) {        result = strcasestr(position, entry);        if (result == NULL) {            free(newkey);            return MAX_BAD;        }        if (first == NULL)            first = result;        position = result + strlen(entry);        entry = strtok(NULL, "*");    }    free(newkey);    if (result)        return (first - search_base);#endif    /*     * not found      */    return MAX_BAD;}/* Convert a tag (string) to an OID array              *//* Tag can be either a symbolic name, or an OID string */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;   oid newname[MAX_OID_LEN], *op;   int newname_len = 0;   const char *cp = NULL;   char *module = NULL;

⌨️ 快捷键说明

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