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

📄 client_intf.c

📁 开发snmp的开发包有两个开放的SNMP开发库
💻 C
📖 第 1 页 / 共 5 页
字号:
#include <Python.h>#include <net-snmp/net-snmp-config.h>#include <net-snmp/net-snmp-includes.h>#include <sys/types.h>#include <arpa/inet.h>#include <errno.h>#include <stdio.h>#include <ctype.h>#ifdef I_SYS_TIME#include <sys/time.h>#endif#include <netdb.h>#include <stdlib.h>#ifdef HAVE_REGEX_H#include <regex.h>#endif#define SUCCESS 1#define FAILURE 0#define VARBIND_TAG_F 0#define VARBIND_IID_F 1#define VARBIND_VAL_F 2#define VARBIND_TYPE_F 3#define TYPE_UNKNOWN 0#define MAX_TYPE_NAME_LEN 32#define STR_BUF_SIZE (MAX_TYPE_NAME_LEN * MAX_OID_LEN)#define ENG_ID_BUF_SIZE 32#define NO_RETRY_NOSUCH 0/* these should be part of transform_oids.h ? */#define USM_AUTH_PROTO_MD5_LEN 10#define USM_AUTH_PROTO_SHA_LEN 10#define USM_PRIV_PROTO_DES_LEN 10#define STRLEN(x) (x ? strlen(x) : 0)typedef netsnmp_session SnmpSession;typedef struct tree SnmpMibNode;static void __recalc_timeout (struct timeval*,struct timeval*,                                struct timeval*,struct timeval*, int* );static in_addr_t __parse_address (char*);static int __is_numeric_oid (char*);static int __is_leaf (struct tree*);static int __translate_appl_type (char*);static int __translate_asn_type (int);static int __snprint_value (char *, size_t,                              netsnmp_variable_list*, struct tree *,                             int, int);static int __sprint_num_objid (char *, oid *, int);static int __scan_num_objid (char *, oid *, size_t *);static int __get_type_str (int, char *);static int __get_label_iid (char *, char **, char **, int);static int __oid_cmp (oid *, int, oid *, int);static int __tp_sprint_num_objid (char*,SnmpMibNode *);static SnmpMibNode * __get_next_mib_node (SnmpMibNode *);static struct tree * __oid2tp (oid*, int, struct tree *, int*);static struct tree * __tag2oid (char *, char *, oid  *, int  *, int *, int);static int __concat_oid_str (oid *, int *, char *);static int __add_var_val_str (netsnmp_pdu *, oid *, int, char *,                                 int, int);#define USE_NUMERIC_OIDS 0x08#define NON_LEAF_NAME 0x04#define USE_LONG_NAMES 0x02#define FAIL_ON_NULL_IID 0x01#define NO_FLAGS 0x00/* Wrapper around fprintf(stderr, ...) for clean and easy debug output. */static int _debug_level = 0;#ifdef	DEBUGGING#define	DBPRT(severity, otherargs)					\	do {								\	    if (_debug_level && severity <= _debug_level) {		\	      (void)printf(otherargs);					\	    }								\	} while (/*CONSTCOND*/0)#else	/* DEBUGGING */#define	DBPRT(severity, otherargs)	/* Ignore */#endif	/* DEBUGGING */#define SAFE_FREE(x) do {if (x != NULL) free(x);} while(/*CONSTCOND*/0)void__libraries_init(char *appname){  static int have_inited = 0;  if (have_inited)    return;  have_inited = 1;  snmp_set_quick_print(1);  snmp_enable_stderrlog();  init_snmp(appname);      netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_DONT_BREAKDOWN_OIDS, 1);  netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_PRINT_SUFFIX_ONLY, 1);  netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_OID_OUTPUT_FORMAT,		     NETSNMP_OID_OUTPUT_SUFFIX);}static void__recalc_timeout (tvp, ctvp, ltvp, itvp, block)struct timeval* tvp;struct timeval* ctvp;struct timeval* ltvp;struct timeval* itvp;int *block;{   struct timeval now;   if (!timerisset(itvp)) return;  /* interval zero means loop forever */   *block = 0;   gettimeofday(&now,(struct timezone *)0);   if (ctvp->tv_sec < 0) { /* first time or callback just fired */      timersub(&now,ltvp,ctvp);      timersub(ctvp,itvp,ctvp);      timersub(itvp,ctvp,ctvp);      timeradd(ltvp,itvp,ltvp);   } else {      timersub(&now,ltvp,ctvp);      timersub(itvp,ctvp,ctvp);   }   /* flag is set for callback but still hasnt fired so set to something    * small and we will service packets first if there are any ready    * (also guard against negative timeout - should never happen?)    */   if (!timerisset(ctvp) || ctvp->tv_sec < 0 || ctvp->tv_usec < 0) {      ctvp->tv_sec = 0;      ctvp->tv_usec = 10;   }   /* if snmp timeout > callback timeout or no more requests to process */   if (timercmp(tvp, ctvp, >) || !timerisset(tvp)) {      *tvp = *ctvp; /* use the smaller non-zero timeout */      timerclear(ctvp); /* used as a flag to let callback fire on timeout */   }}static in_addr_t__parse_address(address)char *address;{    in_addr_t addr;    struct sockaddr_in saddr;    struct hostent *hp;    if ((addr = inet_addr(address)) != -1)	return addr;    hp = gethostbyname(address);    if (hp == NULL){        return (-1); /* error value */    } else {	memcpy(&saddr.sin_addr, hp->h_addr, hp->h_length);	return saddr.sin_addr.s_addr;    }}static int__is_numeric_oid (oidstr)char* oidstr;{  if (!oidstr) return 0;  for (; *oidstr; oidstr++) {     if (isalpha((int)*oidstr)) return 0;  }  return(1);}static int__is_leaf (tp)struct tree* tp;{   char buf[MAX_TYPE_NAME_LEN];   return (tp && (__get_type_str(tp->type,buf) || 		  (tp->parent && __get_type_str(tp->parent->type,buf) )));}static SnmpMibNode*__get_next_mib_node (tp)SnmpMibNode* tp;{   /* printf("tp = %lX, parent = %lX, peer = %lX, child = %lX\n",              tp, tp->parent, tp->next_peer, tp->child_list); */   if (tp->child_list) return(tp->child_list);   if (tp->next_peer) return(tp->next_peer);   if (!tp->parent) return(NULL);   for (tp = tp->parent; !tp->next_peer; tp = tp->parent) {      if (!tp->parent) return(NULL);   }   return(tp->next_peer);}static int__translate_appl_type(typestr)char* typestr;{	if (typestr == NULL || *typestr == '\0') return TYPE_UNKNOWN;	if (!strncasecmp(typestr,"INTEGER32",8))            return(TYPE_INTEGER32);	if (!strncasecmp(typestr,"INTEGER",3))            return(TYPE_INTEGER);	if (!strncasecmp(typestr,"UNSIGNED32",3))            return(TYPE_UNSIGNED32);	if (!strcasecmp(typestr,"COUNTER")) /* check all in case counter64 */            return(TYPE_COUNTER);	if (!strncasecmp(typestr,"GAUGE",3))            return(TYPE_GAUGE);	if (!strncasecmp(typestr,"IPADDR",3))            return(TYPE_IPADDR);	if (!strncasecmp(typestr,"OCTETSTR",3))            return(TYPE_OCTETSTR);	if (!strncasecmp(typestr,"TICKS",3))            return(TYPE_TIMETICKS);	if (!strncasecmp(typestr,"OPAQUE",3))            return(TYPE_OPAQUE);	if (!strncasecmp(typestr,"OBJECTID",3))            return(TYPE_OBJID);	if (!strncasecmp(typestr,"NETADDR",3))	    return(TYPE_NETADDR);	if (!strncasecmp(typestr,"COUNTER64",3))	    return(TYPE_COUNTER64);	if (!strncasecmp(typestr,"NULL",3))	    return(TYPE_NULL);	if (!strncasecmp(typestr,"BITS",3))	    return(TYPE_BITSTRING);	if (!strncasecmp(typestr,"ENDOFMIBVIEW",3))	    return(SNMP_ENDOFMIBVIEW);	if (!strncasecmp(typestr,"NOSUCHOBJECT",7))	    return(SNMP_NOSUCHOBJECT);	if (!strncasecmp(typestr,"NOSUCHINSTANCE",7))	    return(SNMP_NOSUCHINSTANCE);	if (!strncasecmp(typestr,"UINTEGER",3))	    return(TYPE_UINTEGER); /* historic - should not show up */                                   /* but it does?                  */	if (!strncasecmp(typestr, "NOTIF", 3))		return(TYPE_NOTIFTYPE);	if (!strncasecmp(typestr, "TRAP", 4))		return(TYPE_TRAPTYPE);        return(TYPE_UNKNOWN);}static int__translate_asn_type(type)int type;{   switch (type) {        case ASN_INTEGER:            return(TYPE_INTEGER);	    break;	case ASN_OCTET_STR:            return(TYPE_OCTETSTR);	    break;	case ASN_OPAQUE:            return(TYPE_OPAQUE);	    break;	case ASN_OBJECT_ID:            return(TYPE_OBJID);	    break;	case ASN_TIMETICKS:            return(TYPE_TIMETICKS);	    break;	case ASN_GAUGE:            return(TYPE_GAUGE);	    break;	case ASN_COUNTER:            return(TYPE_COUNTER);	    break;	case ASN_IPADDRESS:            return(TYPE_IPADDR);	    break;	case ASN_BIT_STR:            return(TYPE_BITSTRING);	    break;	case ASN_NULL:            return(TYPE_NULL);	    break;	/* no translation for these exception type values */	case SNMP_ENDOFMIBVIEW:	case SNMP_NOSUCHOBJECT:	case SNMP_NOSUCHINSTANCE:	    return(type);	    break;	case ASN_UINTEGER:            return(TYPE_UINTEGER);	    break;	case ASN_COUNTER64:            return(TYPE_COUNTER64);	    break;	default:            return(TYPE_OTHER);            fprintf(stderr, "translate_asn_type: unhandled asn type (%d)\n",type);            break;        }}#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:#ifdef OPAQUE_SPECIAL_TYPES        case ASN_OPAQUE_COUNTER64:        case ASN_OPAQUE_U64:#endif          printU64(buf,(struct counter64 *)var->val.counter64);          len = STRLEN(buf);          break;#ifdef OPAQUE_SPECIAL_TYPES        case ASN_OPAQUE_I64:          printI64(buf,(struct counter64 *)var->val.counter64);          len = STRLEN(buf);          break;#endif        case ASN_BIT_STR:            snprint_bitstring(buf, sizeof(buf), var, NULL, NULL, NULL);            len = STRLEN(buf);            break;#ifdef OPAQUE_SPECIAL_TYPES        case ASN_OPAQUE_FLOAT:	  if (var->val.floatVal)	    sprintf(buf,"%f", *var->val.floatVal);         break;                 case ASN_OPAQUE_DOUBLE:	  if (var->val.doubleVal)	    sprintf(buf,"%f", *var->val.doubleVal);         break;#endif                 case ASN_NSAP:        default:	  fprintf(stderr,"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;size_t *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 {

⌨️ 快捷键说明

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