[prev in list] [next in list] [prev in thread] [next in thread] 

List:       php-internals
Subject:    Re: [PHP-DEV] [PATCH] Allowing an array as a parameter for snmpget()/snmpgetnext()
From:       Jorrit Kronjee <jorrit () wafel ! org>
Date:       2010-09-21 21:20:24
Message-ID: 4C992198.3080007 () wafel ! org
[Download RAW message or body]

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


["snmpget-array-oids-v2.txt" (text/plain)]

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

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic