summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Lytochkin <lytboris@php.net>2011-07-17 19:45:05 +0000
committerBoris Lytochkin <lytboris@php.net>2011-07-17 19:45:05 +0000
commit5c110b9a76febcecb9c81e7ff7449dc3d59b1999 (patch)
tree7091f87b73a2414a36b07738511dabea7556d308
parente1d4676065f8ba63197acb75e7a1f1242c4f633b (diff)
downloadphp-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.h1
-rw-r--r--ext/snmp/snmp.c114
-rw-r--r--ext/snmp/tests/snmp-object-properties.phpt10
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"
}