Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:2393 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 22704 invoked from network); 18 Jun 2003 18:04:58 -0000 Received: from unknown (HELO mail.gmx.net) (213.165.64.20) by pb1.pair.com with SMTP; 18 Jun 2003 18:04:58 -0000 Received: (qmail 10351 invoked by uid 65534); 18 Jun 2003 18:04:57 -0000 Received: from pD90540B0.dip.t-dialin.net (EHLO dh3mb.ampr.org) (217.5.64.176) by mail.gmx.net (mp001) with SMTP; 18 Jun 2003 20:04:57 +0200 To: internals@lists.php.net Date: Wed, 18 Jun 2003 20:08:32 +0200 User-Agent: KMail/1.5.2 Cc: Harrie Hazewinkel MIME-Version: 1.0 Content-Disposition: inline Message-ID: <200306172028.06443.jhml@gmx.net> Content-Type: Multipart/Mixed; boundary="Boundary-00=_gqK8+4RCpfdWWX5" Subject: [PATCH] SNMP, 2nd try From: jhml@gmx.net (Johann Hanne) --Boundary-00=_gqK8+4RCpfdWWX5 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline 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 --Boundary-00=_gqK8+4RCpfdWWX5 Content-Type: text/plain; charset="us-ascii"; name="snmp-valueretrieval.patch" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="snmp-valueretrieval.patch" ? 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 | | Steven Lawrance | | Harrie Hazewinkel | + | Johann Hanne | +----------------------------------------------------------------------+ */ @@ -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 | | Steven Lawrance | | Harrie Hazewinkel | + | Johann Hanne | +----------------------------------------------------------------------+ */ @@ -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)); } /* }}} */ --Boundary-00=_gqK8+4RCpfdWWX5 Content-Type: text/plain; charset="us-ascii"; name="snmptest.php" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="snmptest.php" #!/usr/local/bin/php 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"; ?> --Boundary-00=_gqK8+4RCpfdWWX5--