lytboris                                 Sat, 19 Feb 2011 11:13:10 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=308479

Log:
push most of SNMP query options into objid_query structure

Changed paths:
    U   php/php-src/trunk/ext/snmp/snmp.c

Modified: php/php-src/trunk/ext/snmp/snmp.c
===================================================================
--- php/php-src/trunk/ext/snmp/snmp.c	2011-02-19 09:30:41 UTC (rev 308478)
+++ php/php-src/trunk/ext/snmp/snmp.c	2011-02-19 11:13:10 UTC (rev 308479)
@@ -416,10 +416,13 @@

 } snmpobjarg;

-struct objid_set {
+struct objid_query {
 	int count;
 	int offset;
 	int step;
+	int non_repeaters;
+	int max_repetitions;
+	int valueretrieval;
 	int array_output;
 	snmpobjarg *vars;
 };
@@ -674,9 +677,7 @@
 */
 static void php_snmp_internal(INTERNAL_FUNCTION_PARAMETERS, int st,
 							struct snmp_session *session,
-							struct objid_set *objid_set,
-							int non_repeaters, int max_repetitions,
-							int valueretrieval)
+							struct objid_query *objid_query)
 {
 	struct snmp_session *ss;
 	struct snmp_pdu *pdu=NULL, *response;
@@ -698,16 +699,16 @@
 	RETVAL_FALSE;

 	if (st & SNMP_CMD_WALK) {
-		if (objid_set->count > 1) {
+		if (objid_query->count > 1) {
 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Multi OID walks are not supported!");
 			RETURN_FALSE;
 		}
 		rootlen = MAX_NAME_LEN;
-		if (strlen(objid_set->vars[0].oid)) { /* on a walk, an empty string means top of tree - no error */
-			if (snmp_parse_oid(objid_set->vars[0].oid, root, &rootlen)) {
+		if (strlen(objid_query->vars[0].oid)) { /* on a walk, an empty string means top of tree - no error */
+			if (snmp_parse_oid(objid_query->vars[0].oid, root, &rootlen)) {
 				gotroot = 1;
 			} else {
-				php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid object identifier: %s", objid_set->vars[0].oid);
+				php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid object identifier: %s", objid_query->vars[0].oid);
 				RETURN_FALSE;
 			}
 		}
@@ -720,7 +721,7 @@

 		memmove((char *)name, (char *)root, rootlen * sizeof(oid));
 		name_length = rootlen;
-		objid_set->offset = objid_set->count;
+		objid_query->offset = objid_query->count;
 	}

 	if ((ss = snmp_open(session)) == NULL) {
@@ -734,10 +735,10 @@
 		keepwalking = 0;
 		if (st & (SNMP_CMD_GET | SNMP_CMD_GETNEXT)) {
 			pdu = snmp_pdu_create((st & SNMP_CMD_GET) ? SNMP_MSG_GET : SNMP_MSG_GETNEXT);
-			for (count = 0; objid_set->offset < objid_set->count && count < objid_set->step; objid_set->offset++, count++){
+			for (count = 0; objid_query->offset < objid_query->count && count < objid_query->step; objid_query->offset++, count++){
 				name_length = MAX_OID_LEN;
-				if (!snmp_parse_oid(objid_set->vars[objid_set->offset].oid, name, &name_length)) {
-					php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid object identifier: %s", objid_set->vars[objid_set->offset].oid);
+				if (!snmp_parse_oid(objid_query->vars[objid_query->offset].oid, name, &name_length)) {
+					php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid object identifier: %s", objid_query->vars[objid_query->offset].oid);
 				} else {
 					snmp_add_null_var(pdu, name, name_length);
 				}
@@ -749,17 +750,17 @@
 			}
 		} else if (st & SNMP_CMD_SET) {
 			pdu = snmp_pdu_create(SNMP_MSG_SET);
-			for (count = 0; objid_set->offset < objid_set->count && count < objid_set->step; objid_set->offset++, count++){
+			for (count = 0; objid_query->offset < objid_query->count && count < objid_query->step; objid_query->offset++, count++){
 				name_length = MAX_OID_LEN;
-				if (!snmp_parse_oid(objid_set->vars[objid_set->offset].oid, name, &name_length)) {
-					php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid object identifier: %s", objid_set->vars[objid_set->offset].oid);
+				if (!snmp_parse_oid(objid_query->vars[objid_query->offset].oid, name, &name_length)) {
+					php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid object identifier: %s", objid_query->vars[objid_query->offset].oid);
 					snmp_free_pdu(pdu);
 					snmp_close(ss);
 					RETURN_FALSE;
 				} else {
-					if ((snmp_errno = snmp_add_var(pdu, name, name_length, objid_set->vars[objid_set->offset].type, objid_set->vars[objid_set->offset].value))) {
+					if ((snmp_errno = snmp_add_var(pdu, name, name_length, objid_query->vars[objid_query->offset].type, objid_query->vars[objid_query->offset].value))) {
 						SNMP_SNPRINT_OBJID(buf, sizeof(buf), name, name_length);
-						php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not add variable: OID='%s' type='%c' value='%s': %s", buf, objid_set->vars[objid_set->offset].type, objid_set->vars[objid_set->offset].value, snmp_api_errstring(snmp_errno));
+						php_error_docref(NULL TSRMLS_CC, E_WARNING, "Could not add variable: OID='%s' type='%c' value='%s': %s", buf, objid_query->vars[objid_query->offset].type, objid_query->vars[objid_query->offset].value, snmp_api_errstring(snmp_errno));
 						snmp_free_pdu(pdu);
 						snmp_close(ss);
 						RETURN_FALSE;
@@ -771,8 +772,8 @@
 				pdu = snmp_pdu_create(SNMP_MSG_GETNEXT);
 			} else {
 				pdu = snmp_pdu_create(SNMP_MSG_GETBULK);
-				pdu->non_repeaters = non_repeaters;
-				pdu->max_repetitions = max_repetitions;
+				pdu->non_repeaters = objid_query->non_repeaters;
+				pdu->max_repetitions = objid_query->max_repetitions;
 			}
 			snmp_add_null_var(pdu, name, name_length);
 		}
@@ -808,16 +809,16 @@
 							/* first fetched OID is out of subtree, fallback to GET query */
 							st |= SNMP_CMD_GET;
 							st ^= SNMP_CMD_WALK;
-							objid_set->offset = 0;
+							objid_query->offset = 0;
 							keepwalking = 1;
 						}
 						break;
 					}

 					MAKE_STD_ZVAL(snmpval);
-					php_snmp_getvalue(vars, snmpval TSRMLS_CC, valueretrieval);
+					php_snmp_getvalue(vars, snmpval TSRMLS_CC, objid_query->valueretrieval);

-					if (objid_set->array_output) {
+					if (objid_query->array_output) {
 						if (Z_TYPE_P(return_value) == IS_BOOL) {
 							array_init(return_value);
 						}
@@ -846,7 +847,7 @@
 						}
 					}
 				}
-				if (objid_set->offset < objid_set->count) { /* we have unprocessed OIDs */
+				if (objid_query->offset < objid_query->count) { /* we have unprocessed OIDs */
 					keepwalking = 1;
 				}
 			} else {
@@ -855,9 +856,9 @@
 						vars && count != response->errindex;
 						vars = vars->next_variable, count++);

-					if (st & (SNMP_CMD_GET | SNMP_CMD_GETNEXT) && response->errstat == SNMP_ERR_TOOBIG && objid_set->step > 1) { /* Answer will not fit into single packet */
-						objid_set->offset = ((objid_set->offset > objid_set->step) ? (objid_set->offset - objid_set->step) : 0 );
-						objid_set->step /= 2;
+					if (st & (SNMP_CMD_GET | SNMP_CMD_GETNEXT) && response->errstat == SNMP_ERR_TOOBIG && objid_query->step > 1) { /* Answer will not fit into single packet */
+						objid_query->offset = ((objid_query->offset > objid_query->step) ? (objid_query->offset - objid_query->step) : 0 );
+						objid_query->step /= 2;
 						snmp_free_pdu(response);
 						keepwalking = 1;
 						continue;
@@ -876,7 +877,7 @@
 					}
 					snmp_free_pdu(response);
 					snmp_close(ss);
-					if (objid_set->array_output) {
+					if (objid_query->array_output) {
 						zval_dtor(return_value);
 					}
 					RETURN_FALSE;
@@ -884,7 +885,7 @@
 			}
 		} else if (status == STAT_TIMEOUT) {
 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "No response from %s", session->peername);
-			if (objid_set->array_output) {
+			if (objid_query->array_output) {
 				zval_dtor(return_value);
 			}
 			snmp_close(ss);
@@ -893,7 +894,7 @@
 			snmp_error(ss, NULL, NULL, &err);
 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Fatal error: %s", err);
 			free(err);
-			if (objid_set->array_output) {
+			if (objid_query->array_output) {
 				zval_dtor(return_value);
 			}
 			snmp_close(ss);
@@ -912,7 +913,7 @@
 * OID parser (and type, value for SNMP_SET command)
 */

-static int php_snmp_parse_oid(int st, struct objid_set *objid_set, zval **oid, zval **type, zval **value TSRMLS_DC)
+static int php_snmp_parse_oid(int st, struct objid_query *objid_query, zval **oid, zval **type, zval **value TSRMLS_DC)
 {
 	char *pptr;
 	HashPosition pos_oid, pos_type, pos_value;
@@ -947,15 +948,15 @@
 		}
 	}

-	objid_set->count = 0;
-	objid_set->array_output = ((st & SNMP_CMD_WALK) ? TRUE : FALSE);
+	objid_query->count = 0;
+	objid_query->array_output = ((st & SNMP_CMD_WALK) ? TRUE : FALSE);
 	if (Z_TYPE_PP(oid) == IS_STRING) {
-		objid_set->vars = (snmpobjarg *)emalloc(sizeof(snmpobjarg));
-		if (objid_set->vars == NULL) {
+		objid_query->vars = (snmpobjarg *)emalloc(sizeof(snmpobjarg));
+		if (objid_query->vars == NULL) {
 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "emalloc() failed while parsing oid: %s", strerror(errno));
 			return FALSE;
 		}
-		objid_set->vars[objid_set->count].oid = Z_STRVAL_PP(oid);
+		objid_query->vars[objid_query->count].oid = Z_STRVAL_PP(oid);
 		if (st & SNMP_CMD_SET) {
 			if (Z_TYPE_PP(type) == IS_STRING && Z_TYPE_PP(value) == IS_STRING) {
 				if (Z_STRLEN_PP(type) != 1) {
@@ -963,35 +964,35 @@
 					return FALSE;
 				}
 				pptr = Z_STRVAL_PP(type);
-				objid_set->vars[objid_set->count].type = *pptr;
-				objid_set->vars[objid_set->count].value = Z_STRVAL_PP(value);
+				objid_query->vars[objid_query->count].type = *pptr;
+				objid_query->vars[objid_query->count].value = Z_STRVAL_PP(value);
 			} else {
 				php_error_docref(NULL TSRMLS_CC, E_WARNING, "Single objid and multiple type or values are not supported");
 				return FALSE;
 			}
 		}
-		objid_set->count++;
+		objid_query->count++;
 	} else if (Z_TYPE_PP(oid) == IS_ARRAY) { /* we got objid array */
 		if (zend_hash_num_elements(Z_ARRVAL_PP(oid)) == 0) {
 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "Got empty OID array");
 			return FALSE;
 		}
-		objid_set->vars = (snmpobjarg *)emalloc(sizeof(snmpobjarg) * zend_hash_num_elements(Z_ARRVAL_PP(oid)));
-		if (objid_set->vars == NULL) {
+		objid_query->vars = (snmpobjarg *)emalloc(sizeof(snmpobjarg) * zend_hash_num_elements(Z_ARRVAL_PP(oid)));
+		if (objid_query->vars == NULL) {
 			php_error_docref(NULL TSRMLS_CC, E_WARNING, "emalloc() failed while parsing oid array: %s", strerror(errno));
 			return FALSE;
 		}
-		objid_set->array_output = ( (st & SNMP_CMD_SET) ? FALSE : TRUE );
+		objid_query->array_output = ( (st & SNMP_CMD_SET) ? FALSE : TRUE );
 		for (	zend_hash_internal_pointer_reset_ex(Z_ARRVAL_PP(oid), &pos_oid);
 			zend_hash_get_current_data_ex(Z_ARRVAL_PP(oid), (void **) &tmp_oid, &pos_oid) == SUCCESS;
 			zend_hash_move_forward_ex(Z_ARRVAL_PP(oid), &pos_oid) ) {

 			convert_to_string_ex(tmp_oid);
-			objid_set->vars[objid_set->count].oid = Z_STRVAL_PP(tmp_oid);
+			objid_query->vars[objid_query->count].oid = Z_STRVAL_PP(tmp_oid);
 			if (st & SNMP_CMD_SET) {
 				if (Z_TYPE_PP(type) == IS_STRING) {
 					pptr = Z_STRVAL_PP(type);
-					objid_set->vars[objid_set->count].type = *pptr;
+					objid_query->vars[objid_query->count].type = *pptr;
 				} else if (Z_TYPE_PP(type) == IS_ARRAY) {
 					if (SUCCESS == zend_hash_get_current_data_ex(Z_ARRVAL_PP(type), (void **) &tmp_type, &pos_type)) {
 						convert_to_string_ex(tmp_type);
@@ -1000,7 +1001,7 @@
 							return FALSE;
 						}
 						pptr = Z_STRVAL_PP(tmp_type);
-						objid_set->vars[objid_set->count].type = *pptr;
+						objid_query->vars[objid_query->count].type = *pptr;
 						zend_hash_move_forward_ex(Z_ARRVAL_PP(type), &pos_type);
 					} else {
 						php_error_docref(NULL TSRMLS_CC, E_WARNING, "'%s': no type set", Z_STRVAL_PP(tmp_oid));
@@ -1009,11 +1010,11 @@
 				}

 				if (Z_TYPE_PP(value) == IS_STRING) {
-					objid_set->vars[objid_set->count].value = Z_STRVAL_PP(value);
+					objid_query->vars[objid_query->count].value = Z_STRVAL_PP(value);
 				} else if (Z_TYPE_PP(value) == IS_ARRAY) {
 					if (SUCCESS == zend_hash_get_current_data_ex(Z_ARRVAL_PP(value), (void **) &tmp_value, &pos_value)) {
 						convert_to_string_ex(tmp_value);
-						objid_set->vars[objid_set->count].value = Z_STRVAL_PP(tmp_value);
+						objid_query->vars[objid_query->count].value = Z_STRVAL_PP(tmp_value);
 						zend_hash_move_forward_ex(Z_ARRVAL_PP(value), &pos_value);
 					} else {
 						php_error_docref(NULL TSRMLS_CC, E_WARNING, "'%s': no value set", Z_STRVAL_PP(tmp_oid));
@@ -1021,13 +1022,13 @@
 					}
 				}
 			}
-			objid_set->count++;
+			objid_query->count++;
 		}
 	}

-	objid_set->offset = 0;
-	objid_set->step = objid_set->count;
-	return (objid_set->count > 0);
+	objid_query->offset = 0;
+	objid_query->step = objid_query->count;
+	return (objid_query->count > 0);
 }
 /* }}} */

@@ -1298,15 +1299,16 @@
 	int a1_len, a2_len, a3_len, a4_len, a5_len, a6_len, a7_len;
 	long timeout = SNMP_DEFAULT_TIMEOUT;
 	long retries = SNMP_DEFAULT_RETRIES;
-	int non_repeaters = 0;
-	int max_repetitions = -1;
 	int argc = ZEND_NUM_ARGS();
-	struct objid_set objid_set;
+	struct objid_query objid_query;
 	php_snmp_session *session;
 	int session_less_mode = (getThis() == NULL);
-	int valueretrieval = SNMP_G(valueretrieval);
 	php_snmp_object *snmp_object;
 	php_snmp_object glob_snmp_object;
+
+	objid_query.max_repetitions = -1;
+	objid_query.non_repeaters = 0;
+	objid_query.valueretrieval = SNMP_G(valueretrieval);

 	if (session_less_mode) {
 		if (version == SNMP_VERSION_3) {
@@ -1346,7 +1348,7 @@
 				RETURN_FALSE;
 			}
 		} else if (st & SNMP_CMD_WALK) {
-			if (zend_parse_parameters(argc TSRMLS_CC, "Z|ll", &oid, &non_repeaters, &max_repetitions) == FAILURE) {
+			if (zend_parse_parameters(argc TSRMLS_CC, "Z|ll", &oid, &(objid_query.non_repeaters), &(objid_query.max_repetitions)) == FAILURE) {
 				RETURN_FALSE;
 			}
 		} else {
@@ -1359,7 +1361,7 @@
 		}
 	}

-	if (!php_snmp_parse_oid(st, &objid_set, oid, type, value TSRMLS_CC)) {
+	if (!php_snmp_parse_oid(st, &objid_query, oid, type, value TSRMLS_CC)) {
 		RETURN_FALSE;
 	}

@@ -1376,12 +1378,12 @@
 		PHP_SNMP_SESSION_FROM_OBJECT(session, object);
 		snmp_object = (php_snmp_object *)zend_object_store_get_object(object TSRMLS_CC);
 		if (snmp_object->max_oids > 0) {
-			objid_set.step = snmp_object->max_oids;
-			if (max_repetitions < 0) { /* unspecified in function call, use session-wise */
-				max_repetitions = snmp_object->max_oids;
+			objid_query.step = snmp_object->max_oids;
+			if (objid_query.max_repetitions < 0) { /* unspecified in function call, use session-wise */
+				objid_query.max_repetitions = snmp_object->max_oids;
 			}
 		}
-		valueretrieval = snmp_object->valueretrieval;
+		objid_query.valueretrieval = snmp_object->valueretrieval;
 #ifdef HAVE_NET_SNMP
 		glob_snmp_object.enum_print = netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM);
 		netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_PRINT_NUMERIC_ENUM, snmp_object->enum_print);
@@ -1395,13 +1397,13 @@
 #endif
 	}

-	if (max_repetitions < 0) {
-		max_repetitions = 20; /* provide correct default value */
+	if (objid_query.max_repetitions < 0) {
+		objid_query.max_repetitions = 20; /* provide correct default value */
 	}

-	php_snmp_internal(INTERNAL_FUNCTION_PARAM_PASSTHRU, st, session, &objid_set, non_repeaters, max_repetitions, valueretrieval);
+	php_snmp_internal(INTERNAL_FUNCTION_PARAM_PASSTHRU, st, session, &objid_query);

-	efree(objid_set.vars);
+	efree(objid_query.vars);

 	if (session_less_mode) {
 		netsnmp_session_free(&session);
-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to