diff options
| author | Stef Walter <stef@memberwebs.com> | 2008-03-02 01:25:00 +0000 | 
|---|---|---|
| committer | Stef Walter <stef@memberwebs.com> | 2008-03-02 01:25:00 +0000 | 
| commit | 9a78f86f773cbf34e29ec51fc06e3f04072c88d0 (patch) | |
| tree | 00054e6e536769a35b4215567755494486cc36ec /bsnmp | |
| parent | ec1a79b0f75cfd34085e046ecb30382a402ea318 (diff) | |
    - Support failover between multiple agents
    - Support table queries
    - Major refactoring of internals. 
Diffstat (limited to 'bsnmp')
| -rw-r--r-- | bsnmp/snmp.c | 54 | ||||
| -rw-r--r-- | bsnmp/snmp.h | 5 | 
2 files changed, 53 insertions, 6 deletions
| diff --git a/bsnmp/snmp.c b/bsnmp/snmp.c index 6b2cc01..1a7fe46 100644 --- a/bsnmp/snmp.c +++ b/bsnmp/snmp.c @@ -408,7 +408,7 @@ snmp_pdu_decode(struct asn_buf *b, struct snmp_pdu *pdu, int32_t *ip)  	  case ASN_ERR_FAILED:  	  case ASN_ERR_EOBUF: -		snmp_pdu_free(pdu); +		snmp_pdu_clear(pdu);  		return (SNMP_CODE_FAILED);  	  case ASN_ERR_BADLEN: @@ -805,7 +805,7 @@ snmp_pdu_dump(const struct snmp_pdu *pdu)  }  void -snmp_value_free(struct snmp_value *value) +snmp_value_clear(struct snmp_value *value)  {  	if (value->syntax == SNMP_SYNTAX_OCTETSTRING)  		free(value->v.octetstring.octets); @@ -834,12 +834,58 @@ snmp_value_copy(struct snmp_value *to, const struct snmp_value *from)  }  void -snmp_pdu_free(struct snmp_pdu *pdu) +snmp_pdu_clear(struct snmp_pdu *pdu)  {  	u_int i;  	for (i = 0; i < pdu->nbindings; i++) -		snmp_value_free(&pdu->bindings[i]); +		snmp_value_clear(&pdu->bindings[i]); +} + +int +snmp_value_equal(const struct snmp_value *a, const struct snmp_value *b) +{ +	if (asn_compare_oid (&a->var, &b->var) == 0) +		return 0; +	if (a->syntax != b->syntax) +		return 0; + +	switch (a->syntax) { +	case SNMP_SYNTAX_NULL: +	case SNMP_SYNTAX_NOSUCHOBJECT: +	case SNMP_SYNTAX_NOSUCHINSTANCE: +	case SNMP_SYNTAX_ENDOFMIBVIEW: +		return 1; + +	case SNMP_SYNTAX_INTEGER: +		return a->v.integer == b->v.integer; + +	case SNMP_SYNTAX_OCTETSTRING: +		if (a->v.octetstring.len != b->v.octetstring.len) +			return 0; +		return memcmp (a->v.octetstring.octets, b->v.octetstring.octets, +		               a->v.octetstring.len) == 0; + +	case SNMP_SYNTAX_OID: +		if (a->v.oid.len != b->v.oid.len) +			return 0; +		return memcmp (&a->v.oid.subs, &b->v.oid.subs, +		               (b->v.oid.len * sizeof (b->v.oid.subs[0]))) == 0; + +	case SNMP_SYNTAX_IPADDRESS: +		return memcmp (&a->v.ipaddress, &b->v.ipaddress, sizeof (a->v.ipaddress)); + +	case SNMP_SYNTAX_COUNTER: +	case SNMP_SYNTAX_GAUGE: +	case SNMP_SYNTAX_TIMETICKS: +		return a->v.uint32 == b->v.uint32; + +	case SNMP_SYNTAX_COUNTER64: +		return a->v.counter64 == b->v.counter64; + +	default: +		return 0; +	};  }  /* diff --git a/bsnmp/snmp.h b/bsnmp/snmp.h index b708b3a..21390e4 100644 --- a/bsnmp/snmp.h +++ b/bsnmp/snmp.h @@ -152,11 +152,12 @@ enum snmp_code {  	SNMP_CODE_OORANGE,  }; -void snmp_value_free(struct snmp_value *); +void snmp_value_clear(struct snmp_value *);  int snmp_value_parse(const char *, enum snmp_syntax, union snmp_values *);  int snmp_value_copy(struct snmp_value *, const struct snmp_value *); +int snmp_value_equal(const struct snmp_value *, const struct snmp_value *); -void snmp_pdu_free(struct snmp_pdu *); +void snmp_pdu_clear(struct snmp_pdu *);  enum snmp_code snmp_pdu_decode(struct asn_buf *b, struct snmp_pdu *pdu, int32_t *);  enum snmp_code snmp_pdu_encode(struct snmp_pdu *pdu, struct asn_buf *resp_b); | 
