diff options
author | Boris Lytochkin <lytboris@php.net> | 2011-07-17 19:45:05 +0000 |
---|---|---|
committer | Boris Lytochkin <lytboris@php.net> | 2011-07-17 19:45:05 +0000 |
commit | 5c110b9a76febcecb9c81e7ff7449dc3d59b1999 (patch) | |
tree | 7091f87b73a2414a36b07738511dabea7556d308 | |
parent | e1d4676065f8ba63197acb75e7a1f1242c4f633b (diff) | |
download | php-git-5c110b9a76febcecb9c81e7ff7449dc3d59b1999.tar.gz |
new propery noOIDIncreasingCheck allowing to skip
OID increasing check (userful for bogus SNMP agents)
-rw-r--r-- | ext/snmp/php_snmp.h | 1 | ||||
-rw-r--r-- | ext/snmp/snmp.c | 114 | ||||
-rw-r--r-- | ext/snmp/tests/snmp-object-properties.phpt | 10 |
3 files changed, 55 insertions, 70 deletions
diff --git a/ext/snmp/php_snmp.h b/ext/snmp/php_snmp.h index 7ba07e005f..e7b3576ee5 100644 --- a/ext/snmp/php_snmp.h +++ b/ext/snmp/php_snmp.h @@ -93,6 +93,7 @@ typedef struct _php_snmp_object { int enum_print; int oid_output_format; int snmp_errno; + int noOIDIncreasingCheck; char snmp_errstr[128]; } php_snmp_object; diff --git a/ext/snmp/snmp.c b/ext/snmp/snmp.c index cbbee99e59..58f5e52427 100644 --- a/ext/snmp/snmp.c +++ b/ext/snmp/snmp.c @@ -376,6 +376,7 @@ struct objid_query { long max_repetitions; int valueretrieval; int array_output; + int noOIDIncreasingCheck; snmpobjarg *vars; }; @@ -878,7 +879,7 @@ retry: /* OID increase check */ if (st & SNMP_CMD_WALK) { - if (snmp_oid_compare(name, name_length, vars->name, vars->name_length) >= 0) { + if (objid_query->noOIDIncreasingCheck == FALSE && snmp_oid_compare(name, name_length, vars->name, vars->name_length) >= 0) { snprint_objid(buf2, sizeof(buf2), vars->name, vars->name_length); php_snmp_error(getThis(), NULL TSRMLS_CC, PHP_SNMP_ERRNO_OID_NOT_INCREASING, "Error: OID not increasing: %s", buf2); keepwalking = 0; @@ -1331,6 +1332,7 @@ static void php_snmp(INTERNAL_FUNCTION_PARAMETERS, int st, int version) objid_query.max_repetitions = -1; objid_query.non_repeaters = 0; objid_query.valueretrieval = SNMP_G(valueretrieval); + objid_query.noOIDIncreasingCheck = FALSE; if (session_less_mode) { if (version == SNMP_VERSION_3) { @@ -1424,6 +1426,7 @@ static void php_snmp(INTERNAL_FUNCTION_PARAMETERS, int st, int version) objid_query.max_repetitions = snmp_object->max_oids; } } + objid_query.noOIDIncreasingCheck = snmp_object->noOIDIncreasingCheck; objid_query.valueretrieval = snmp_object->valueretrieval; glob_snmp_object.enum_print = netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM); netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM, snmp_object->enum_print); @@ -2107,41 +2110,28 @@ static int php_snmp_read_max_oids(php_snmp_object *snmp_object, zval **retval TS } /* }}} */ -/* {{{ */ -static int php_snmp_read_valueretrieval(php_snmp_object *snmp_object, zval **retval TSRMLS_DC) -{ - MAKE_STD_ZVAL(*retval); - ZVAL_LONG(*retval, snmp_object->valueretrieval); - return SUCCESS; -} -/* }}} */ +#define PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION(name) \ + static int php_snmp_read_##name(php_snmp_object *snmp_object, zval **retval TSRMLS_DC) \ + { \ + MAKE_STD_ZVAL(*retval); \ + ZVAL_BOOL(*retval, snmp_object->name); \ + return SUCCESS; \ + } -/* {{{ */ -static int php_snmp_read_quick_print(php_snmp_object *snmp_object, zval **retval TSRMLS_DC) -{ - MAKE_STD_ZVAL(*retval); - ZVAL_BOOL(*retval, snmp_object->quick_print); - return SUCCESS; -} -/* }}} */ +PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION(noOIDIncreasingCheck) +PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION(quick_print) +PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION(enum_print) -/* {{{ */ -static int php_snmp_read_enum_print(php_snmp_object *snmp_object, zval **retval TSRMLS_DC) -{ - MAKE_STD_ZVAL(*retval); - ZVAL_BOOL(*retval, snmp_object->enum_print); - return SUCCESS; -} -/* }}} */ +#define PHP_SNMP_LONG_PROPERTY_READER_FUNCTION(name) \ + static int php_snmp_read_##name(php_snmp_object *snmp_object, zval **retval TSRMLS_DC) \ + { \ + MAKE_STD_ZVAL(*retval); \ + ZVAL_LONG(*retval, snmp_object->name); \ + return SUCCESS; \ + } -/* {{{ */ -static int php_snmp_read_oid_output_format(php_snmp_object *snmp_object, zval **retval TSRMLS_DC) -{ - MAKE_STD_ZVAL(*retval); - ZVAL_LONG(*retval, snmp_object->oid_output_format); - return SUCCESS; -} -/* }}} */ +PHP_SNMP_LONG_PROPERTY_READER_FUNCTION(valueretrieval) +PHP_SNMP_LONG_PROPERTY_READER_FUNCTION(oid_output_format) /* {{{ */ static int php_snmp_write_info(php_snmp_object *snmp_object, zval *newval TSRMLS_DC) @@ -2211,45 +2201,28 @@ static int php_snmp_write_valueretrieval(php_snmp_object *snmp_object, zval *new } /* }}} */ -/* {{{ */ -static int php_snmp_write_quick_print(php_snmp_object *snmp_object, zval *newval TSRMLS_DC) -{ - zval ztmp; - if (Z_TYPE_P(newval) != IS_BOOL) { - ztmp = *newval; - zval_copy_ctor(&ztmp); - convert_to_boolean(&ztmp); - newval = &ztmp; - } - - snmp_object->quick_print = Z_LVAL_P(newval); - - if (newval == &ztmp) { - zval_dtor(newval); - } - return SUCCESS; +#define PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION(name) \ +static int php_snmp_write_##name(php_snmp_object *snmp_object, zval *newval TSRMLS_DC) \ +{ \ + zval ztmp; \ + if (Z_TYPE_P(newval) != IS_BOOL) { \ + ztmp = *newval; \ + zval_copy_ctor(&ztmp); \ + convert_to_boolean(&ztmp); \ + newval = &ztmp; \ + } \ +\ + snmp_object->name = Z_LVAL_P(newval); \ +\ + if (newval == &ztmp) { \ + zval_dtor(newval); \ + } \ + return SUCCESS; \ } -/* }}} */ -/* {{{ */ -static int php_snmp_write_enum_print(php_snmp_object *snmp_object, zval *newval TSRMLS_DC) -{ - zval ztmp; - if (Z_TYPE_P(newval) != IS_BOOL) { - ztmp = *newval; - zval_copy_ctor(&ztmp); - convert_to_boolean(&ztmp); - newval = &ztmp; - } - - snmp_object->enum_print = Z_LVAL_P(newval); - - if (newval == &ztmp) { - zval_dtor(newval); - } - return SUCCESS; -} -/* }}} */ +PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION(quick_print) +PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION(enum_print) +PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION(noOIDIncreasingCheck) /* {{{ */ static int php_snmp_write_oid_output_format(php_snmp_object *snmp_object, zval *newval TSRMLS_DC) @@ -2311,6 +2284,7 @@ const php_snmp_prop_handler php_snmp_property_entries[] = { PHP_SNMP_PROPERTY_ENTRY_RECORD(quick_print), PHP_SNMP_PROPERTY_ENTRY_RECORD(enum_print), PHP_SNMP_PROPERTY_ENTRY_RECORD(oid_output_format), + PHP_SNMP_PROPERTY_ENTRY_RECORD(noOIDIncreasingCheck), { NULL, 0, NULL, NULL} }; /* }}} */ diff --git a/ext/snmp/tests/snmp-object-properties.phpt b/ext/snmp/tests/snmp-object-properties.phpt index 98423670c1..51699a5a30 100644 --- a/ext/snmp/tests/snmp-object-properties.phpt +++ b/ext/snmp/tests/snmp-object-properties.phpt @@ -26,6 +26,7 @@ $session->enum_print = TRUE; $session->quick_print = TRUE; $session->valueretrieval = SNMP_VALUE_LIBRARY; $session->oid_output_format = SNMP_OID_OUTPUT_NUMERIC; +$session->noOIDIncreasingCheck = TRUE; var_dump($session); @@ -34,6 +35,7 @@ $session->enum_print = "1"; $session->quick_print = "1"; $session->valueretrieval = "1"; $session->oid_output_format = "3"; +$session->noOIDIncreasingCheck = "45"; var_dump($session); @@ -87,6 +89,8 @@ object(SNMP)#%d (%d) { bool(false) ["oid_output_format"]=> int(3) + ["noOIDIncreasingCheck"]=> + bool(false) } object(SNMP)#%d (%d) { ["info"]=> @@ -110,6 +114,8 @@ object(SNMP)#%d (%d) { bool(true) ["oid_output_format"]=> int(4) + ["noOIDIncreasingCheck"]=> + bool(true) } object(SNMP)#%d (%d) { ["info"]=> @@ -133,6 +139,8 @@ object(SNMP)#%d (%d) { bool(true) ["oid_output_format"]=> int(3) + ["noOIDIncreasingCheck"]=> + bool(true) } bool(true) bool(true) @@ -159,6 +167,8 @@ object(SNMP)#%d (%d) { bool(true) ["oid_output_format"]=> int(3) + ["noOIDIncreasingCheck"]=> + bool(true) ["123"]=> string(11) "param_value" } |