]> granicus.if.org Git - php/commitdiff
new propery noOIDIncreasingCheck allowing to skip
authorBoris Lytochkin <lytboris@php.net>
Sun, 17 Jul 2011 19:47:24 +0000 (19:47 +0000)
committerBoris Lytochkin <lytboris@php.net>
Sun, 17 Jul 2011 19:47:24 +0000 (19:47 +0000)
OID increasing check (userful for bogus SNMP agents)

ext/snmp/php_snmp.h
ext/snmp/snmp.c
ext/snmp/tests/snmp-object-properties.phpt

index 7ba07e005f0e039a93f9b40a70edc30a966006d6..e7b3576ee5de6105830958fa625a86f47c0487ad 100644 (file)
@@ -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;
 
index 9dc7a19b5f6d91895a566b080b76f35028816ec7..c457fccdfe7d6052341738390c22864dbe15d23b 100644 (file)
@@ -368,6 +368,7 @@ struct objid_query {
        long max_repetitions;
        int valueretrieval;
        int array_output;
+       int noOIDIncreasingCheck;
        snmpobjarg *vars;
 };
 
@@ -863,7 +864,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;
@@ -1316,6 +1317,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) {
@@ -1409,6 +1411,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);
@@ -2042,41 +2045,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)
@@ -2146,45 +2136,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)
@@ -2246,6 +2219,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}
 };
 /* }}} */
index 98423670c1ad48ae74abd83c8feece428a112759..51699a5a30822b035d0e8293fadd7e38b7c32cb7 100644 (file)
@@ -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"
 }