@@ -89,6 +89,11 @@ typedef struct snmp_session php_snmp_session;
8989 } \
9090}
9191
92+ static php_snmp_object saved_snmp_settings ;
93+ static int saved_mib_allow_underscores ;
94+ static int saved_mib_comment_term ;
95+ static int saved_mib_replace ;
96+
9297ZEND_DECLARE_MODULE_GLOBALS (snmp )
9398static PHP_GINIT_FUNCTION (snmp );
9499
@@ -1215,6 +1220,42 @@ static ZEND_ATTRIBUTE_NONNULL_ARGS(2) bool snmp_session_set_security(struct snmp
12151220}
12161221/* }}} */
12171222
1223+ /* {{{ Save the snmplib state into the given php_snmp_object */
1224+ static void save_snmplib_output_options (php_snmp_object * snmp_object )
1225+ {
1226+ // Booleans
1227+ snmp_object -> quick_print = netsnmp_ds_get_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_QUICK_PRINT );
1228+ snmp_object -> enum_print = netsnmp_ds_get_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM );
1229+ snmp_object -> numeric_index = netsnmp_ds_get_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_DONT_BREAKDOWN_OIDS );
1230+ snmp_object -> numeric_timeticks = netsnmp_ds_get_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_NUMERIC_TIMETICKS );
1231+ snmp_object -> extended_index = netsnmp_ds_get_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_EXTENDED_INDEX );
1232+ snmp_object -> dont_print_units = netsnmp_ds_get_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_DONT_PRINT_UNITS );
1233+ snmp_object -> escape_quotes = netsnmp_ds_get_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_ESCAPE_QUOTES );
1234+ snmp_object -> print_hex_text = netsnmp_ds_get_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_PRINT_HEX_TEXT );
1235+ // Integers
1236+ snmp_object -> string_output_format = netsnmp_ds_get_int (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_STRING_OUTPUT_FORMAT );
1237+ snmp_object -> oid_output_format = netsnmp_ds_get_int (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_OID_OUTPUT_FORMAT );
1238+ }
1239+ /* }}} */
1240+
1241+ /* {{{ Set the snmplib output options using the given php_snmp_object */
1242+ static void set_snmplib_output_options (php_snmp_object * snmp_object )
1243+ {
1244+ // Booleans
1245+ netsnmp_ds_set_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_QUICK_PRINT , snmp_object -> quick_print );
1246+ netsnmp_ds_set_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM , snmp_object -> enum_print );
1247+ netsnmp_ds_set_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_DONT_BREAKDOWN_OIDS , snmp_object -> numeric_index );
1248+ netsnmp_ds_set_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_NUMERIC_TIMETICKS , snmp_object -> numeric_timeticks );
1249+ netsnmp_ds_set_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_EXTENDED_INDEX , snmp_object -> extended_index );
1250+ netsnmp_ds_set_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_DONT_PRINT_UNITS , snmp_object -> dont_print_units );
1251+ netsnmp_ds_set_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_ESCAPE_QUOTES , snmp_object -> escape_quotes );
1252+ netsnmp_ds_set_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_PRINT_HEX_TEXT , snmp_object -> print_hex_text );
1253+ // Integers
1254+ netsnmp_ds_set_int (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_STRING_OUTPUT_FORMAT , snmp_object -> string_output_format );
1255+ netsnmp_ds_set_int (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_OID_OUTPUT_FORMAT , snmp_object -> oid_output_format );
1256+ }
1257+ /* }}} */
1258+
12181259/* {{{ php_snmp
12191260*
12201261* Generic SNMP handler for all versions.
@@ -1398,12 +1439,10 @@ static void php_snmp(INTERNAL_FUNCTION_PARAMETERS, int st, int version)
13981439 }
13991440 objid_query .oid_increasing_check = snmp_object -> oid_increasing_check ;
14001441 objid_query .valueretrieval = snmp_object -> valueretrieval ;
1401- glob_snmp_object .enum_print = netsnmp_ds_get_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM );
1402- netsnmp_ds_set_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM , snmp_object -> enum_print );
1403- glob_snmp_object .quick_print = netsnmp_ds_get_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_QUICK_PRINT );
1404- netsnmp_ds_set_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_QUICK_PRINT , snmp_object -> quick_print );
1405- glob_snmp_object .oid_output_format = netsnmp_ds_get_int (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_OID_OUTPUT_FORMAT );
1406- netsnmp_ds_set_int (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_OID_OUTPUT_FORMAT , snmp_object -> oid_output_format );
1442+
1443+ // Save the global snmplib output options and set the options to those defined by the object instance
1444+ save_snmplib_output_options (& glob_snmp_object );
1445+ set_snmplib_output_options (snmp_object );
14071446 }
14081447
14091448 if (objid_query .max_repetitions < 0 ) {
@@ -1417,9 +1456,8 @@ static void php_snmp(INTERNAL_FUNCTION_PARAMETERS, int st, int version)
14171456 if (session_less_mode ) {
14181457 snmp_session_free (& session );
14191458 } else {
1420- netsnmp_ds_set_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM , glob_snmp_object .enum_print );
1421- netsnmp_ds_set_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_QUICK_PRINT , glob_snmp_object .quick_print );
1422- netsnmp_ds_set_int (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_OID_OUTPUT_FORMAT , glob_snmp_object .oid_output_format );
1459+ // Restore the snmplib output options back to the global state
1460+ set_snmplib_output_options (& glob_snmp_object );
14231461 }
14241462}
14251463/* }}} */
@@ -1496,6 +1534,78 @@ PHP_FUNCTION(snmp_set_enum_print)
14961534}
14971535/* }}} */
14981536
1537+ /* {{{ Set walk option. */
1538+ PHP_FUNCTION (snmp_set_mib_option )
1539+ {
1540+ zend_long a1 , a2 ;
1541+
1542+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "lb" , & a1 , & a2 ) == FAILURE ) {
1543+ RETURN_THROWS ();
1544+ }
1545+
1546+ switch (a1 ) {
1547+ case NETSNMP_DS_LIB_MIB_PARSE_LABEL :
1548+ case NETSNMP_DS_LIB_MIB_COMMENT_TERM :
1549+ case NETSNMP_DS_LIB_MIB_REPLACE :
1550+ netsnmp_ds_set_boolean (NETSNMP_DS_LIBRARY_ID , a1 , (int ) a2 );
1551+ break ;
1552+ default :
1553+ zend_argument_value_error (1 , "must be an SNMP_MIB_* constant" );
1554+ RETURN_THROWS ();
1555+ }
1556+ }
1557+ /* }}} */
1558+
1559+ /* {{{ Set the string output format. */
1560+ PHP_FUNCTION (snmp_set_string_output_format )
1561+ {
1562+ zend_long a1 ;
1563+
1564+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "l" , & a1 ) == FAILURE ) {
1565+ RETURN_THROWS ();
1566+ }
1567+
1568+ switch (a1 ) {
1569+ case NETSNMP_STRING_OUTPUT_GUESS :
1570+ case NETSNMP_STRING_OUTPUT_ASCII :
1571+ case NETSNMP_STRING_OUTPUT_HEX :
1572+ netsnmp_ds_set_int (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_STRING_OUTPUT_FORMAT , a1 );
1573+ break ;
1574+ default :
1575+ zend_argument_value_error (1 , "must be an SNMP_STRING_OUTPUT_* constant" );
1576+ RETURN_THROWS ();
1577+ }
1578+ }
1579+ /* }}} */
1580+
1581+ /* {{{ Set output format option. */
1582+ PHP_FUNCTION (snmp_set_output_option )
1583+ {
1584+ zend_long a1 , a2 ;
1585+
1586+ if (zend_parse_parameters (ZEND_NUM_ARGS (), "lb" , & a1 , & a2 ) == FAILURE ) {
1587+ RETURN_THROWS ();
1588+ }
1589+
1590+ switch (a1 ) {
1591+ case NETSNMP_DS_LIB_DONT_BREAKDOWN_OIDS :
1592+ case NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM :
1593+ case NETSNMP_DS_LIB_ESCAPE_QUOTES :
1594+ case NETSNMP_DS_LIB_QUICK_PRINT :
1595+ case NETSNMP_DS_LIB_NUMERIC_TIMETICKS :
1596+ case NETSNMP_DS_LIB_PRINT_HEX_TEXT :
1597+ case NETSNMP_DS_LIB_DONT_PRINT_UNITS :
1598+ case NETSNMP_DS_LIB_PRINT_BARE_VALUE :
1599+ case NETSNMP_DS_LIB_EXTENDED_INDEX :
1600+ netsnmp_ds_set_boolean (NETSNMP_DS_LIBRARY_ID , a1 , (int ) a2 );
1601+ break ;
1602+ default :
1603+ zend_argument_value_error (1 , "must be an SNMP_OUTPUT_* constant" );
1604+ RETURN_THROWS ();
1605+ }
1606+ }
1607+ /* }}} */
1608+
14991609/* {{{ Set the OID output format. */
15001610PHP_FUNCTION (snmp_set_oid_output_format )
15011611{
@@ -1674,9 +1784,7 @@ PHP_METHOD(SNMP, __construct)
16741784 }
16751785 snmp_object -> max_oids = 0 ;
16761786 snmp_object -> valueretrieval = SNMP_G (valueretrieval );
1677- snmp_object -> enum_print = netsnmp_ds_get_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM );
1678- snmp_object -> oid_output_format = netsnmp_ds_get_int (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_OID_OUTPUT_FORMAT );
1679- snmp_object -> quick_print = netsnmp_ds_get_boolean (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_QUICK_PRINT );
1787+ save_snmplib_output_options (snmp_object );
16801788 snmp_object -> oid_increasing_check = true;
16811789 snmp_object -> exceptions_enabled = 0 ;
16821790}
@@ -1987,6 +2095,12 @@ static int php_snmp_read_max_oids(php_snmp_object *snmp_object, zval *retval)
19872095PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION (oid_increasing_check )
19882096PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION (quick_print )
19892097PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION (enum_print )
2098+ PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION (numeric_index )
2099+ PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION (numeric_timeticks )
2100+ PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION (extended_index )
2101+ PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION (dont_print_units )
2102+ PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION (escape_quotes )
2103+ PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION (print_hex_text )
19902104
19912105#define PHP_SNMP_LONG_PROPERTY_READER_FUNCTION (name ) \
19922106 static int php_snmp_read_ ##name (php_snmp_object *snmp_object, zval *retval) \
@@ -1996,6 +2110,7 @@ PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION(enum_print)
19962110 }
19972111
19982112PHP_SNMP_LONG_PROPERTY_READER_FUNCTION (valueretrieval )
2113+ PHP_SNMP_LONG_PROPERTY_READER_FUNCTION (string_output_format )
19992114PHP_SNMP_LONG_PROPERTY_READER_FUNCTION (oid_output_format )
20002115PHP_SNMP_LONG_PROPERTY_READER_FUNCTION (exceptions_enabled )
20012116
@@ -2050,9 +2165,33 @@ static int php_snmp_write_##name(php_snmp_object *snmp_object, zval *newval) \
20502165 return SUCCESS; \
20512166}
20522167
2168+ PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION (oid_increasing_check )
20532169PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION (quick_print )
20542170PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION (enum_print )
2055- PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION (oid_increasing_check )
2171+ PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION (numeric_index )
2172+ PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION (numeric_timeticks )
2173+ PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION (extended_index )
2174+ PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION (dont_print_units )
2175+ PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION (escape_quotes )
2176+ PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION (print_hex_text )
2177+
2178+ /* {{{ */
2179+ static int php_snmp_write_string_output_format (php_snmp_object * snmp_object , zval * newval )
2180+ {
2181+ zend_long lval = zval_get_long (newval );
2182+
2183+ switch (lval ) {
2184+ case NETSNMP_STRING_OUTPUT_GUESS :
2185+ case NETSNMP_STRING_OUTPUT_ASCII :
2186+ case NETSNMP_STRING_OUTPUT_HEX :
2187+ snmp_object -> oid_output_format = lval ;
2188+ return SUCCESS ;
2189+ default :
2190+ zend_value_error ("SNMP string output print format must be an SNMP_STRING_OUTPUT_* constant" );
2191+ return FAILURE ;
2192+ }
2193+ }
2194+ /* }}} */
20562195
20572196/* {{{ */
20582197static int php_snmp_write_oid_output_format (php_snmp_object * snmp_object , zval * newval )
@@ -2101,11 +2240,18 @@ static void free_php_snmp_properties(zval *el) /* {{{ */
21012240const php_snmp_prop_handler php_snmp_property_entries [] = {
21022241 PHP_SNMP_READONLY_PROPERTY_ENTRY_RECORD (info ),
21032242 PHP_SNMP_PROPERTY_ENTRY_RECORD (max_oids ),
2104- PHP_SNMP_PROPERTY_ENTRY_RECORD (valueretrieval ),
2243+ PHP_SNMP_PROPERTY_ENTRY_RECORD (oid_increasing_check ),
21052244 PHP_SNMP_PROPERTY_ENTRY_RECORD (quick_print ),
21062245 PHP_SNMP_PROPERTY_ENTRY_RECORD (enum_print ),
2246+ PHP_SNMP_PROPERTY_ENTRY_RECORD (numeric_index ),
2247+ PHP_SNMP_PROPERTY_ENTRY_RECORD (numeric_timeticks ),
2248+ PHP_SNMP_PROPERTY_ENTRY_RECORD (extended_index ),
2249+ PHP_SNMP_PROPERTY_ENTRY_RECORD (dont_print_units ),
2250+ PHP_SNMP_PROPERTY_ENTRY_RECORD (escape_quotes ),
2251+ PHP_SNMP_PROPERTY_ENTRY_RECORD (print_hex_text ),
2252+ PHP_SNMP_PROPERTY_ENTRY_RECORD (valueretrieval ),
2253+ PHP_SNMP_PROPERTY_ENTRY_RECORD (string_output_format ),
21072254 PHP_SNMP_PROPERTY_ENTRY_RECORD (oid_output_format ),
2108- PHP_SNMP_PROPERTY_ENTRY_RECORD (oid_increasing_check ),
21092255 PHP_SNMP_PROPERTY_ENTRY_RECORD (exceptions_enabled ),
21102256 { NULL , 0 , NULL , NULL }
21112257};
@@ -2172,6 +2318,36 @@ PHP_MSHUTDOWN_FUNCTION(snmp)
21722318}
21732319/* }}} */
21742320
2321+ /* {{{ PHP_INIT_FUNCTION */
2322+ static PHP_RINIT_FUNCTION (snmp )
2323+ {
2324+ // Save the output options
2325+ save_snmplib_output_options (& saved_snmp_settings );
2326+
2327+ // Save the MIB options
2328+ saved_mib_allow_underscores = netsnmp_ds_get_int (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_MIB_PARSE_LABEL );
2329+ saved_mib_comment_term = netsnmp_ds_get_int (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_MIB_COMMENT_TERM );
2330+ saved_mib_replace = netsnmp_ds_get_int (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_MIB_REPLACE );
2331+
2332+ return SUCCESS ;
2333+ }
2334+ /* }}} */
2335+
2336+ /* {{{ PHP_RSHUTDOWN_FUNCTION */
2337+ static PHP_RSHUTDOWN_FUNCTION (snmp )
2338+ {
2339+ // Restore the output options
2340+ set_snmplib_output_options (& saved_snmp_settings );
2341+
2342+ // Restore MIB options
2343+ netsnmp_ds_set_int (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_MIB_PARSE_LABEL , saved_mib_allow_underscores );
2344+ netsnmp_ds_set_int (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_MIB_COMMENT_TERM , saved_mib_comment_term );
2345+ netsnmp_ds_set_int (NETSNMP_DS_LIBRARY_ID , NETSNMP_DS_LIB_MIB_REPLACE , saved_mib_replace );
2346+
2347+ return SUCCESS ;
2348+ }
2349+ /* }}} */
2350+
21752351/* {{{ PHP_MINFO_FUNCTION */
21762352PHP_MINFO_FUNCTION (snmp )
21772353{
@@ -2198,8 +2374,8 @@ zend_module_entry snmp_module_entry = {
21982374 ext_functions ,
21992375 PHP_MINIT (snmp ),
22002376 PHP_MSHUTDOWN (snmp ),
2201- NULL ,
2202- NULL ,
2377+ PHP_RINIT ( snmp ) ,
2378+ PHP_RSHUTDOWN ( snmp ) ,
22032379 PHP_MINFO (snmp ),
22042380 PHP_SNMP_VERSION ,
22052381 PHP_MODULE_GLOBALS (snmp ),
0 commit comments