[libvirt] [PATCH v1] [libvirt-php] add stream support and upload/resize/download for volume

Vasiliy Tolstov v.tolstov at selfip.ru
Tue Apr 28 16:25:15 UTC 2015


This patch add to libvirt php binding libvirt stream support
Also provide resize/upload/download for libvirt volume

Signed-off-by: Vasiliy Tolstov <v.tolstov at selfip.ru>
---
 configure.ac      |   3 +-
 src/libvirt-php.c | 382 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
 src/libvirt-php.h |  17 +++
 3 files changed, 395 insertions(+), 7 deletions(-)

diff --git a/configure.ac b/configure.ac
index b854153..7099f9d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,7 +1,6 @@
 AC_INIT([libvirt-php], [0.5.0], [http://libvirt.org])
-AM_INIT_AUTOMAKE([-Wall -Werror])
+AM_INIT_AUTOMAKE([-Wall -Werror -Wno-portability])
 AC_CONFIG_FILES([Makefile tools/Makefile src/Makefile tests/Makefile docs/Makefile])
-AM_INIT_AUTOMAKE([-Wno-portability])
 AM_MAINTAINER_MODE([enable])
 
 dnl Checks for programs.
diff --git a/src/libvirt-php.c b/src/libvirt-php.c
index 6d6fa81..0adc4be 100644
--- a/src/libvirt-php.c
+++ b/src/libvirt-php.c
@@ -61,6 +61,7 @@ int le_libvirt_storagepool;
 int le_libvirt_volume;
 int le_libvirt_network;
 int le_libvirt_nodedev;
+int le_libvirt_stream;
 #if LIBVIR_VERSION_NUMBER>=8000
 int le_libvirt_snapshot;
 #endif
@@ -90,6 +91,13 @@ static zend_function_entry libvirt_functions[] = {
 	PHP_FE(libvirt_connect_get_maxvcpus, NULL)
 	PHP_FE(libvirt_connect_get_encrypted, NULL)
 	PHP_FE(libvirt_connect_get_secure, NULL)
+	/* Stream functions */
+	PHP_FE(libvirt_stream_create, NULL)
+	PHP_FE(libvirt_stream_close, NULL)
+	PHP_FE(libvirt_stream_abort, NULL)
+	PHP_FE(libvirt_stream_finish, NULL)
+	PHP_FE(libvirt_stream_send, NULL)
+	PHP_FE(libvirt_stream_recv, NULL)
 	/* Domain functions */
 	PHP_FE(libvirt_domain_new, NULL)
 	PHP_FE(libvirt_domain_new_get_vnc, NULL)
@@ -148,7 +156,7 @@ static zend_function_entry libvirt_functions[] = {
 	PHP_FE(libvirt_domain_get_screen_dimensions, NULL)
 	PHP_FE(libvirt_domain_send_keys, NULL)
 	PHP_FE(libvirt_domain_send_pointer_event, NULL)
-        PHP_FE(libvirt_domain_update_device, NULL)
+	PHP_FE(libvirt_domain_update_device, NULL)
 	/* Domain snapshot functions */
 	PHP_FE(libvirt_domain_has_current_snapshot, NULL)
 	PHP_FE(libvirt_domain_snapshot_create, NULL)
@@ -169,6 +177,9 @@ static zend_function_entry libvirt_functions[] = {
 	PHP_FE(libvirt_storagevolume_create_xml,NULL)
 	PHP_FE(libvirt_storagevolume_create_xml_from,NULL)
 	PHP_FE(libvirt_storagevolume_delete,NULL)
+	PHP_FE(libvirt_storagevolume_download,NULL)
+	PHP_FE(libvirt_storagevolume_upload,NULL)
+	PHP_FE(libvirt_storagevolume_resize,NULL)
 	PHP_FE(libvirt_storagepool_get_uuid_string, NULL)
 	PHP_FE(libvirt_storagepool_get_name, NULL)
 	PHP_FE(libvirt_storagepool_lookup_by_uuid_string, NULL)
@@ -370,6 +381,8 @@ char *translate_counter_type(int type)
 						break;
 		case INT_RESOURCE_DOMAIN:	return "domain";
 						break;
+		case INT_RESOURCE_STREAM:	return "stream";
+						break;
 		case INT_RESOURCE_NETWORK:	return "network";
 						break;
 		case INT_RESOURCE_NODEDEV:	return "node device";
@@ -444,7 +457,7 @@ void free_tokens(tTokenizer t)
 	Private function name:	resource_change_counter
 	Since version:		0.4.2
 	Description:		Function to increment (inc = 1) / decrement (inc = 0) the resource pointers count including the memory location
-	Arguments:		@type [int]: type of resource (INT_RESOURCE_x defines where x can be { CONNECTION | DOMAIN | NETWORK | NODEDEV | STORAGEPOOL | VOLUME | SNAPSHOT })
+	Arguments:		@type [int]: type of resource (INT_RESOURCE_x defines where x can be { CONNECTION | DOMAIN | NETWORK | NODEDEV | STORAGEPOOL | VOLUME | SNAPSHOT | STREAM })
 				@conn [virConnectPtr]: libvirt connection pointer associated with the resource, NULL for libvirt connection objects
 				@mem [pointer]: Pointer to memory location for the resource. Will be converted to appropriate uint for the arch.
 				@inc [int/bool]: Increment the counter (1 = add memory location) or decrement the counter (0 = remove memory location) from entries.
@@ -724,6 +737,18 @@ void free_resource(int type, arch_uint mem TSRMLS_DC)
 		}
 	}
 
+	if (type == INT_RESOURCE_STREAM) {
+		rv = virStreamFree( (virStreamPtr)mem );
+		if (rv != 0) {
+			DPRINTF("%s: virStreamFree(%p) returned %d (%s)\n", __FUNCTION__, (virStreamPtr)mem, rv, LIBVIRT_G (last_error));
+			php_error_docref(NULL TSRMLS_CC, E_WARNING,"virStreamFree failed with %i on destructor: %s", rv, LIBVIRT_G (last_error));
+		}
+		else {
+			DPRINTF("%s: virStreamFree(%p) completed successfully\n", __FUNCTION__, (virStreamPtr)mem);
+			resource_change_counter(INT_RESOURCE_STREAM, NULL, (virStreamPtr)mem, 0 TSRMLS_CC);
+		}
+	}
+
 	if (type == INT_RESOURCE_NETWORK) {
 		rv = virNetworkFree( (virNetworkPtr)mem );
 		if (rv != 0) {
@@ -986,6 +1011,36 @@ static void php_libvirt_domain_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
 	}
 }
 
+/* Destructor for stream resource */
+static void php_libvirt_stream_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
+{
+	php_libvirt_stream *stream = (php_libvirt_stream*)rsrc->ptr;
+	int rv = 0;
+
+	if (stream != NULL)
+		{
+			if (stream->stream != NULL)
+				{
+					if (!check_resource_allocation(NULL, INT_RESOURCE_STREAM, stream->stream TSRMLS_CC)) {
+						stream->stream=NULL;
+						efree (stream);
+                                                return;
+					}
+					rv = virStreamFree(stream->stream);
+					if (rv != 0) {
+						DPRINTF("%s: virStreamFree(%p) returned %d (%s)\n", __FUNCTION__, stream->stream, rv, LIBVIRT_G (last_error));
+						php_error_docref(NULL TSRMLS_CC, E_WARNING,"virStreamFree failed with %i on destructor: %s", rv, LIBVIRT_G (last_error));
+					}
+					else {
+						DPRINTF("%s: virStreamFree(%p) completed successfully\n", __FUNCTION__, stream->stream);
+						resource_change_counter(INT_RESOURCE_STREAM, NULL, stream->stream, 0 TSRMLS_CC);
+					}
+					stream->stream=NULL;
+				}
+			efree (stream);
+		}
+}
+
 /* Destructor for storagepool resource */
 static void php_libvirt_storagepool_dtor(zend_rsrc_list_entry *rsrc TSRMLS_DC)
 {
@@ -1144,6 +1199,7 @@ PHP_MINIT_FUNCTION(libvirt)
 	/* register resource types and their descriptors */
 	le_libvirt_connection = zend_register_list_destructors_ex(php_libvirt_connection_dtor, NULL, PHP_LIBVIRT_CONNECTION_RES_NAME, module_number);
 	le_libvirt_domain = zend_register_list_destructors_ex(php_libvirt_domain_dtor, NULL, PHP_LIBVIRT_DOMAIN_RES_NAME, module_number);
+	le_libvirt_stream = zend_register_list_destructors_ex(php_libvirt_stream_dtor, NULL, PHP_LIBVIRT_STREAM_RES_NAME, module_number);
 	le_libvirt_storagepool = zend_register_list_destructors_ex(php_libvirt_storagepool_dtor, NULL, PHP_LIBVIRT_STORAGEPOOL_RES_NAME, module_number);
 	le_libvirt_volume = zend_register_list_destructors_ex(php_libvirt_volume_dtor, NULL, PHP_LIBVIRT_VOLUME_RES_NAME, module_number);
 	le_libvirt_network = zend_register_list_destructors_ex(php_libvirt_network_dtor, NULL, PHP_LIBVIRT_NETWORK_RES_NAME, module_number);
@@ -1171,6 +1227,11 @@ PHP_MINIT_FUNCTION(libvirt)
 	REGISTER_LONG_CONSTANT("VIR_DOMAIN_SHUTOFF", 		5, CONST_CS | CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("VIR_DOMAIN_CRASHED", 		6, CONST_CS | CONST_PERSISTENT);
 
+        /* Volume constants */
+        REGISTER_LONG_CONSTANT("VIR_STORAGE_VOL_RESIZE_ALLOCATE",        1, CONST_CS | CONST_PERSISTENT);
+        REGISTER_LONG_CONSTANT("VIR_STORAGE_VOL_RESIZE_DELTA",           2, CONST_CS | CONST_PERSISTENT);
+        REGISTER_LONG_CONSTANT("VIR_STORAGE_VOL_RESIZE_SHRINK",          4, CONST_CS | CONST_PERSISTENT);
+
 	/* Domain vCPU flags */
 	REGISTER_LONG_CONSTANT("VIR_DOMAIN_VCPU_CONFIG",	VIR_DOMAIN_VCPU_CONFIG, CONST_CS | CONST_PERSISTENT);
 	REGISTER_LONG_CONSTANT("VIR_DOMAIN_VCPU_CURRENT",	VIR_DOMAIN_VCPU_CURRENT, CONST_CS | CONST_PERSISTENT);
@@ -3456,6 +3517,207 @@ PHP_FUNCTION(libvirt_domain_lookup_by_uuid_string)
 }
 
 /*
+	Function name:	libvirt_stream_create
+	Since version:	0.5.0
+	Description:	Function is used to create new stream from libvirt conn
+	Arguments:	@res [resource]: libvirt connection resource from libvirt_connect()
+	Returns:	resource libvirt stream resource
+*/
+PHP_FUNCTION(libvirt_stream_create)
+{
+	php_libvirt_connection *conn=NULL;
+	zval *zconn;
+	virStreamPtr stream = NULL;
+	php_libvirt_stream *res_stream;
+
+	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zconn) == FAILURE) {
+		RETURN_FALSE;
+	}
+	ZEND_FETCH_RESOURCE (conn, php_libvirt_connection*, &zconn, -1, PHP_LIBVIRT_CONNECTION_RES_NAME, le_libvirt_connection);
+	if ((conn==NULL)||(conn->conn==NULL))RETURN_FALSE;
+
+	stream = virStreamNew(conn->conn, 0);
+	if (stream==NULL) {
+		set_error("Cannot create new stream" TSRMLS_CC);
+		RETURN_FALSE;
+	}
+
+	res_stream = (php_libvirt_stream *)emalloc(sizeof(php_libvirt_stream));
+	res_stream->stream = stream;
+	res_stream->conn = conn;
+
+	resource_change_counter(INT_RESOURCE_STREAM, conn->conn, res_stream->stream, 1 TSRMLS_CC);
+	ZEND_REGISTER_RESOURCE(return_value, res_stream, le_libvirt_stream);
+}
+
+/*
+	Function name:	libvirt_stream_close
+	Since version:	0.5.0
+	Description:	Function is used to close stream
+	Arguments:	@res [resource]: libvirt stream resource from libvirt_stream_create()
+	Returns:	int
+*/
+PHP_FUNCTION(libvirt_stream_close)
+{
+	zval *zstream;
+	php_libvirt_stream *stream=NULL;
+	int retval = -1;
+
+	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zstream) == FAILURE) {
+		RETURN_LONG(retval);
+	}
+	ZEND_FETCH_RESOURCE (stream, php_libvirt_stream*, &zstream, -1, PHP_LIBVIRT_STREAM_RES_NAME, le_libvirt_stream);
+	if ((stream==NULL)||(stream->stream==NULL))RETURN_LONG(retval);
+
+	retval = virStreamFree(stream->stream);
+	if (retval != 0) {
+		set_error("Cannot free stream" TSRMLS_CC);
+		RETURN_LONG(retval);
+	}
+
+	resource_change_counter(INT_RESOURCE_STREAM, stream->conn, stream->stream, 0 TSRMLS_CC);
+	RETURN_LONG(retval);
+}
+
+/*
+	Function name:	libvirt_stream_abort
+	Since version:	0.5.0
+	Description:	Function is used to abort transfer
+	Arguments:	@res [resource]: libvirt stream resource from libvirt_stream_create()
+	Returns:	int
+*/
+PHP_FUNCTION(libvirt_stream_abort)
+{
+	zval *zstream;
+	php_libvirt_stream *stream=NULL;
+	int retval = -1;
+
+	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zstream) == FAILURE) {
+		RETURN_LONG(retval);
+	}
+	ZEND_FETCH_RESOURCE (stream, php_libvirt_stream*, &zstream, -1, PHP_LIBVIRT_STREAM_RES_NAME, le_libvirt_stream);
+	if ((stream==NULL)||(stream->stream==NULL))RETURN_LONG(retval);
+
+	retval = virStreamAbort(stream->stream);
+	if (retval != 0) {
+		set_error("Cannot abort stream" TSRMLS_CC);
+		RETURN_LONG(retval);
+	}
+	RETURN_LONG(retval);
+}
+
+/*
+	Function name:	libvirt_stream_finish
+	Since version:	0.5.0
+	Description:	Function is used to finish transfer
+	Arguments:	@res [resource]: libvirt stream resource from libvirt_stream_create()
+	Returns:	int
+*/
+PHP_FUNCTION(libvirt_stream_finish)
+{
+	zval *zstream;
+	php_libvirt_stream *stream=NULL;
+	int retval = -1;
+
+	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &zstream) == FAILURE) {
+		RETURN_LONG(retval);
+	}
+	ZEND_FETCH_RESOURCE (stream, php_libvirt_stream*, &zstream, -1, PHP_LIBVIRT_STREAM_RES_NAME, le_libvirt_stream);
+	if ((stream==NULL)||(stream->stream==NULL))RETURN_LONG(retval);
+
+	retval = virStreamFinish(stream->stream);
+	if (retval != 0) {
+		set_error("Cannot finish stream" TSRMLS_CC);
+		RETURN_LONG(retval);
+	}
+	RETURN_LONG(retval);
+}
+
+/*
+	Function name:	libvirt_stream_recv
+	Since version:	0.5.0
+	Description:	Function is used to close stream from libvirt conn
+	Arguments:	@res [resource]: libvirt stream resource from libvirt_stream_create()
+			@data [string]: buffer
+			@len [int]: amout of data to recieve
+	Returns:	int
+*/
+PHP_FUNCTION(libvirt_stream_recv)
+{
+	zval *zstream, *zbuf;
+	char *recv_buf;
+	php_libvirt_stream *stream=NULL;
+	int retval = -1;
+	long length = 0;
+
+	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rz|l", &zstream, &zbuf, &length) == FAILURE) {
+		RETURN_LONG(retval);
+	}
+	ZEND_FETCH_RESOURCE (stream, php_libvirt_stream*, &zstream, -1, PHP_LIBVIRT_STREAM_RES_NAME, le_libvirt_stream);
+	if ((stream==NULL)||(stream->stream==NULL))RETURN_LONG(retval);
+
+	recv_buf = emalloc(length + 1);
+	memset(recv_buf, 0, length + 1);
+
+	retval = virStreamRecv(stream->stream, recv_buf, length);
+	if (retval < 0) {
+		efree(recv_buf);
+		zval_dtor(zbuf);
+		Z_TYPE_P(zbuf) = IS_NULL;
+	} else {
+		recv_buf[retval] = '\0';
+		/* Rebuild buffer zval */
+		zval_dtor(zbuf);
+		Z_STRVAL_P(zbuf) = recv_buf;
+		Z_STRLEN_P(zbuf) = retval;
+		Z_TYPE_P(zbuf) = IS_STRING;
+	}
+
+        if (retval == -1) {
+		set_error("Cannot recv from stream" TSRMLS_CC);
+		RETURN_LONG(retval);
+	}
+
+	RETURN_LONG(retval);
+}
+
+/*
+	Function name:	libvirt_stream_send
+	Since version:	0.5.0
+	Description:	Function is used to close stream from libvirt conn
+	Arguments:	@res [resource]: libvirt stream resource from libvirt_stream_create()
+			@data [string]: buffer
+			@length [int]: amout of data to send
+	Returns:	int
+*/
+PHP_FUNCTION(libvirt_stream_send)
+{
+	zval *zstream, *zbuf;
+	php_libvirt_stream *stream=NULL;
+	int retval = -1;
+	long length = 0;
+	char *cstr;
+	//int cstrlen;
+
+	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rz|l", &zstream, &zbuf, &length) == FAILURE) {
+		RETURN_LONG(retval);
+	}
+	ZEND_FETCH_RESOURCE (stream, php_libvirt_stream*, &zstream, -1, PHP_LIBVIRT_STREAM_RES_NAME, le_libvirt_stream);
+	if ((stream==NULL)||(stream->stream==NULL))RETURN_LONG(retval);
+
+	cstr = Z_STRVAL_P(zbuf);
+	//cstrlen = Z_STRLEN_P(zbuf);
+
+	retval = virStreamSend(stream->stream, cstr, length);
+	if (retval == -1) {
+		set_error("Cannot send to stream" TSRMLS_CC);
+		RETURN_LONG(retval);
+	}
+
+	RETURN_LONG(retval);
+}
+
+/*
 	Function name:	libvirt_domain_lookup_by_id
 	Since version:	0.4.1(-1)
 	Description:	Function is used to get domain by it's ID, applicable only to running guests
@@ -3544,13 +3806,12 @@ PHP_FUNCTION(libvirt_domain_get_uuid_string)
 				@opaque [void *]: used for file descriptor
 	Returns:		write() error code as it's calling write
 */
-
 static int streamSink(virStreamPtr st ATTRIBUTE_UNUSED,
                          const char *bytes, size_t nbytes, void *opaque)
 {
-    int *fd = (int *)opaque;
+	int *fd = (int *)opaque;
 
-    return write(*fd, bytes, nbytes);
+	return write(*fd, bytes, nbytes);
 }
 
 /*
@@ -6782,6 +7043,117 @@ PHP_FUNCTION(libvirt_storagevolume_delete)
 }
 
 /*
+	Function name:	libvirt_storagevolume_resize
+	Since version:	0.5.0
+	Description:	Function is used to resize volume identified by it's resource
+	Arguments:	@res [resource]: libvirt storagevolume resource
+			@capacity [int]: capacity for the storage volume
+			@flags [int]: optional flags for the storage volume resize for virStorageVolResize()
+	Returns:	int
+*/
+PHP_FUNCTION(libvirt_storagevolume_resize)
+{
+	php_libvirt_volume *volume=NULL;
+	zval *zvolume;
+	long flags = 0;
+	long capacity = 0;
+	int retval = -1;
+
+	GET_VOLUME_FROM_ARGS("rl|l", &zvolume, &capacity, &flags);
+
+	retval = virStorageVolResize(volume->volume, capacity, flags);
+	DPRINTF("%s: virStorageVolResize(%p, %d, %d) returned %d\n", PHPFUNC, volume->volume, (int) capacity, (int) flags, retval);
+	if (retval != 0) {
+		set_error_if_unset("Cannot resize storage volume" TSRMLS_CC);
+		RETURN_LONG(retval);
+	}
+
+	RETURN_LONG(retval);
+}
+
+/*
+	Function name:	libvirt_storagevolume_download
+	Since version:	0.5.0
+	Description:	Function is used to download volume identified by it's resource
+	Arguments:	@res [resource]: libvirt storagevolume resource
+			@stream [resource]: stream to use as output
+			@offset [int]: position to start reading from
+			@length [int] : limit on amount of data to download
+			@flags [int]: optional flags for the storage volume download for virStorageVolDownload()
+	Returns:	int
+*/
+PHP_FUNCTION(libvirt_storagevolume_download)
+{
+	php_libvirt_volume *volume=NULL;
+	php_libvirt_stream *stream=NULL;
+	zval *zvolume;
+	zval *zstream;
+	long flags = 0;
+	long offset = 0;
+	long length = 0;
+	int retval = -1;
+
+	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rr|l|l|l", &zvolume, &zstream, &offset, &length, &flags) == FAILURE) {
+		RETURN_LONG(retval);
+	}
+	ZEND_FETCH_RESOURCE (volume, php_libvirt_volume*, &zvolume, -1, PHP_LIBVIRT_VOLUME_RES_NAME, le_libvirt_volume);
+	if ((volume==NULL)||(volume->volume==NULL))RETURN_LONG(retval);
+	ZEND_FETCH_RESOURCE (stream, php_libvirt_stream*, &zstream, -1, PHP_LIBVIRT_STREAM_RES_NAME, le_libvirt_stream);
+	if ((stream==NULL)||(stream->stream==NULL))RETURN_LONG(retval);
+
+	retval = virStorageVolDownload(volume->volume, stream->stream, offset, length, flags);
+	DPRINTF("%s: virStorageVolDownload(%p, %p, %d, %d, %d) returned %d\n", PHPFUNC, volume->volume, stream->stream, (int) offset, (int) length, (int) flags, retval);
+
+	if (retval == -1) {
+		set_error("Cannot download from stream" TSRMLS_CC);
+		RETURN_LONG(retval);
+	}
+
+	RETURN_LONG(retval);
+}
+
+/*
+	Function name:	libvirt_storagevolume_upload
+	Since version:	0.5.0
+	Description:	Function is used to upload volume identified by it's resource
+	Arguments:	@res [resource]: libvirt storagevolume resource
+			@stream [resource]: stream to use as input
+			@offset [int]: position to start writing to
+			@length [int] : limit on amount of data to upload
+			@flags [int]: optional flags for the storage volume upload for virStorageVolUpload()
+	Returns:	int
+*/
+PHP_FUNCTION(libvirt_storagevolume_upload)
+{
+	php_libvirt_volume *volume=NULL;
+	php_libvirt_stream *stream=NULL;
+	zval *zvolume;
+	zval *zstream;
+	long flags = 0;
+	long offset = 0;
+	long length = 0;
+	int retval = -1;
+
+	if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rr|l|l|l", &zvolume, &zstream, &offset, &length, &flags) == FAILURE) {
+		RETURN_LONG(retval);
+	}
+	ZEND_FETCH_RESOURCE (volume, php_libvirt_volume*, &zvolume, -1, PHP_LIBVIRT_VOLUME_RES_NAME, le_libvirt_volume);
+	if ((volume==NULL)||(volume->volume==NULL))RETURN_LONG(retval);
+	ZEND_FETCH_RESOURCE (stream, php_libvirt_stream*, &zstream, -1, PHP_LIBVIRT_STREAM_RES_NAME, le_libvirt_stream);
+	if ((stream==NULL)||(stream->stream==NULL))RETURN_LONG(retval);
+
+	retval = virStorageVolUpload(volume->volume, stream->stream, offset, length, flags);
+	DPRINTF("%s: virStorageVolUpload(%p, %p, %d, %d, %d) returned %d\n", PHPFUNC, volume->volume, stream->stream, (int) offset, (int) length, (int) flags, retval);
+
+	if (retval == -1) {
+		set_error_if_unset("Cannot upload storage volume" TSRMLS_CC);
+		RETURN_LONG(retval);
+	}
+
+	RETURN_LONG(retval);
+}
+
+/*
 	Function name:	libvirt_storagepool_get_uuid_string
 	Since version:	0.4.1(-1)
 	Description:	Function is used to get storage pool by UUID string
diff --git a/src/libvirt-php.h b/src/libvirt-php.h
index 450fbea..3bcc682 100644
--- a/src/libvirt-php.h
+++ b/src/libvirt-php.h
@@ -214,6 +214,7 @@ ZEND_END_MODULE_GLOBALS(libvirt)
 #define INT_RESOURCE_STORAGEPOOL	0x10
 #define INT_RESOURCE_VOLUME		0x20
 #define INT_RESOURCE_SNAPSHOT		0x40
+#define INT_RESOURCE_STREAM             0x50
 
 typedef struct tVMDisk {
 	char *path;
@@ -257,6 +258,11 @@ typedef struct _php_libvirt_connection {
 	long resource_id;
 } php_libvirt_connection;
 
+typedef struct _php_libvirt_stream {
+        virStreamPtr stream;
+        php_libvirt_connection* conn;
+} php_libvirt_stream;
+
 typedef struct _php_libvirt_domain {
 	virDomainPtr domain;
 	php_libvirt_connection* conn;
@@ -311,6 +317,7 @@ int gdebug;
 
 #define PHP_LIBVIRT_CONNECTION_RES_NAME "Libvirt connection"
 #define PHP_LIBVIRT_DOMAIN_RES_NAME "Libvirt domain"
+#define PHP_LIBVIRT_STREAM_RES_NAME "Libvirt stream"
 #define PHP_LIBVIRT_STORAGEPOOL_RES_NAME "Libvirt storagepool"
 #define PHP_LIBVIRT_VOLUME_RES_NAME "Libvirt volume"
 #define PHP_LIBVIRT_NETWORK_RES_NAME "Libvirt virtual network"
@@ -347,6 +354,13 @@ PHP_FUNCTION(libvirt_node_get_info);
 PHP_FUNCTION(libvirt_node_get_cpu_stats);
 PHP_FUNCTION(libvirt_node_get_cpu_stats_for_each_cpu);
 PHP_FUNCTION(libvirt_node_get_mem_stats);
+/* Stream functions */
+PHP_FUNCTION(libvirt_stream_create);
+PHP_FUNCTION(libvirt_stream_close);
+PHP_FUNCTION(libvirt_stream_abort);
+PHP_FUNCTION(libvirt_stream_finish);
+PHP_FUNCTION(libvirt_stream_recv);
+PHP_FUNCTION(libvirt_stream_send);
 /* Domain functions */
 PHP_FUNCTION(libvirt_domain_new);
 PHP_FUNCTION(libvirt_domain_new_get_vnc);
@@ -427,6 +441,9 @@ PHP_FUNCTION(libvirt_storagevolume_get_xml_desc);
 PHP_FUNCTION(libvirt_storagevolume_create_xml);
 PHP_FUNCTION(libvirt_storagevolume_create_xml_from);
 PHP_FUNCTION(libvirt_storagevolume_delete);
+PHP_FUNCTION(libvirt_storagevolume_download);
+PHP_FUNCTION(libvirt_storagevolume_upload);
+PHP_FUNCTION(libvirt_storagevolume_resize);
 PHP_FUNCTION(libvirt_storagepool_get_uuid_string);
 PHP_FUNCTION(libvirt_storagepool_get_name);
 PHP_FUNCTION(libvirt_storagepool_lookup_by_uuid_string);
-- 
2.3.3




More information about the libvir-list mailing list