Hi all, this is the second version of my patch regarding the SNMP value retrieval. If you want to know more, please have a look at my previous explanation: http://www.phpbuilder.com/mail/php-developer-list/2003011/0449.php
(And BTW, for some PHP security fun, have a look at: http://www.phpbuilder.com/mail/php-developer-list/2003011/att-0449/02-snmptest.php) Some things have been modified by request: - The ASN_* constants are now named SNMP_* - The SNMP_VALUEMETHOD_* constants are now named SNMP_VALUE_* (shorter, but I want to keep the _VALUE_ part to make them distinguishable from the other SNMP_* constants) - The snmp_set/get_valuemethod() functions are now named snmp_set/get_valueretrieval() - The Net-SNMP experimental value types have been dropped A modified test-script is also attached... Cheers, Jonny
? snmp.patch Index: ext/snmp/php_snmp.h =================================================================== RCS file: /repository/php4/ext/snmp/php_snmp.h,v retrieving revision 1.18 diff -u -r1.18 php_snmp.h --- ext/snmp/php_snmp.h 10 Jun 2003 20:03:36 -0000 1.18 +++ ext/snmp/php_snmp.h 18 Jun 2003 08:02:59 -0000 @@ -16,6 +16,7 @@ | Mike Jackson <[EMAIL PROTECTED]> | | Steven Lawrance <[EMAIL PROTECTED]> | | Harrie Hazewinkel <[EMAIL PROTECTED]> | + | Johann Hanne <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ @@ -33,6 +34,10 @@ extern zend_module_entry snmp_module_entry; #define snmp_module_ptr &snmp_module_entry +#ifdef ZTS +#include "TSRM.h" +#endif + PHP_MINIT_FUNCTION(snmp); PHP_MINFO_FUNCTION(snmp); @@ -49,6 +54,19 @@ PHP_FUNCTION(snmp3_walk); PHP_FUNCTION(snmp3_real_walk); PHP_FUNCTION(snmp3_set); + +PHP_FUNCTION(snmp_set_valueretrieval); +PHP_FUNCTION(snmp_get_valueretrieval); + +ZEND_BEGIN_MODULE_GLOBALS(snmp) + int valueretrieval; +ZEND_END_MODULE_GLOBALS(snmp) + +#ifdef ZTS +#define SNMP_G(v) TSRMG(snmp_globals_id, zend_snmp_globals *, v) +#else +#define SNMP_G(v) (snmp_globals.v) +#endif #else Index: ext/snmp/snmp.c =================================================================== RCS file: /repository/php4/ext/snmp/snmp.c,v retrieving revision 1.77 diff -u -r1.77 snmp.c --- ext/snmp/snmp.c 10 Jun 2003 20:03:36 -0000 1.77 +++ ext/snmp/snmp.c 18 Jun 2003 08:02:59 -0000 @@ -16,6 +16,7 @@ | Mike Jackson <[EMAIL PROTECTED]> | | Steven Lawrance <[EMAIL PROTECTED]> | | Harrie Hazewinkel <[EMAIL PROTECTED]> | + | Johann Hanne <[EMAIL PROTECTED]> | +----------------------------------------------------------------------+ */ @@ -109,6 +110,12 @@ #define SNMP_MSG_GETNEXT GETNEXT_REQ_MSG #endif +#define SNMP_VALUE_LIBRARY 0 +#define SNMP_VALUE_PLAIN 1 +#define SNMP_VALUE_OBJECT 2 + +ZEND_DECLARE_MODULE_GLOBALS(snmp) + /* constant - can be shared among threads */ static oid objid_mib[] = {1, 3, 6, 1, 2, 1}; @@ -131,6 +138,8 @@ PHP_FE(snmp3_walk, NULL) PHP_FE(snmp3_real_walk, NULL) PHP_FE(snmp3_set, NULL) + PHP_FE(snmp_set_valueretrieval, NULL) + PHP_FE(snmp_get_valueretrieval, NULL) {NULL,NULL,NULL} }; /* }}} */ @@ -157,11 +166,39 @@ /* THREAD_LS snmp_module php_snmp_module; - may need one of these at some point */ +/* {{{ php_snmp_init_globals + */ +static void php_snmp_init_globals(zend_snmp_globals *snmp_globals) +{ + snmp_globals->valueretrieval = 0; +} +/* }}} */ + /* {{{ PHP_MINIT_FUNCTION */ PHP_MINIT_FUNCTION(snmp) { init_snmp("snmpapp"); + + ZEND_INIT_MODULE_GLOBALS(snmp, php_snmp_init_globals, NULL); + + REGISTER_LONG_CONSTANT("SNMP_VALUE_LIBRARY", SNMP_VALUE_LIBRARY, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("SNMP_VALUE_PLAIN", SNMP_VALUE_PLAIN, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("SNMP_VALUE_OBJECT", SNMP_VALUE_OBJECT, CONST_CS | CONST_PERSISTENT); + + REGISTER_LONG_CONSTANT("SNMP_BIT_STR", ASN_BIT_STR, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("SNMP_OCTET_STR", ASN_OCTET_STR, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("SNMP_OPAQUE", ASN_OPAQUE, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("SNMP_NULL", ASN_NULL, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("SNMP_OBJECT_ID", ASN_OBJECT_ID, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("SNMP_IPADDRESS", ASN_IPADDRESS, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("SNMP_COUNTER", ASN_GAUGE, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("SNMP_UNSIGNED", ASN_UNSIGNED, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("SNMP_TIMETICKS", ASN_TIMETICKS, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("SNMP_UINTEGER", ASN_UINTEGER, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("SNMP_INTEGER", ASN_INTEGER, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("SNMP_COUNTER64", ASN_COUNTER64, CONST_CS | CONST_PERSISTENT); + return SUCCESS; } /* }}} */ @@ -182,6 +219,95 @@ } /* }}} */ +static void php_snmp_getvalue(struct variable_list *vars, zval *snmpval TSRMLS_DC) +{ + zval *val; +#if I64CHARSZ > 2047 + char buf[I64CHARSZ + 1]; +#else + char buf[2048]; +#endif + + if (SNMP_G(valueretrieval) == 0) { +#ifdef HAVE_NET_SNMP + snprint_value(buf, sizeof(buf), vars->name, vars->name_length, vars); +#else + sprint_value(buf,vars->name, vars->name_length, vars); +#endif + ZVAL_STRING(snmpval, buf, 1); + return; + } + + MAKE_STD_ZVAL(val); + + switch (vars->type) { + case ASN_BIT_STR: /* 0x03, asn1.h */ + ZVAL_STRINGL(val, vars->val.bitstring, vars->val_len, 1); + break; + + case ASN_OCTET_STR: /* 0x04, asn1.h */ + case ASN_OPAQUE: /* 0x44, snmp_impl.h */ + ZVAL_STRINGL(val, vars->val.string, vars->val_len, 1); + break; + + case ASN_NULL: /* 0x05, asn1.h */ + ZVAL_NULL(val); + break; + + case ASN_OBJECT_ID: /* 0x06, asn1.h */ +#ifdef HAVE_NET_SNMP + snprint_objid(buf, sizeof(buf), vars->val.objid, vars->val_len / sizeof(oid)); +#else + sprint_objid(buf, vars->val.objid, vars->val_len / sizeof(oid)); +#endif + + ZVAL_STRING(val, buf, 1); + break; + + case ASN_IPADDRESS: /* 0x40, snmp_impl.h */ + snprintf(buf, sizeof(buf)-1, "%d.%d.%d.%d", + (vars->val.string)[0], (vars->val.string)[1], + (vars->val.string)[2], (vars->val.string)[3]); + buf[sizeof(buf)-1]=0; + ZVAL_STRING(val, buf, 1); + break; + + case ASN_COUNTER: /* 0x41, snmp_impl.h */ + case ASN_GAUGE: /* 0x42, snmp_impl.h */ + /* ASN_UNSIGNED is the same as ASN_GAUGE */ + case ASN_TIMETICKS: /* 0x43, snmp_impl.h */ + case ASN_UINTEGER: /* 0x47, snmp_impl.h */ + snprintf(buf, sizeof(buf)-1, "%u", *vars->val.integer); + buf[sizeof(buf)-1]=0; + ZVAL_STRING(val, buf, 1); + break; + + case ASN_INTEGER: /* 0x02, asn1.h */ + snprintf(buf, sizeof(buf)-1, "%d", *vars->val.integer); + buf[sizeof(buf)-1]=0; + ZVAL_STRING(val, buf, 1); + break; + + case ASN_COUNTER64: /* 0x46, snmp_impl.h */ + printU64(buf, vars->val.counter64); + ZVAL_STRING(val, buf, 1); + break; + + default: + ZVAL_STRING(val, "Unknown value type", 1); + break; + } + + if (SNMP_G(valueretrieval) == 1) { + *snmpval = *val; + zval_copy_ctor(snmpval); + } else { + object_init(snmpval); + add_property_long(snmpval, "type", vars->type); + add_property_zval(snmpval, "value", val); + } +} + /* {{{ php_snmp_internal * * Generic SNMP object fetcher (for both v3 and v1) @@ -214,6 +340,7 @@ char buf2[2048]; int keepwalking=1; char *err; + zval *snmpval; if (st >= 2) { /* walk */ rootlen = MAX_NAME_LEN; @@ -292,24 +419,23 @@ } if (st != 11) { -#ifdef HAVE_NET_SNMP - snprint_value(buf, sizeof(buf), vars->name, vars->name_length, vars); -#else - sprint_value(buf,vars->name, vars->name_length, vars); -#endif + MAKE_STD_ZVAL(snmpval); + php_snmp_getvalue(vars, snmpval TSRMLS_CC); } if (st == 1) { - RETVAL_STRING(buf,1); + *return_value = *snmpval; + zval_copy_ctor(return_value); + return; } else if (st == 2) { - add_next_index_string(return_value,buf,1); /* Add to returned array */ + add_next_index_zval(return_value,snmpval); /* Add to returned array */ } else if (st == 3) { #ifdef HAVE_NET_SNMP snprint_objid(buf2, sizeof(buf2), vars->name, vars->name_length); #else sprint_objid(buf2, vars->name, vars->name_length); #endif - add_assoc_string(return_value,buf2,buf,1); + add_assoc_zval(return_value,buf2,snmpval); } if (st >= 2 && st != 11) { if (vars->type != SNMP_ENDOFMIBVIEW && @@ -878,6 +1004,35 @@ PHP_FUNCTION(snmp3_set) { php_snmpv3(INTERNAL_FUNCTION_PARAM_PASSTHRU, 11); +} +/* }}} */ + +/* {{{ proto int snmp_set_valueretrieval(int method) + Specify the method how the SNMP values will be returned */ +PHP_FUNCTION(snmp_set_valueretrieval) +{ + zval **method; + + if (ZEND_NUM_ARGS() != 1 || + zend_get_parameters_ex(ZEND_NUM_ARGS(), &method) == FAILURE) { + WRONG_PARAM_COUNT; + } + + convert_to_long_ex(method); + + if ((Z_LVAL_PP(method) == SNMP_VALUE_LIBRARY) || + (Z_LVAL_PP(method) == SNMP_VALUE_PLAIN) || + (Z_LVAL_PP(method) == SNMP_VALUE_OBJECT)) { + SNMP_G(valueretrieval) = Z_LVAL_PP(method); + } +} +/* }}} */ + +/* {{{ proto int snmp_get_valueretrieval() + Return the method how the SNMP values will be returned */ +PHP_FUNCTION(snmp_get_valueretrieval) +{ + RETURN_LONG(SNMP_G(valueretrieval)); } /* }}} */
#!/usr/local/bin/php <?php #$host="192.168.1.1"; #$community="public"; $host="10.160.254.130"; $community="rollout"; print "Calling snmp_set_valueretrieval(SNMP_VALUEMETHOD_LIBRARY)...\n"; snmp_set_valueretrieval(SNMP_VALUE_LIBRARY); print "snmp_get_valueretrieval() returns: ".snmp_get_valueretrieval()."\n"; $uptime=snmpget($host, $community, ".1.3.6.1.2.1.1.3.0"); print "snmpget() returned: $uptime\n\n"; /* Will print: Timeticks: (304067931) 35 days, 4:37:59.31 */ print "Calling snmp_set_valueretrieval(SNMP_VALUEMETHOD_PLAIN)...\n"; snmp_set_valueretrieval(SNMP_VALUE_PLAIN); print "snmp_get_valueretrieval() returns: ".snmp_get_valueretrieval()."\n"; $uptime=snmpget($host, $community, ".1.3.6.1.2.1.1.3.0"); print "snmpget() returned: $uptime\n\n"; /* Will print: 304067933 */ print "Calling snmp_set_valueretrieval(SNMP_VALUEMETHOD_OBJECT)...\n"; snmp_set_valueretrieval(SNMP_VALUE_OBJECT); print "snmp_get_valueretrieval() returns: ".snmp_get_valueretrieval()."\n"; $uptime=snmpget($host, $community, ".1.3.6.1.2.1.1.3.0"); print "snmpget() returned: $uptime\n"; print_r($uptime); print "\n"; /* Will print: stdClass Object ( [type] => 67 [value] => 304067935 ) */ /* Illegal parameter is ignored */ print "Calling snmp_set_valueretrieval(-123)...\n"; snmp_set_valueretrieval(-123); print "snmp_get_valueretrieval() returns: ".snmp_get_valueretrieval()."\n"; ?>
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php