On 09/21/2010 08:13 AM, Jorrit Kronjee wrote:
> <snip>
> Shall I just write a couple and include that in a new patch?
So I wrote a couple of tests:

Running 8 tests
PASS Test function snmpget() by calling it with its expected
arguments[snmpget_basic.phpt]
PASS Test function snmpget() by calling it more than or less than its
expected arguments[snmpget_error.phpt]
PASS Test function snmpgetnext() by calling it with its expected
arguments[snmpgetnext_basic.phpt]
PASS Test function snmpgetnext() by calling it more than or less than
its expected arguments[snmpgetnext_error.phpt]
PASS Test function snmpgetnextoid() by calling it with its expected
arguments[snmpgetnextoid_basic.phpt]
PASS Test function snmpgetnextoid() by calling it more than or less than
its expected arguments[snmpgetnextoid_error.phpt]
PASS Test function snmpgetoid() by calling it with its expected
arguments[snmpgetoid_basic.phpt]
PASS Test function snmpgetoid() by calling it more than or less than its
expected arguments[snmpgetoid_error.phpt]
TOTAL TIME: 00:01
8 PASSED TESTS
0 SKIPPED TESTS

These tests only run correctly with the patch. I also removed the extra
semicolons.

HTH

Regards,

Jorrit Kronjee

Index: ext/snmp/tests/snmpgetnext_error.phpt
===================================================================
--- ext/snmp/tests/snmpgetnext_error.phpt       (revision 0)
+++ ext/snmp/tests/snmpgetnext_error.phpt       (revision 0)
@@ -0,0 +1,24 @@
+--TEST--
+Test function snmpgetnext() by calling it more than or less than its expected 
arguments
+--FILE--
+<?php
+include_once("connect.inc");
+
+echo "*** Test by calling method or function with incorrect numbers of 
arguments ***\n";
+
+$extra_arg = '';
+
+var_dump(snmpgetnext( $host, $community, $object_id, $timeout, $retries, 
$extra_arg ) );
+
+var_dump(snmpgetnext( $host, $community ) );
+
+
+?>
+--EXPECTF--
+*** Test by calling method or function with incorrect numbers of arguments ***
+
+Warning: snmpgetnext() expects at most 5 parameters, 6 given in %s on line %d
+NULL
+
+Warning: snmpgetnext() expects at least 3 parameters, 2 given in %s on line %d
+NULL
Index: ext/snmp/tests/snmpget_error.phpt
===================================================================
--- ext/snmp/tests/snmpget_error.phpt   (revision 0)
+++ ext/snmp/tests/snmpget_error.phpt   (revision 0)
@@ -0,0 +1,24 @@
+--TEST--
+Test function snmpget() by calling it more than or less than its expected 
arguments
+--FILE--
+<?php
+include_once("connect.inc");
+
+echo "*** Test by calling method or function with incorrect numbers of 
arguments ***\n";
+
+$extra_arg = '';
+
+var_dump(snmpget( $host, $community, $object_id, $timeout, $retries, 
$extra_arg ) );
+
+var_dump(snmpget( $host, $community ) );
+
+
+?>
+--EXPECTF--
+*** Test by calling method or function with incorrect numbers of arguments ***
+
+Warning: snmpget() expects at most 5 parameters, 6 given in %s on line %d
+NULL
+
+Warning: snmpget() expects at least 3 parameters, 2 given in %s on line %d
+NULL
Index: ext/snmp/tests/connect.inc
===================================================================
--- ext/snmp/tests/connect.inc  (revision 0)
+++ ext/snmp/tests/connect.inc  (revision 0)
@@ -0,0 +1,17 @@
+<?php
+/*
+Default configuration is below.
+Change the SNMP_TEST_* environment values if you want to use another 
configuration.
+*/
+
+$hostname      = getenv("SNMP_TEST_HOST")      ? getenv("SNMP_TEST_HOST")      
: "localhost"; 
+$port          = getenv("SNMP_TEST_PORT")      ? getenv("SNMP_TEST_PORT")      
: 161;
+$host          = "$hostname:$port";
+$community     = getenv("SNMP_TEST_COMMUNITY") ? getenv("SNMP_TEST_COMMUNITY") 
: "abc123";
+$object_id     = getenv("SNMP_TEST_OBJECT_ID") ? getenv("SNMP_TEST_OBJECT_ID") 
: ".1.3.6.1.2.1.1.1.0"; 
+$another_object_id     = getenv("SNMP_TEST_ANOTHER_OBJECT_ID") ? 
getenv("SNMP_TEST_ANOTHER_OBJECT_ID") : ".1.3.6.1.2.1.1.3.0"; 
+$timeout       = 100000;
+$retries       = 2;
+
+
+?>
Index: ext/snmp/tests/snmpgetnextoid_basic.phpt
===================================================================
--- ext/snmp/tests/snmpgetnextoid_basic.phpt    (revision 0)
+++ ext/snmp/tests/snmpgetnextoid_basic.phpt    (revision 0)
@@ -0,0 +1,38 @@
+--TEST--
+Test function snmpgetnextoid() by calling it with its expected arguments
+--FILE--
+<?php
+include_once("connect.inc");
+
+echo "*** Test by calling method or function with its expected arguments 
***\n";
+
+var_dump(snmpgetnextoid( $host, $community, $object_id ) );
+
+var_dump(snmpgetnextoid( $host, $community, $object_id, $timeout ) );
+
+var_dump(snmpgetnextoid( $host, $community, $object_id, $timeout, $retries ) );
+
+var_dump(snmpgetnextoid( $host, $community, array($object_id, 
$another_object_id), $timeout, $retries ) );
+
+
+?>
+--EXPECTF--
+*** Test by calling method or function with its expected arguments ***
+array(1) {
+  ["%s"]=>
+  string(%d) "%s"
+}
+array(1) {
+  ["%s"]=>
+  string(%d) "%s"
+}
+array(1) {
+  ["%s"]=>
+  string(%d) "%s"
+}
+array(2) {
+  ["%s"]=>
+  string(%d) "%s"
+  ["%s"]=>
+  string(%d) "%s"
+}
Index: ext/snmp/tests/snmpgetoid_basic.phpt
===================================================================
--- ext/snmp/tests/snmpgetoid_basic.phpt        (revision 0)
+++ ext/snmp/tests/snmpgetoid_basic.phpt        (revision 0)
@@ -0,0 +1,38 @@
+--TEST--
+Test function snmpgetoid() by calling it with its expected arguments
+--FILE--
+<?php
+include_once("connect.inc");
+
+echo "*** Test by calling method or function with its expected arguments 
***\n";
+
+var_dump(snmpgetoid( $host, $community, $object_id ) );
+
+var_dump(snmpgetoid( $host, $community, $object_id, $timeout ) );
+
+var_dump(snmpgetoid( $host, $community, $object_id, $timeout, $retries ) );
+
+var_dump(snmpgetoid( $host, $community, array($object_id, $another_object_id), 
$timeout, $retries ) );
+
+
+?>
+--EXPECTF--
+*** Test by calling method or function with its expected arguments ***
+array(1) {
+  ["%s"]=>
+  string(%d) "%s"
+}
+array(1) {
+  ["%s"]=>
+  string(%d) "%s"
+}
+array(1) {
+  ["%s"]=>
+  string(%d) "%s"
+}
+array(2) {
+  ["%s"]=>
+  string(%d) "%s"
+  ["%s"]=>
+  string(%d) "%s"
+}
Index: ext/snmp/tests/snmpgetnext_basic.phpt
===================================================================
--- ext/snmp/tests/snmpgetnext_basic.phpt       (revision 0)
+++ ext/snmp/tests/snmpgetnext_basic.phpt       (revision 0)
@@ -0,0 +1,29 @@
+--TEST--
+Test function snmpgetnext() by calling it with its expected arguments
+--FILE--
+<?php
+include_once("connect.inc");
+
+echo "*** Test by calling method or function with its expected arguments 
***\n";
+
+var_dump(snmpgetnext( $host, $community, $object_id ) );
+
+var_dump(snmpgetnext( $host, $community, $object_id, $timeout ) );
+
+var_dump(snmpgetnext( $host, $community, $object_id, $timeout, $retries ) );
+
+var_dump(snmpgetnext( $host, $community, array($object_id, 
$another_object_id), $timeout, $retries ) );
+
+
+?>
+--EXPECTF--
+*** Test by calling method or function with its expected arguments ***
+string(%d) "%s"
+string(%d) "%s"
+string(%d) "%s"
+array(2) {
+  [0]=>
+  string(%d) "%s"
+  [1]=>
+  string(%d) "%s"
+}
Index: ext/snmp/tests/snmpget_basic.phpt
===================================================================
--- ext/snmp/tests/snmpget_basic.phpt   (revision 0)
+++ ext/snmp/tests/snmpget_basic.phpt   (revision 0)
@@ -0,0 +1,29 @@
+--TEST--
+Test function snmpget() by calling it with its expected arguments
+--FILE--
+<?php
+include_once("connect.inc");
+
+echo "*** Test by calling method or function with its expected arguments 
***\n";
+
+var_dump(snmpget( $host, $community, $object_id ) );
+
+var_dump(snmpget( $host, $community, $object_id, $timeout ) );
+
+var_dump(snmpget( $host, $community, $object_id, $timeout, $retries ) );
+
+var_dump(snmpget( $host, $community, array($object_id, $another_object_id), 
$timeout, $retries ) );
+
+
+?>
+--EXPECTF--
+*** Test by calling method or function with its expected arguments ***
+string(%d) "%s"
+string(%d) "%s"
+string(%d) "%s"
+array(2) {
+  [0]=>
+  string(%d) "%s"
+  [1]=>
+  string(%d) "%s"
+}
Index: ext/snmp/tests/snmpgetnextoid_error.phpt
===================================================================
--- ext/snmp/tests/snmpgetnextoid_error.phpt    (revision 0)
+++ ext/snmp/tests/snmpgetnextoid_error.phpt    (revision 0)
@@ -0,0 +1,24 @@
+--TEST--
+Test function snmpgetnextoid() by calling it more than or less than its 
expected arguments
+--FILE--
+<?php
+include_once("connect.inc");
+
+echo "*** Test by calling method or function with incorrect numbers of 
arguments ***\n";
+
+$extra_arg = '';
+
+var_dump(snmpgetnextoid( $host, $community, $object_id, $timeout, $retries, 
$extra_arg ) );
+
+var_dump(snmpgetnextoid( $host, $community ) );
+
+
+?>
+--EXPECTF--
+*** Test by calling method or function with incorrect numbers of arguments ***
+
+Warning: snmpgetnextoid() expects at most 5 parameters, 6 given in %s on line 
%d
+NULL
+
+Warning: snmpgetnextoid() expects at least 3 parameters, 2 given in %s on line 
%d
+NULL
Index: ext/snmp/tests/snmpgetoid_error.phpt
===================================================================
--- ext/snmp/tests/snmpgetoid_error.phpt        (revision 0)
+++ ext/snmp/tests/snmpgetoid_error.phpt        (revision 0)
@@ -0,0 +1,24 @@
+--TEST--
+Test function snmpgetoid() by calling it more than or less than its expected 
arguments
+--FILE--
+<?php
+include_once("connect.inc");
+
+echo "*** Test by calling method or function with incorrect numbers of 
arguments ***\n";
+
+$extra_arg = '';
+
+var_dump(snmpgetoid( $host, $community, $object_id, $timeout, $retries, 
$extra_arg ) );
+
+var_dump(snmpgetoid( $host, $community ) );
+
+
+?>
+--EXPECTF--
+*** Test by calling method or function with incorrect numbers of arguments ***
+
+Warning: snmpgetoid() expects at most 5 parameters, 6 given in %s on line %d
+NULL
+
+Warning: snmpgetoid() expects at least 3 parameters, 2 given in %s on line %d
+NULL
Index: ext/snmp/php_snmp.h
===================================================================
--- ext/snmp/php_snmp.h (revision 303647)
+++ ext/snmp/php_snmp.h (working copy)
@@ -43,7 +43,9 @@
 PHP_MINFO_FUNCTION(snmp);
 
 PHP_FUNCTION(snmpget);
+PHP_FUNCTION(snmpgetoid);
 PHP_FUNCTION(snmpgetnext);
+PHP_FUNCTION(snmpgetnextoid);
 PHP_FUNCTION(snmpwalk);
 PHP_FUNCTION(snmprealwalk);
 PHP_FUNCTION(snmp_get_quick_print);
@@ -53,13 +55,17 @@
 PHP_FUNCTION(snmpset);
 
 PHP_FUNCTION(snmp2_get);
+PHP_FUNCTION(snmp2_getoid);
 PHP_FUNCTION(snmp2_getnext);
+PHP_FUNCTION(snmp2_getnextoid);
 PHP_FUNCTION(snmp2_walk);
 PHP_FUNCTION(snmp2_real_walk);
 PHP_FUNCTION(snmp2_set);
 
 PHP_FUNCTION(snmp3_get);
+PHP_FUNCTION(snmp3_getoid);
 PHP_FUNCTION(snmp3_getnext);
+PHP_FUNCTION(snmp3_getnextoid);
 PHP_FUNCTION(snmp3_walk);
 PHP_FUNCTION(snmp3_real_walk);
 PHP_FUNCTION(snmp3_set);
Index: ext/snmp/snmp.c
===================================================================
--- ext/snmp/snmp.c     (revision 303647)
+++ ext/snmp/snmp.c     (working copy)
@@ -121,6 +121,14 @@
        ZEND_ARG_INFO(0, retries)
 ZEND_END_ARG_INFO()
 
+ZEND_BEGIN_ARG_INFO_EX(arginfo_snmpgetoid, 0, 0, 3)
+       ZEND_ARG_INFO(0, host)
+       ZEND_ARG_INFO(0, community)
+       ZEND_ARG_INFO(0, object_id)
+       ZEND_ARG_INFO(0, timeout)
+       ZEND_ARG_INFO(0, retries)
+ZEND_END_ARG_INFO()
+
 ZEND_BEGIN_ARG_INFO_EX(arginfo_snmpgetnext, 0, 0, 3)
        ZEND_ARG_INFO(0, host)
        ZEND_ARG_INFO(0, community)
@@ -129,6 +137,14 @@
        ZEND_ARG_INFO(0, retries)
 ZEND_END_ARG_INFO()
 
+ZEND_BEGIN_ARG_INFO_EX(arginfo_snmpgetnextoid, 0, 0, 3)
+       ZEND_ARG_INFO(0, host)
+       ZEND_ARG_INFO(0, community)
+       ZEND_ARG_INFO(0, object_id)
+       ZEND_ARG_INFO(0, timeout)
+       ZEND_ARG_INFO(0, retries)
+ZEND_END_ARG_INFO()
+
 ZEND_BEGIN_ARG_INFO_EX(arginfo_snmpwalk, 0, 0, 3)
        ZEND_ARG_INFO(0, host)
        ZEND_ARG_INFO(0, community)
@@ -181,6 +197,14 @@
        ZEND_ARG_INFO(0, retries)
 ZEND_END_ARG_INFO()
 
+ZEND_BEGIN_ARG_INFO_EX(arginfo_snmp2_getoid, 0, 0, 3)
+       ZEND_ARG_INFO(0, host)
+       ZEND_ARG_INFO(0, community)
+       ZEND_ARG_INFO(0, object_id)
+       ZEND_ARG_INFO(0, timeout)
+       ZEND_ARG_INFO(0, retries)
+ZEND_END_ARG_INFO()
+
 ZEND_BEGIN_ARG_INFO_EX(arginfo_snmp2_getnext, 0, 0, 3)
        ZEND_ARG_INFO(0, host)
        ZEND_ARG_INFO(0, community)
@@ -189,6 +213,14 @@
        ZEND_ARG_INFO(0, retries)
 ZEND_END_ARG_INFO()
 
+ZEND_BEGIN_ARG_INFO_EX(arginfo_snmp2_getnextoid, 0, 0, 3)
+       ZEND_ARG_INFO(0, host)
+       ZEND_ARG_INFO(0, community)
+       ZEND_ARG_INFO(0, object_id)
+       ZEND_ARG_INFO(0, timeout)
+       ZEND_ARG_INFO(0, retries)
+ZEND_END_ARG_INFO()
+
 ZEND_BEGIN_ARG_INFO_EX(arginfo_snmp2_walk, 0, 0, 3)
        ZEND_ARG_INFO(0, host)
        ZEND_ARG_INFO(0, community)
@@ -233,6 +265,19 @@
        ZEND_ARG_INFO(0, retries)
 ZEND_END_ARG_INFO()
 
+ZEND_BEGIN_ARG_INFO_EX(arginfo_snmp3_getoid, 0, 0, 8)
+       ZEND_ARG_INFO(0, host)
+       ZEND_ARG_INFO(0, sec_name)
+       ZEND_ARG_INFO(0, sec_level)
+       ZEND_ARG_INFO(0, auth_protocol)
+       ZEND_ARG_INFO(0, auth_passphrase)
+       ZEND_ARG_INFO(0, priv_protocol)
+       ZEND_ARG_INFO(0, priv_passphrase)
+       ZEND_ARG_INFO(0, object_id)
+       ZEND_ARG_INFO(0, timeout)
+       ZEND_ARG_INFO(0, retries)
+ZEND_END_ARG_INFO()
+
 ZEND_BEGIN_ARG_INFO_EX(arginfo_snmp3_getnext, 0, 0, 8)
        ZEND_ARG_INFO(0, host)
        ZEND_ARG_INFO(0, sec_name)
@@ -246,6 +291,19 @@
        ZEND_ARG_INFO(0, retries)
 ZEND_END_ARG_INFO()
 
+ZEND_BEGIN_ARG_INFO_EX(arginfo_snmp3_getnextoid, 0, 0, 8)
+       ZEND_ARG_INFO(0, host)
+       ZEND_ARG_INFO(0, sec_name)
+       ZEND_ARG_INFO(0, sec_level)
+       ZEND_ARG_INFO(0, auth_protocol)
+       ZEND_ARG_INFO(0, auth_passphrase)
+       ZEND_ARG_INFO(0, priv_protocol)
+       ZEND_ARG_INFO(0, priv_passphrase)
+       ZEND_ARG_INFO(0, object_id)
+       ZEND_ARG_INFO(0, timeout)
+       ZEND_ARG_INFO(0, retries)
+ZEND_END_ARG_INFO()
+
 ZEND_BEGIN_ARG_INFO_EX(arginfo_snmp3_walk, 0, 0, 8)
        ZEND_ARG_INFO(0, host)
        ZEND_ARG_INFO(0, sec_name)
@@ -303,7 +361,9 @@
  */
 const zend_function_entry snmp_functions[] = {
        PHP_FE(snmpget,                                                 
arginfo_snmpget)
+       PHP_FE(snmpgetoid,                                              
arginfo_snmpgetoid)
        PHP_FE(snmpgetnext,                                     
arginfo_snmpgetnext)
+       PHP_FE(snmpgetnextoid,                                  
arginfo_snmpgetnextoid)
        PHP_FE(snmpwalk,                                                
arginfo_snmpwalk)
        PHP_FE(snmprealwalk,                                    
arginfo_snmprealwalk)
        PHP_FALIAS(snmpwalkoid, snmprealwalk,   arginfo_snmprealwalk)
@@ -317,13 +377,17 @@
        PHP_FE(snmpset,                                 arginfo_snmpset)
 
        PHP_FE(snmp2_get,                               arginfo_snmp2_get)
+       PHP_FE(snmp2_getoid,                    arginfo_snmp2_getoid)
        PHP_FE(snmp2_getnext,                   arginfo_snmp2_getnext)
+       PHP_FE(snmp2_getnextoid,                arginfo_snmp2_getnextoid)
        PHP_FE(snmp2_walk,                              arginfo_snmp2_walk)
        PHP_FE(snmp2_real_walk,                 arginfo_snmp2_real_walk)
        PHP_FE(snmp2_set,                               arginfo_snmp2_set)
 
        PHP_FE(snmp3_get,                               arginfo_snmp3_get)
+       PHP_FE(snmp3_getoid,                    arginfo_snmp3_getoid)
        PHP_FE(snmp3_getnext,                   arginfo_snmp3_getnext)
+       PHP_FE(snmp3_getnextoid,                arginfo_snmp3_getnextoid)
        PHP_FE(snmp3_walk,                              arginfo_snmp3_walk)
        PHP_FE(snmp3_real_walk,                 arginfo_snmp3_real_walk)
        PHP_FE(snmp3_set,                               arginfo_snmp3_set)
@@ -336,9 +400,11 @@
 /* }}} */
 
 #define SNMP_CMD_GET           1
-#define SNMP_CMD_GETNEXT       2
-#define SNMP_CMD_WALK          3
-#define SNMP_CMD_REALWALK      4
+#define SNMP_CMD_GETOID                2
+#define SNMP_CMD_GETNEXT       3
+#define SNMP_CMD_GETNEXTOID    4
+#define SNMP_CMD_WALK          5
+#define SNMP_CMD_REALWALK      6
 #define SNMP_CMD_SET           11
 
 /* {{{ snmp_module_entry
@@ -534,7 +600,11 @@
 * Generic SNMP object fetcher (for all SNMP versions)
 *
 * st=SNMP_CMD_GET   get - query an agent with SNMP-GET.
+* st=SNMP_CMD_GETOID   get - query an agent with SNMP-GET and return an
+*                      array of the oid and corresponding value
 * st=SNMP_CMD_GETNEXT   getnext - query an agent with SNMP-GETNEXT.
+* st=SNMP_CMD_GETNEXTOID   getnext - query an agent with SNMP-GETNEXT and
+*                      return an array of the oid and corresponding value.
 * st=SNMP_CMD_WALK   walk - walk the mib and return a single dimensional array 
 *          containing the values.
 * st=SNMP_CMD_REALWALK   realwalk() and walkoid() - walk the mib and return an 
@@ -546,7 +616,8 @@
                                                        struct snmp_session 
*session,
                                                        char *objid,
                                                        char type,
-                                                       char* value) 
+                                                       char* value,
+                                                       zval *zval_oids)
 {
        struct snmp_session *ss;
        struct snmp_pdu *pdu=NULL, *response;
@@ -562,6 +633,8 @@
        int keepwalking=1;
        char *err;
        zval *snmpval = NULL;
+       zval **zval_oid = NULL;
+       int nelems, i;
 
        if (st >= SNMP_CMD_WALK) { /* walk */
                rootlen = MAX_NAME_LEN;
@@ -587,10 +660,19 @@
                RETURN_FALSE;
        }
 
-       if (st >= SNMP_CMD_WALK) {
+       if (st >= SNMP_CMD_GET) {
                memmove((char *)name, (char *)root, rootlen * sizeof(oid));
                name_length = rootlen;
+
                switch(st) {
+                       case SNMP_CMD_GET:
+                       case SNMP_CMD_GETNEXT:
+                               if (Z_TYPE_P(zval_oids) == IS_ARRAY)
+                                       array_init(return_value);
+                               break;
+
+                       case SNMP_CMD_GETOID:
+                       case SNMP_CMD_GETNEXTOID:
                        case SNMP_CMD_WALK:
                        case SNMP_CMD_REALWALK:
                                array_init(return_value);
@@ -603,15 +685,62 @@
 
        while (keepwalking) {
                keepwalking = 0;
-               if ((st == SNMP_CMD_GET) || (st == SNMP_CMD_GETNEXT)) {
+               if ((st == SNMP_CMD_GET) || (st == SNMP_CMD_GETOID) || 
+                       (st == SNMP_CMD_GETNEXT) || (st == 
SNMP_CMD_GETNEXTOID)) {
                        name_length = MAX_OID_LEN;
-                       if (!snmp_parse_oid(objid, name, &name_length)) {
-                               php_error_docref(NULL TSRMLS_CC, E_WARNING, 
"Invalid object identifier: %s", objid);
-                               snmp_close(ss);
-                               RETURN_FALSE;
+                       pdu = snmp_pdu_create((st == SNMP_CMD_GET || st == 
SNMP_CMD_GETOID) ? SNMP_MSG_GET : SNMP_MSG_GETNEXT);
+
+                       switch (Z_TYPE_P(zval_oids)) {
+                               case IS_STRING:
+                                       if 
(!snmp_parse_oid(Z_STRVAL_P(zval_oids), name, &name_length)) {
+                                               php_error_docref(NULL 
TSRMLS_CC, E_WARNING, "Invalid object identifier: %s", Z_STRVAL_P(zval_oids));
+                                               snmp_free_pdu(pdu);
+                                               snmp_close(ss);
+                                               RETURN_FALSE;
+                                       }
+                       
+                                       snmp_add_null_var(pdu, name, 
name_length);
+                                       break;
+
+                               case IS_ARRAY:
+                                       nelems = 
zend_hash_num_elements(Z_ARRVAL_P(zval_oids));                         
+                                       if (nelems == 0 ) {
+                                               RETURN_FALSE;
+                                       }
+                                       for (i = 0; i < nelems; i++) {
+                                               if 
(zend_hash_index_find(Z_ARRVAL_P(zval_oids), i, (void **) &zval_oid) == 
SUCCESS) {
+                                                       switch 
(Z_TYPE_PP(zval_oid)) {
+
+                                                               case IS_STRING:
+                                                                       if 
(!snmp_parse_oid(Z_STRVAL_PP(zval_oid), name, &name_length)) {
+                                                                               
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid object identifier: %s", 
Z_STRVAL_PP(zval_oid));
+                                                                               
snmp_free_pdu(pdu);
+                                                                               
snmp_close(ss);
+                                                                               
RETURN_FALSE;
+                                                                       }
+
+                                                                       
snmp_add_null_var(pdu, name, name_length);
+                                                                       break;
+
+                                                               default:
+                                                                       
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid argument, expect string or 
array of strings");
+                                                                       
snmp_free_pdu(pdu);
+                                                                       
snmp_close(ss);
+                                                                       
RETURN_FALSE;
+                                                       }
+                                               }
+                                       }
+                                       break;
+                               
+                               default:
+                                       php_error_docref(NULL TSRMLS_CC, 
E_WARNING, "Invalid argument, expect string or array of strings");
+                                       snmp_free_pdu(pdu);
+                                       snmp_close(ss);
+                                       RETURN_FALSE;
+                                       break;
                        }
-                       pdu = snmp_pdu_create((st == SNMP_CMD_GET) ? 
SNMP_MSG_GET : SNMP_MSG_GETNEXT);
-                       snmp_add_null_var(pdu, name, name_length);
+
+
                } else if (st == SNMP_CMD_SET) {
                        pdu = snmp_pdu_create(SNMP_MSG_SET);
                        if (snmp_add_var(pdu, name, name_length, type, value)) {
@@ -651,19 +780,25 @@
                                                php_snmp_getvalue(vars, snmpval 
TSRMLS_CC);
                                        }
 
-                                       if (st == SNMP_CMD_GET) {
-                                               *return_value = *snmpval;
-                                               zval_copy_ctor(return_value);
-                                               zval_ptr_dtor(&snmpval);
-                                               snmp_free_pdu(response);
-                                               snmp_close(ss);
-                                               return;
-                                       } else if (st == SNMP_CMD_GETNEXT) {
-                                               *return_value = *snmpval;
-                                               zval_copy_ctor(return_value);
-                                               snmp_free_pdu(response);
-                                               snmp_close(ss);
-                                               return;
+                                       if (st == SNMP_CMD_GET || st == 
SNMP_CMD_GETNEXT) {
+                                               if (Z_TYPE_P(zval_oids) == 
IS_STRING) {
+                                                       /* Return a string */
+                                                       *return_value = 
*snmpval;
+                                                       
zval_copy_ctor(return_value);
+                                                       zval_ptr_dtor(&snmpval);
+                                                       snmp_free_pdu(response);
+                                                       snmp_close(ss);
+                                                       return;
+                                               }
+                                               
add_next_index_zval(return_value,snmpval); /* Add to returned array */
+                                       } else if (st == SNMP_CMD_GETOID || st 
== SNMP_CMD_GETNEXTOID) {
+#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_zval(return_value,buf2,snmpval);
+
                                        } else if (st == SNMP_CMD_WALK) {
                                                
add_next_index_zval(return_value,snmpval); /* Add to returned array */
                                        } else if (st == SNMP_CMD_REALWALK && 
vars->type != SNMP_ENDOFMIBVIEW && vars->type != SNMP_NOSUCHOBJECT && 
vars->type != SNMP_NOSUCHINSTANCE) {
@@ -703,7 +838,8 @@
                                                }
                                                php_error_docref(NULL 
TSRMLS_CC, E_WARNING, "This name does not exist: %s",buf);
                                        }
-                                       if (st == SNMP_CMD_GET) {
+
+                                       if (st == SNMP_CMD_GET || st == 
SNMP_CMD_GETOID) {
                                                if ((pdu = 
snmp_fix_pdu(response, SNMP_MSG_GET)) != NULL) {
                                                        snmp_free_pdu(response);
                                                        goto retry;
@@ -713,7 +849,7 @@
                                                        snmp_free_pdu(response);
                                                        goto retry;
                                                }
-                                       } else if (st == SNMP_CMD_GETNEXT) {
+                                       } else if (st == SNMP_CMD_GETNEXT || st 
== SNMP_CMD_GETNEXTOID) {
                                                if ((pdu = 
snmp_fix_pdu(response, SNMP_MSG_GETNEXT)) != NULL) {
                                                        snmp_free_pdu(response);
                                                        goto retry;
@@ -728,7 +864,7 @@
                                        }
                                        snmp_free_pdu(response);
                                        snmp_close(ss);
-                                       if (st == SNMP_CMD_WALK || st == 
SNMP_CMD_REALWALK) {
+                                       if (st >= SNMP_CMD_GET && st != 
SNMP_CMD_SET) {
                                                zval_dtor(return_value);
                                        }
                                        RETURN_FALSE;
@@ -736,14 +872,14 @@
                        }
                } else if (status == STAT_TIMEOUT) {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "No 
response from %s", session->peername);
-                       if (st == SNMP_CMD_WALK || st == SNMP_CMD_REALWALK) {
+                       if (st >= SNMP_CMD_GET && st != SNMP_CMD_SET) {
                                zval_dtor(return_value);
                        }
                        snmp_close(ss);
                        RETURN_FALSE;
                } else {    /* status == STAT_ERROR */
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "An error 
occurred, quitting");
-                       if (st == SNMP_CMD_WALK || st == SNMP_CMD_REALWALK) {
+                       if (st >= SNMP_CMD_GET && st != SNMP_CMD_SET) {
                                zval_dtor(return_value);
                        }
                        snmp_close(ss);
@@ -764,7 +900,11 @@
 * The object fetcher is shared with SNMPv3.
 *
 * st=SNMP_CMD_GET   get - query an agent with SNMP-GET.
+* st=SNMP_CMD_GETOID   get - query an agent with SNMP-GET and return an array
+*                                      of the oid and the corresponding value.
 * st=SNMP_CMD_GETNEXT   getnext - query an agent with SNMP-GETNEXT.
+* st=SNMP_CMD_GETNEXTOID   getnext - query an agent with SNMP-GETNEXT and 
+*                                      return an array of the oid and the 
corresponding value.
 * st=SNMP_CMD_WALK   walk - walk the mib and return a single dimensional array 
 *          containing the values.
 * st=SNMP_CMD_REALWALK   realwalk() and walkoid() - walk the mib and return an 
@@ -777,6 +917,7 @@
 {
        char *a1, *a2, *a3;
        int a1_len, a2_len, a3_len;
+       zval *zval_oids = NULL;
        struct snmp_session session;
        long timeout = SNMP_DEFAULT_TIMEOUT;
        long retries = SNMP_DEFAULT_RETRIES;
@@ -792,10 +933,12 @@
                if (zend_parse_parameters(argc TSRMLS_CC, "sssss|ll", &a1, 
&a1_len, &a2, &a2_len, &a3, &a3_len, &stype, &stype_len, &value, &value_len, 
&timeout, &retries) == FAILURE) {
                        return;
                }
+       } else if (st == SNMP_CMD_GET || st == SNMP_CMD_GETOID || st == 
SNMP_CMD_GETNEXT || st == SNMP_CMD_GETNEXTOID) {
+               if (zend_parse_parameters(argc TSRMLS_CC, "ssz|ll", &a1, 
&a1_len, &a2, &a2_len, &zval_oids, &timeout, &retries) == FAILURE) {
+                       return;
+               }
        } else {
-               /* SNMP_CMD_GET
-                * SNMP_CMD_GETNEXT
-                * SNMP_CMD_WALK
+               /* SNMP_CMD_WALK
                 * SNMP_CMD_REALWALK
                 */
                if (zend_parse_parameters(argc TSRMLS_CC, "sss|ll", &a1, 
&a1_len, &a2, &a2_len, &a3, &a3_len, &timeout, &retries) == FAILURE) {
@@ -833,7 +976,7 @@
        
        session.authenticator = NULL;
 
-       php_snmp_internal(INTERNAL_FUNCTION_PARAM_PASSTHRU, st, &session, a3, 
type, value);
+       php_snmp_internal(INTERNAL_FUNCTION_PARAM_PASSTHRU, st, &session, a3, 
type, value, zval_oids);
 }
 /* }}} */
 
@@ -845,6 +988,14 @@
 }
 /* }}} */
 
+/* {{{ proto string snmpgetoid(string host, string community, string object_id 
[, int timeout [, int retries]]) 
+   Fetch a SNMP object */
+PHP_FUNCTION(snmpgetoid)
+{
+       php_snmp(INTERNAL_FUNCTION_PARAM_PASSTHRU,SNMP_CMD_GETOID, 
SNMP_VERSION_1);
+}
+/* }}} */
+
 /* {{{ proto string snmpgetnext(string host, string community, string 
object_id [, int timeout [, int retries]]) 
    Fetch a SNMP object */
 PHP_FUNCTION(snmpgetnext)
@@ -853,6 +1004,14 @@
 }
 /* }}} */
 
+/* {{{ proto string snmpgetnextoid(string host, string community, string 
object_id [, int timeout [, int retries]]) 
+   Fetch a SNMP object */
+PHP_FUNCTION(snmpgetnextoid)
+{
+       php_snmp(INTERNAL_FUNCTION_PARAM_PASSTHRU,SNMP_CMD_GETNEXTOID, 
SNMP_VERSION_1);
+}
+/* }}} */
+
 /* {{{ proto array snmpwalk(string host, string community, string object_id [, 
int timeout [, int retries]]) 
    Return all objects under the specified object id */
 PHP_FUNCTION(snmpwalk)
@@ -1125,6 +1284,14 @@
 }
 /* }}} */
 
+/* {{{ proto string snmp2_getoid(string host, string community, string 
object_id [, int timeout [, int retries]]) 
+   Fetch a SNMP object */
+PHP_FUNCTION(snmp2_getoid)
+{
+       php_snmp(INTERNAL_FUNCTION_PARAM_PASSTHRU,SNMP_CMD_GETOID, 
SNMP_VERSION_2c);
+}
+/* }}} */
+
 /* {{{ proto string snmp2_getnext(string host, string community, string 
object_id [, int timeout [, int retries]]) 
    Fetch a SNMP object */
 PHP_FUNCTION(snmp2_getnext)
@@ -1133,6 +1300,14 @@
 }
 /* }}} */
 
+/* {{{ proto string snmp2_getnextoid(string host, string community, string 
object_id [, int timeout [, int retries]]) 
+   Fetch a SNMP object */
+PHP_FUNCTION(snmp2_getnextoid)
+{
+       php_snmp(INTERNAL_FUNCTION_PARAM_PASSTHRU,SNMP_CMD_GETNEXTOID, 
SNMP_VERSION_2c);
+}
+/* }}} */
+
 /* {{{ proto array snmp2_walk(string host, string community, string object_id 
[, int timeout [, int retries]]) 
    Return all objects under the specified object id */
 PHP_FUNCTION(snmp2_walk)
@@ -1163,7 +1338,10 @@
 * From here is passed on the the common internal object fetcher.
 *
 * st=SNMP_CMD_GET   snmp3_get() - query an agent and return a single value.
+* st=SNMP_CMD_GETOID   snmp3_getoid() - query an agent and return an array of 
oid and value.
 * st=SNMP_CMD_GETNEXT   snmp3_getnext() - query an agent and return the next 
single value.
+* st=SNMP_CMD_GETNEXTOID   snmp3_getnextoid() - query an agent and return an 
array of the 
+*                                              next oid and value.
 * st=SNMP_CMD_WALK   snmp3_walk() - walk the mib and return a single 
dimensional array 
 *                       containing the values.
 * st=SNMP_CMD_REALWALK   snmp3_real_walk() - walk the mib and return an 
@@ -1175,6 +1353,7 @@
 {
        char *a1, *a2, *a3, *a4, *a5, *a6, *a7, *a8;
        int a1_len, a2_len, a3_len, a4_len, a5_len, a6_len, a7_len, a8_len;
+       zval *zval_oids = NULL;
        struct snmp_session session;
        long timeout = SNMP_DEFAULT_TIMEOUT;
        long retries = SNMP_DEFAULT_RETRIES;
@@ -1191,10 +1370,13 @@
                        &a4, &a4_len, &a5, &a5_len, &a6, &a6_len, &a7, &a7_len, 
&a8, &a8_len, &stype, &stype_len, &value, &value_len, &timeout, &retries) == 
FAILURE) {
                        return;
                }
+       } else if (st == SNMP_CMD_GET || st == SNMP_CMD_GETOID || st == 
SNMP_CMD_GETNEXT || st == SNMP_CMD_GETNEXTOID) {
+               if (zend_parse_parameters(argc TSRMLS_CC, "sssssssz|ll", &a1, 
&a1_len, &a2, &a2_len, &a3, &a3_len,
+                       &a4, &a4_len, &a5, &a5_len, &a6, &a6_len, &a7, &a7_len, 
&zval_oids, &timeout, &retries) == FAILURE) {
+                       return;
+               }
        } else {
-               /* SNMP_CMD_GET
-                * SNMP_CMD_GETNEXT
-                * SNMP_CMD_WALK
+               /* SNMP_CMD_WALK
                 * SNMP_CMD_REALWALK
                 */
                if (zend_parse_parameters(argc TSRMLS_CC, "ssssssss|ll", &a1, 
&a1_len, &a2, &a2_len, &a3, &a3_len,
@@ -1258,7 +1440,7 @@
        session.retries = retries;
        session.timeout = timeout;
 
-       php_snmp_internal(INTERNAL_FUNCTION_PARAM_PASSTHRU, st, &session, a8, 
type, value);
+       php_snmp_internal(INTERNAL_FUNCTION_PARAM_PASSTHRU, st, &session, a3, 
type, value, zval_oids);
 }
 /* }}} */
 
@@ -1270,6 +1452,14 @@
 }
 /* }}} */
 
+/* {{{ proto int snmp3_getoid(string host, string sec_name, string sec_level, 
string auth_protocol, string auth_passphrase, string priv_protocol, string 
priv_passphrase, string object_id [, int timeout [, int retries]])
+   Fetch the value of a SNMP object */
+PHP_FUNCTION(snmp3_getoid)
+{
+       php_snmpv3(INTERNAL_FUNCTION_PARAM_PASSTHRU, SNMP_CMD_GETOID);
+}
+/* }}} */
+
 /* {{{ proto int snmp3_getnext(string host, string sec_name, string sec_level, 
string auth_protocol, string auth_passphrase, string priv_protocol, string 
priv_passphrase, string object_id [, int timeout [, int retries]])
    Fetch the value of a SNMP object */
 PHP_FUNCTION(snmp3_getnext)
@@ -1278,6 +1468,14 @@
 }
 /* }}} */
 
+/* {{{ proto int snmp3_getnextoid(string host, string sec_name, string 
sec_level, string auth_protocol, string auth_passphrase, string priv_protocol, 
string priv_passphrase, string object_id [, int timeout [, int retries]])
+   Fetch the value of a SNMP object */
+PHP_FUNCTION(snmp3_getnextoid)
+{
+       php_snmpv3(INTERNAL_FUNCTION_PARAM_PASSTHRU, SNMP_CMD_GETNEXTOID);
+}
+/* }}} */
+
 /* {{{ proto int snmp3_walk(string host, string sec_name, string sec_level, 
string auth_protocol, string auth_passphrase, string priv_protocol, string 
priv_passphrase, string object_id [, int timeout [, int retries]])
    Fetch the value of a SNMP object */
 PHP_FUNCTION(snmp3_walk)

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to