]> granicus.if.org Git - php/commitdiff
(RE-)Applying the contributed patch of Johan Hanne to the main tree.
authorHarrie Hazewinkel <harrie@php.net>
Mon, 14 Jul 2003 17:11:04 +0000 (17:11 +0000)
committerHarrie Hazewinkel <harrie@php.net>
Mon, 14 Jul 2003 17:11:04 +0000 (17:11 +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.
(By default the values are returned as strings, as was before)

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

index 5285a609632b829cbaf8d9d0d818b4fa702e0613..f0cba3fb100110c363c39ddf11e086d3072a6878 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 0d011aaa1be3062507400436a839347eefd3e4e1..bf9f1aaea7520890f6151c47e04bd4ca3312e383 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)
@@ -214,6 +340,7 @@ static void php_snmp_internal(INTERNAL_FUNCTION_PARAMETERS, int st,
        char buf2[2048];
        int keepwalking=1;
        char *err;
+       zval *snmpval;
 
        if (st >= 2) { /* walk */
                rootlen = MAX_NAME_LEN;
@@ -292,24 +419,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 && 
@@ -881,6 +1007,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
 
 /*