Skip to content

Commit 1de112d

Browse files
committed
Add functions to control more SNMP library output options (#21502)
1 parent a151551 commit 1de112d

5 files changed

Lines changed: 445 additions & 47 deletions

File tree

ext/snmp/php_snmp.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@ typedef struct _php_snmp_object {
4848
int valueretrieval;
4949
int quick_print;
5050
int enum_print;
51+
int numeric_index;
52+
int numeric_timeticks;
53+
int extended_index;
54+
int dont_print_units;
55+
int escape_quotes;
56+
int print_hex_text;
57+
int string_output_format;
5158
int oid_output_format;
5259
int snmp_errno;
5360
int oid_increasing_check;

ext/snmp/snmp.c

Lines changed: 193 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
9297
ZEND_DECLARE_MODULE_GLOBALS(snmp)
9398
static 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. */
15001610
PHP_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)
19872095
PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION(oid_increasing_check)
19882096
PHP_SNMP_BOOL_PROPERTY_READER_FUNCTION(quick_print)
19892097
PHP_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

19982112
PHP_SNMP_LONG_PROPERTY_READER_FUNCTION(valueretrieval)
2113+
PHP_SNMP_LONG_PROPERTY_READER_FUNCTION(string_output_format)
19992114
PHP_SNMP_LONG_PROPERTY_READER_FUNCTION(oid_output_format)
20002115
PHP_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)
20532169
PHP_SNMP_BOOL_PROPERTY_WRITER_FUNCTION(quick_print)
20542170
PHP_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
/* {{{ */
20582197
static 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) /* {{{ */
21012240
const 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 */
21762352
PHP_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

Comments
 (0)