]> granicus.if.org Git - php/commitdiff
Applying the contributed patch of Johan hanne.
authorHarrie Hazewinkel <harrie@php.net>
Sat, 21 Jun 2003 21:50:01 +0000 (21:50 +0000)
committerHarrie Hazewinkel <harrie@php.net>
Sat, 21 Jun 2003 21:50:01 +0000 (21:50 +0000)
The patch enables control on the way the values are returned
into the PHP script, instaed of always strings. Also the type
of the value is now returned when configured to do so.
This enables better management scripts to do more automatic
processing and value calculations.

ext/snmp/php_snmp.h
ext/snmp/snmp.c

index d2e52da884e035549db69fcff6e2ca6768052ba0..cf572ec68135840d5e00c035bf9de53f8427dda9 100644 (file)
@@ -16,6 +16,7 @@
   |          Mike Jackson <mhjack@tscnet.com>                            |
   |          Steven Lawrance <slawrance@technologist.com>                |
   |          Harrie Hazewinkel <harrie@lisanza.net>                      |
+  |          Johann Hanne <jonny@nurfuerspam.de>                         |
   +----------------------------------------------------------------------+
 */
 
 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);
 
@@ -50,6 +55,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
 
 #define snmp_module_ptr NULL
index 77b3f18eaf84addbe48285238e89d96b9744fd24..111c2cb2379da4b0c9e3a2124034c10647c7f9a6 100644 (file)
@@ -16,6 +16,7 @@
   |          Mike Jackson <mhjack@tscnet.com>                            |
   |          Steven Lawrance <slawrance@technologist.com>                |
   |          Harrie Hazewinkel <harrie@lisanza.net>                      |
+  |          Johann Hanne <jonny@nurfuerspam.de>                         |
   +----------------------------------------------------------------------+
 */
 
 #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 @@ function_entry snmp_functions[] = {
        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 @@ ZEND_GET_MODULE(snmp)
 
 /* 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 @@ PHP_MINFO_FUNCTION(snmp)
 }
 /* }}} */
 
+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)
@@ -213,6 +339,7 @@ static void php_snmp_internal(INTERNAL_FUNCTION_PARAMETERS,
        char buf2[2048];
        int keepwalking=1;
        char *err;
+       zval *snmpval;
 
        if (st >= 2) { /* walk */
                rootlen = MAX_NAME_LEN;
@@ -291,24 +418,23 @@ retry:
                                        }
 
                                        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 && 
@@ -877,6 +1003,35 @@ PHP_FUNCTION(snmp3_set)
 }
 /* }}} */
 
+/* {{{ 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));
+}
+/* }}} */
+
 #endif
 
 /*