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

Vasiliy Tolstov v.tolstov at selfip.ru
Thu Apr 30 09:29:06 UTC 2015


ping...

2015-04-28 19:26 GMT+03:00 Vasiliy Tolstov <v.tolstov at selfip.ru>:
> 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
>



-- 
Vasiliy Tolstov,
e-mail: v.tolstov at selfip.ru
jabber: vase at selfip.ru




More information about the libvir-list mailing list