lytboris Sun, 17 Jul 2011 17:18:31 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=313331
Log: fix FR #54502: allow user to change OID value output mode when SNMP_VALUE_OBJECT is used. Bug: https://bugs.php.net/54502 (Assigned) Add support for the "BITS" datatype Changed paths: U php/php-src/branches/PHP_5_4/NEWS U php/php-src/branches/PHP_5_4/UPGRADING U php/php-src/branches/PHP_5_4/ext/snmp/snmp.c U php/php-src/branches/PHP_5_4/ext/snmp/tests/snmp_get_valueretrieval.phpt U php/php-src/branches/PHP_5_4/ext/snmp/tests/snmp_getvalue.phpt
Modified: php/php-src/branches/PHP_5_4/NEWS =================================================================== --- php/php-src/branches/PHP_5_4/NEWS 2011-07-17 15:42:44 UTC (rev 313330) +++ php/php-src/branches/PHP_5_4/NEWS 2011-07-17 17:18:31 UTC (rev 313331) @@ -259,6 +259,9 @@ . Allow ~infinite OIDs in GET/GETNEXT/SET queries. Autochunk them to max_oids upon request. . Introducing unit tests for extension with ~full coverage. + . Way of representing OID value can now be changed when SNMP_VALUE_OBJECT + is used for value output mode. Use or'ed SNMP_VALUE_LIBRARY(default if + not specified) or SNMP_VALUE_PLAIN. (FR #54502) . Fixed bugs . #44193 (snmp v3 noAuthNoPriv doesn't work) . #45893 (Snmp buffer limited to 2048 char) Modified: php/php-src/branches/PHP_5_4/UPGRADING =================================================================== --- php/php-src/branches/PHP_5_4/UPGRADING 2011-07-17 15:42:44 UTC (rev 313330) +++ php/php-src/branches/PHP_5_4/UPGRADING 2011-07-17 17:18:31 UTC (rev 313331) @@ -285,6 +285,13 @@ - Multi OID get/getnext/set queries are now supported. - New constants added for use in snmp_set_oid_output_format() function. + - Function snmp_set_valueretrieval() changed it's behaviour: + SNMP_VALUE_OBJECT can be combined with one of + SNMP_VALUE_PLAIN or SNMP_VALUE_LIBRARY resulting OID value + changes. When no SNMP_VALUE_PLAIN or SNMP_VALUE_LIBRARY + is supplied with SNMP_VALUE_OBJECT, SNMP_VALUE_LIBRARY is used. + Prior to 5.4.0 when no SNMP_VALUE_PLAIN or SNMP_VALUE_LIBRARY + was supplied with SNMP_VALUE_OBJECT, SNMP_VALUE_PLAIN was used. - Added feature-rich OO API (SNMP class) - Dropped UCD-SNMP compatibility code. Consider upgrading to net-snmp v5.3+. Net-SNMP v5.4+ is required for Windows version. Modified: php/php-src/branches/PHP_5_4/ext/snmp/snmp.c =================================================================== --- php/php-src/branches/PHP_5_4/ext/snmp/snmp.c 2011-07-17 15:42:44 UTC (rev 313330) +++ php/php-src/branches/PHP_5_4/ext/snmp/snmp.c 2011-07-17 17:18:31 UTC (rev 313331) @@ -86,9 +86,9 @@ } #endif -#define SNMP_VALUE_LIBRARY 0 -#define SNMP_VALUE_PLAIN 1 -#define SNMP_VALUE_OBJECT 2 +#define SNMP_VALUE_LIBRARY (0 << 0) +#define SNMP_VALUE_PLAIN (1 << 0) +#define SNMP_VALUE_OBJECT (1 << 1) typedef struct snmp_session php_snmp_session; #define PHP_SNMP_SESSION_RES_NAME "SNMP session" @@ -544,7 +544,7 @@ int buflen = sizeof(sbuf) - 1; int val_len = vars->val_len; - if (valueretrieval == SNMP_VALUE_LIBRARY) { + if ((valueretrieval & SNMP_VALUE_PLAIN) == 0) { val_len += 32; /* snprint_value will add type info into value, make some space for it */ } @@ -560,96 +560,92 @@ *buf = 0; - if (valueretrieval == SNMP_VALUE_LIBRARY) { - snprint_value(buf, buflen, vars->name, vars->name_length, vars); - ZVAL_STRING(snmpval, buf, 1); - if(dbuf){ /* malloc was used to store value */ - efree(dbuf); - } - return; - } - MAKE_STD_ZVAL(val); - switch (vars->type) { - case ASN_BIT_STR: /* 0x03, asn1.h */ - ZVAL_STRINGL(val, (char *)vars->val.bitstring, vars->val_len, 1); - break; + if (valueretrieval & SNMP_VALUE_PLAIN) { + switch (vars->type) { + case ASN_BIT_STR: /* 0x03, asn1.h */ + ZVAL_STRINGL(val, (char *)vars->val.bitstring, vars->val_len, 1); + break; - case ASN_OCTET_STR: /* 0x04, asn1.h */ - case ASN_OPAQUE: /* 0x44, snmp_impl.h */ - ZVAL_STRINGL(val, (char *)vars->val.string, vars->val_len, 1); - break; + case ASN_OCTET_STR: /* 0x04, asn1.h */ + case ASN_OPAQUE: /* 0x44, snmp_impl.h */ + ZVAL_STRINGL(val, (char *)vars->val.string, vars->val_len, 1); + break; - case ASN_NULL: /* 0x05, asn1.h */ - ZVAL_NULL(val); - break; + case ASN_NULL: /* 0x05, asn1.h */ + ZVAL_NULL(val); + break; - case ASN_OBJECT_ID: /* 0x06, asn1.h */ - snprint_objid(buf, buflen, vars->val.objid, vars->val_len / sizeof(oid)); - ZVAL_STRING(val, buf, 1); - break; + case ASN_OBJECT_ID: /* 0x06, asn1.h */ + snprint_objid(buf, buflen, vars->val.objid, vars->val_len / sizeof(oid)); + ZVAL_STRING(val, buf, 1); + break; - case ASN_IPADDRESS: /* 0x40, snmp_impl.h */ - snprintf(buf, buflen, "%d.%d.%d.%d", - (vars->val.string)[0], (vars->val.string)[1], - (vars->val.string)[2], (vars->val.string)[3]); - buf[buflen]=0; - ZVAL_STRING(val, buf, 1); - break; + case ASN_IPADDRESS: /* 0x40, snmp_impl.h */ + snprintf(buf, buflen, "%d.%d.%d.%d", + (vars->val.string)[0], (vars->val.string)[1], + (vars->val.string)[2], (vars->val.string)[3]); + buf[buflen]=0; + ZVAL_STRING(val, buf, 1); + break; - case ASN_COUNTER: /* 0x41, snmp_impl.h */ - case ASN_GAUGE: /* 0x42, snmp_impl.h */ - /* ASN_UNSIGNED is the same as ASN_GAUGE */ - case ASN_TIMETICKS: /* 0x43, snmp_impl.h */ - case ASN_UINTEGER: /* 0x47, snmp_impl.h */ - snprintf(buf, buflen, "%lu", *vars->val.integer); - buf[buflen]=0; - ZVAL_STRING(val, buf, 1); - break; + case ASN_COUNTER: /* 0x41, snmp_impl.h */ + case ASN_GAUGE: /* 0x42, snmp_impl.h */ + /* ASN_UNSIGNED is the same as ASN_GAUGE */ + case ASN_TIMETICKS: /* 0x43, snmp_impl.h */ + case ASN_UINTEGER: /* 0x47, snmp_impl.h */ + snprintf(buf, buflen, "%lu", *vars->val.integer); + buf[buflen]=0; + ZVAL_STRING(val, buf, 1); + break; - case ASN_INTEGER: /* 0x02, asn1.h */ - snprintf(buf, buflen, "%ld", *vars->val.integer); - buf[buflen]=0; - ZVAL_STRING(val, buf, 1); - break; + case ASN_INTEGER: /* 0x02, asn1.h */ + snprintf(buf, buflen, "%ld", *vars->val.integer); + buf[buflen]=0; + ZVAL_STRING(val, buf, 1); + break; #if defined(NETSNMP_WITH_OPAQUE_SPECIAL_TYPES) || defined(OPAQUE_SPECIAL_TYPES) - case ASN_OPAQUE_FLOAT: /* 0x78, asn1.h */ - snprintf(buf, buflen, "%f", *vars->val.floatVal); - ZVAL_STRING(val, buf, 1); - break; + case ASN_OPAQUE_FLOAT: /* 0x78, asn1.h */ + snprintf(buf, buflen, "%f", *vars->val.floatVal); + ZVAL_STRING(val, buf, 1); + break; - case ASN_OPAQUE_DOUBLE: /* 0x79, asn1.h */ - snprintf(buf, buflen, "%Lf", *vars->val.doubleVal); - ZVAL_STRING(val, buf, 1); - break; + case ASN_OPAQUE_DOUBLE: /* 0x79, asn1.h */ + snprintf(buf, buflen, "%Lf", *vars->val.doubleVal); + ZVAL_STRING(val, buf, 1); + break; - case ASN_OPAQUE_I64: /* 0x80, asn1.h */ - printI64(buf, vars->val.counter64); - ZVAL_STRING(val, buf, 1); - break; + case ASN_OPAQUE_I64: /* 0x80, asn1.h */ + printI64(buf, vars->val.counter64); + ZVAL_STRING(val, buf, 1); + break; - case ASN_OPAQUE_U64: /* 0x81, asn1.h */ + case ASN_OPAQUE_U64: /* 0x81, asn1.h */ #endif - case ASN_COUNTER64: /* 0x46, snmp_impl.h */ - printU64(buf, vars->val.counter64); - ZVAL_STRING(val, buf, 1); - break; + case ASN_COUNTER64: /* 0x46, snmp_impl.h */ + printU64(buf, vars->val.counter64); + ZVAL_STRING(val, buf, 1); + break; - default: - ZVAL_STRING(val, "Unknown value type", 1); - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown value type: %u", vars->type); - break; + default: + ZVAL_STRING(val, "Unknown value type", 1); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown value type: %u", vars->type); + break; + } + } else /* use Net-SNMP value translation */ { + snprint_value(buf, buflen, vars->name, vars->name_length, vars); + ZVAL_STRING(val, buf, 1); } - if (valueretrieval == SNMP_VALUE_PLAIN) { - *snmpval = *val; - zval_copy_ctor(snmpval); - } else { + if (valueretrieval & SNMP_VALUE_OBJECT) { object_init(snmpval); add_property_long(snmpval, "type", vars->type); add_property_zval(snmpval, "value", val); + } else { + *snmpval = *val; + zval_copy_ctor(snmpval); } zval_ptr_dtor(&val); @@ -1640,16 +1636,12 @@ RETURN_FALSE; } - switch(method) { - case SNMP_VALUE_LIBRARY: - case SNMP_VALUE_PLAIN: - case SNMP_VALUE_OBJECT: + if (method >= 0 && method <= (SNMP_VALUE_LIBRARY|SNMP_VALUE_PLAIN|SNMP_VALUE_OBJECT)) { SNMP_G(valueretrieval) = method; RETURN_TRUE; - break; - default: - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown SNMP value retrieval method '%ld'", method); - RETURN_FALSE; + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown SNMP value retrieval method '%ld'", method); + RETURN_FALSE; } } /* }}} */ @@ -1658,6 +1650,10 @@ Return the method how the SNMP values will be returned */ PHP_FUNCTION(snmp_get_valueretrieval) { + if (zend_parse_parameters_none() == FAILURE) { + RETURN_FALSE; + } + RETURN_LONG(SNMP_G(valueretrieval)); } /* }}} */ @@ -2135,16 +2131,11 @@ newval = &ztmp; } - switch(Z_LVAL_P(newval)) { - case SNMP_VALUE_LIBRARY: - case SNMP_VALUE_PLAIN: - case SNMP_VALUE_OBJECT: - snmp_object->valueretrieval = Z_LVAL_P(newval); - break; - default: - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown SNMP value retrieval method '%ld'", Z_LVAL_P(newval)); - ret = FAILURE; - break; + if (Z_LVAL_P(newval) >= 0 && Z_LVAL_P(newval) <= (SNMP_VALUE_LIBRARY|SNMP_VALUE_PLAIN|SNMP_VALUE_OBJECT)) { + snmp_object->valueretrieval = Z_LVAL_P(newval); + } else { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Unknown SNMP value retrieval method '%ld'", Z_LVAL_P(newval)); + ret = FAILURE; } if (newval == &ztmp) { Modified: php/php-src/branches/PHP_5_4/ext/snmp/tests/snmp_get_valueretrieval.phpt =================================================================== --- php/php-src/branches/PHP_5_4/ext/snmp/tests/snmp_get_valueretrieval.phpt 2011-07-17 15:42:44 UTC (rev 313330) +++ php/php-src/branches/PHP_5_4/ext/snmp/tests/snmp_get_valueretrieval.phpt 2011-07-17 17:18:31 UTC (rev 313331) @@ -12,6 +12,7 @@ echo "Checking error handling\n"; var_dump(snmp_get_valueretrieval('noarg')); +var_dump(snmp_set_valueretrieval()); var_dump(snmp_set_valueretrieval('noarg')); var_dump(snmp_set_valueretrieval(67)); @@ -23,12 +24,21 @@ var_dump(snmp_get_valueretrieval() === SNMP_VALUE_PLAIN); snmp_set_valueretrieval(SNMP_VALUE_OBJECT); var_dump(snmp_get_valueretrieval() === SNMP_VALUE_OBJECT); +snmp_set_valueretrieval(SNMP_VALUE_PLAIN|SNMP_VALUE_OBJECT); +var_dump(snmp_get_valueretrieval() === (SNMP_VALUE_PLAIN|SNMP_VALUE_OBJECT)); +snmp_set_valueretrieval(SNMP_VALUE_LIBRARY|SNMP_VALUE_OBJECT); +var_dump(snmp_get_valueretrieval() === (SNMP_VALUE_LIBRARY|SNMP_VALUE_OBJECT)); ?> --EXPECTF-- Checking error handling -int(%d) +Warning: snmp_get_valueretrieval() expects exactly 0 parameters, 1 given in %s on line %d +bool(false) + +Warning: snmp_set_valueretrieval() expects exactly 1 parameter, 0 given in %s on line %d +bool(false) + Warning: snmp_set_valueretrieval() expects parameter 1 to be long, %s given in %s on line %d bool(false) @@ -39,3 +49,5 @@ bool(true) bool(true) bool(true) +bool(true) +bool(true) Modified: php/php-src/branches/PHP_5_4/ext/snmp/tests/snmp_getvalue.phpt =================================================================== --- php/php-src/branches/PHP_5_4/ext/snmp/tests/snmp_getvalue.phpt 2011-07-17 15:42:44 UTC (rev 313330) +++ php/php-src/branches/PHP_5_4/ext/snmp/tests/snmp_getvalue.phpt 2011-07-17 17:18:31 UTC (rev 313331) @@ -28,6 +28,29 @@ var_dump($z->type); var_dump($z->value); +echo "Get with SNMP_VALUE_OBJECT | SNMP_VALUE_PLAIN\n"; +snmp_set_valueretrieval(SNMP_VALUE_OBJECT | SNMP_VALUE_PLAIN); +$z = snmpget($hostname, $community, '.1.3.6.1.2.1.1.1.0', $timeout, $retries); +echo gettype($z)."\n"; +var_dump($z->type); +var_dump($z->value); + +echo "Get with SNMP_VALUE_OBJECT for BITS OID\n"; +snmp_set_valueretrieval(SNMP_VALUE_OBJECT); +$z = snmpget($hostname, $community, '.1.3.6.1.2.1.88.1.4.2.1.3.6.95.115.110.109.112.100.95.108.105.110.107.68.111.119.110', $timeout, $retries); +echo gettype($z)."\n"; +var_dump($z->type); +var_dump($z->value); + +echo "Get with SNMP_VALUE_OBJECT | SNMP_VALUE_PLAIN for BITS OID\n"; +snmp_set_valueretrieval(SNMP_VALUE_OBJECT | SNMP_VALUE_PLAIN); +$z = snmpget($hostname, $community, '.1.3.6.1.2.1.88.1.4.2.1.3.6.95.115.110.109.112.100.95.108.105.110.107.68.111.119.110', $timeout, $retries); +echo gettype($z)."\n"; +var_dump($z->type); +var_dump(is_numeric($z->value)); +var_dump(is_string($z->value)); +var_dump(bin2hex($z->value)); + echo "Check parsing of different OID types\n"; snmp_set_valueretrieval(SNMP_VALUE_PLAIN); var_dump(count(snmp2_walk($hostname, $community, '.', $timeout, $retries))); @@ -41,6 +64,20 @@ Get with SNMP_VALUE_OBJECT object int(4) +string(%d) "STRING: %s" +Get with SNMP_VALUE_OBJECT | SNMP_VALUE_PLAIN +object +int(4) string(%d) "%s" +Get with SNMP_VALUE_OBJECT for BITS OID +object +int(4) +string(25) "BITS: %d %s" +Get with SNMP_VALUE_OBJECT | SNMP_VALUE_PLAIN for BITS OID +object +int(4) +bool(false) +bool(true) +string(2) "%d" Check parsing of different OID types int(%d)
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php