[libvirt] [libvirt-php PATCH 09/13] Split up the bindings for libvirt storage API

Dawid Zamirski dzrudy at gmail.com
Tue Aug 1 21:46:10 UTC 2017


---
 src/Makefile.am       |    3 +-
 src/libvirt-php.c     | 1188 +------------------------------------------------
 src/libvirt-php.h     |   49 --
 src/libvirt-storage.c | 1129 ++++++++++++++++++++++++++++++++++++++++++++++
 src/libvirt-storage.h |  138 ++++++
 5 files changed, 1271 insertions(+), 1236 deletions(-)
 create mode 100644 src/libvirt-storage.c
 create mode 100644 src/libvirt-storage.h

diff --git a/src/Makefile.am b/src/Makefile.am
index 4ae01db..32b23cf 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -26,7 +26,8 @@ libvirt_php_la_SOURCES = \
 	libvirt-node.c libvirt-node.h \
 	libvirt-stream.c libvirt-stream.h \
 	libvirt-domain.c libvirt-domain.h \
-	libvirt-network.c libvirt-network.h 
+	libvirt-network.c libvirt-network.h \
+	libvirt-storage.c libvirt-storage.h
 libvirt_php_la_CFLAGS = \
 	$(AM_CFLAGS) \
 	-DCOMPILE_DL_LIBVIRT=1
diff --git a/src/libvirt-php.c b/src/libvirt-php.c
index 9e43a71..1f0d058 100644
--- a/src/libvirt-php.c
+++ b/src/libvirt-php.c
@@ -25,6 +25,7 @@
 #include "libvirt-stream.h"
 #include "libvirt-domain.h"
 #include "libvirt-network.h"
+#include "libvirt-storage.h"
 
 DEBUG_INIT("core");
 
@@ -38,8 +39,6 @@ const char *features_binaries[] = { NULL };
 #endif
 
 /* ZEND thread safe per request globals definition */
-int le_libvirt_storagepool;
-int le_libvirt_volume;
 int le_libvirt_nodedev;
 int le_libvirt_snapshot;
 int le_libvirt_nwfilter;
@@ -485,38 +484,7 @@ static zend_function_entry libvirt_functions[] = {
     PHP_FE(libvirt_domain_snapshot_revert,       arginfo_libvirt_conn_optflags)
     PHP_FE(libvirt_domain_snapshot_delete,       arginfo_libvirt_conn_optflags)
     PHP_FE(libvirt_domain_snapshot_lookup_by_name, arginfo_libvirt_domain_snapshot_lookup_by_name)
-    /* Storagepool functions */
-    PHP_FE(libvirt_storagepool_lookup_by_name,   arginfo_libvirt_conn_name)
-    PHP_FE(libvirt_storagepool_lookup_by_volume, arginfo_libvirt_conn)
-    PHP_FE(libvirt_storagepool_get_info,         arginfo_libvirt_conn)
-    PHP_FE(libvirt_storagevolume_lookup_by_name, arginfo_libvirt_conn_name)
-    PHP_FE(libvirt_storagevolume_lookup_by_path, arginfo_libvirt_storagevolume_lookup_by_path)
-    PHP_FE(libvirt_storagevolume_get_name,       arginfo_libvirt_conn)
-    PHP_FE(libvirt_storagevolume_get_path,       arginfo_libvirt_conn)
-    PHP_FE(libvirt_storagevolume_get_info,       arginfo_libvirt_conn)
-    PHP_FE(libvirt_storagevolume_get_xml_desc,   arginfo_libvirt_storagevolume_get_xml_desc)
-    PHP_FE(libvirt_storagevolume_create_xml,     arginfo_libvirt_conn_xml)
-    PHP_FE(libvirt_storagevolume_create_xml_from,arginfo_libvirt_storagevolume_create_xml_from)
-    PHP_FE(libvirt_storagevolume_delete,         arginfo_libvirt_conn_optflags)
-    PHP_FE(libvirt_storagevolume_download,       arginfo_libvirt_storagevolume_download)
-    PHP_FE(libvirt_storagevolume_upload,         arginfo_libvirt_storagevolume_download)
-    PHP_FE(libvirt_storagevolume_resize,         arginfo_libvirt_storagevolume_resize)
-    PHP_FE(libvirt_storagepool_get_uuid_string,  arginfo_libvirt_conn)
-    PHP_FE(libvirt_storagepool_get_name,         arginfo_libvirt_conn)
-    PHP_FE(libvirt_storagepool_lookup_by_uuid_string, arginfo_libvirt_conn_uuid)
-    PHP_FE(libvirt_storagepool_get_xml_desc,     arginfo_libvirt_conn_xpath)
-    PHP_FE(libvirt_storagepool_define_xml,       arginfo_libvirt_storagepool_define_xml)
-    PHP_FE(libvirt_storagepool_undefine,         arginfo_libvirt_conn)
-    PHP_FE(libvirt_storagepool_create,           arginfo_libvirt_conn)
-    PHP_FE(libvirt_storagepool_destroy,          arginfo_libvirt_conn)
-    PHP_FE(libvirt_storagepool_is_active,        arginfo_libvirt_conn)
-    PHP_FE(libvirt_storagepool_get_volume_count, arginfo_libvirt_conn)
-    PHP_FE(libvirt_storagepool_refresh,          arginfo_libvirt_conn_optflags)
-    PHP_FE(libvirt_storagepool_set_autostart,    arginfo_libvirt_conn_flags)
-    PHP_FE(libvirt_storagepool_get_autostart,    arginfo_libvirt_conn)
-    PHP_FE(libvirt_storagepool_build,            arginfo_libvirt_conn)
-    PHP_FE(libvirt_storagepool_delete,           arginfo_libvirt_conn)
-    /* Network functions */
+    PHP_FE_LIBVIRT_STORAGE
     PHP_FE_LIBVIRT_NETWORK
     PHP_FE_LIBVIRT_NODE
     /* Nodedev functions */
@@ -537,10 +505,6 @@ static zend_function_entry libvirt_functions[] = {
     /* List functions */
     PHP_FE(libvirt_list_domain_snapshots,        arginfo_libvirt_conn_optflags)
     PHP_FE(libvirt_list_nodedevs,                arginfo_libvirt_conn_optcap)
-    PHP_FE(libvirt_list_storagepools,            arginfo_libvirt_conn)
-    PHP_FE(libvirt_list_active_storagepools,     arginfo_libvirt_conn)
-    PHP_FE(libvirt_list_inactive_storagepools,   arginfo_libvirt_conn)
-    PHP_FE(libvirt_storagepool_list_volumes,     arginfo_libvirt_conn)
     PHP_FE(libvirt_list_all_nwfilters,           arginfo_libvirt_conn)
     PHP_FE(libvirt_list_nwfilters,               arginfo_libvirt_conn)
     /* Version information and common function */
@@ -578,7 +542,6 @@ zend_module_entry libvirt_module_entry = {
 ZEND_GET_MODULE(libvirt)
 #endif
 
-
 /* PHP init options */
 PHP_INI_BEGIN()
 STD_PHP_INI_ENTRY("libvirt.longlong_to_string", "1", PHP_INI_ALL, OnUpdateBool, longlong_to_string_ini, zend_libvirt_globals, libvirt_globals)
@@ -1223,60 +1186,6 @@ int is_local_connection(virConnectPtr conn)
 #endif
 }
 
-/* Destructor for storagepool resource */
-static void php_libvirt_storagepool_dtor(virt_resource *rsrc TSRMLS_DC)
-{
-    php_libvirt_storagepool *pool = (php_libvirt_storagepool *)rsrc->ptr;
-    int rv = 0;
-
-    if (pool != NULL) {
-        if (pool->pool != NULL) {
-            if (!check_resource_allocation(NULL, INT_RESOURCE_STORAGEPOOL, pool->pool TSRMLS_CC)) {
-                pool->pool = NULL;
-                efree(pool);
-                return;
-            }
-            rv = virStoragePoolFree(pool->pool);
-            if (rv != 0) {
-                DPRINTF("%s: virStoragePoolFree(%p) returned %d (%s)\n", __FUNCTION__, pool->pool, rv, LIBVIRT_G(last_error));
-                php_error_docref(NULL TSRMLS_CC, E_WARNING, "virStoragePoolFree failed with %i on destructor: %s", rv, LIBVIRT_G(last_error));
-            } else {
-                DPRINTF("%s: virStoragePoolFree(%p) completed successfully\n", __FUNCTION__, pool->pool);
-                resource_change_counter(INT_RESOURCE_STORAGEPOOL, NULL, pool->pool, 0 TSRMLS_CC);
-            }
-            pool->pool = NULL;
-        }
-        efree(pool);
-    }
-}
-
-/* Destructor for volume resource */
-static void php_libvirt_volume_dtor(virt_resource *rsrc TSRMLS_DC)
-{
-    php_libvirt_volume *volume = (php_libvirt_volume *)rsrc->ptr;
-    int rv = 0;
-
-    if (volume != NULL) {
-        if (volume->volume != NULL) {
-            if (!check_resource_allocation(NULL, INT_RESOURCE_VOLUME, volume->volume TSRMLS_CC)) {
-                volume->volume = NULL;
-                efree(volume);
-                return;
-            }
-            rv = virStorageVolFree(volume->volume);
-            if (rv != 0) {
-                DPRINTF("%s: virStorageVolFree(%p) returned %d (%s)\n", __FUNCTION__, volume->volume, rv, LIBVIRT_G(last_error));
-                php_error_docref(NULL TSRMLS_CC, E_WARNING, "virStorageVolFree failed with %i on destructor: %s", rv, LIBVIRT_G(last_error));
-            } else {
-                DPRINTF("%s: virStorageVolFree(%p) completed successfully\n", __FUNCTION__, volume->volume);
-                resource_change_counter(INT_RESOURCE_VOLUME, NULL, volume->volume, 0 TSRMLS_CC);
-            }
-            volume->volume = NULL;
-        }
-        efree(volume);
-    }
-}
-
 /* Destructor for nodedev resource */
 static void php_libvirt_nodedev_dtor(virt_resource *rsrc TSRMLS_DC)
 {
@@ -1697,32 +1606,6 @@ PHP_MSHUTDOWN_FUNCTION(libvirt)
             RETURN_FALSE;                                                                       \
     } while (0)
 
-#define GET_STORAGEPOOL_FROM_ARGS(args, ...)                                                    \
-    do {                                                                                        \
-        reset_error(TSRMLS_C);                                                                  \
-        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, args, __VA_ARGS__) == FAILURE) {   \
-            set_error("Invalid arguments" TSRMLS_CC);                                           \
-            RETURN_FALSE;                                                                       \
-        }                                                                                       \
-                                                                                                \
-        VIRT_FETCH_RESOURCE(pool, php_libvirt_storagepool*, &zpool, PHP_LIBVIRT_STORAGEPOOL_RES_NAME, le_libvirt_storagepool);\
-        if ((pool == NULL) || (pool->pool == NULL))                                             \
-            RETURN_FALSE;                                                                       \
-    } while (0)                                                                                 \
-
-#define GET_VOLUME_FROM_ARGS(args, ...)                                                         \
-    do {                                                                                        \
-        reset_error(TSRMLS_C);                                                                  \
-        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, args, __VA_ARGS__) == FAILURE) {   \
-            set_error("Invalid arguments" TSRMLS_CC);                                           \
-            RETURN_FALSE;                                                                       \
-        }                                                                                       \
-                                                                                                \
-        VIRT_FETCH_RESOURCE(volume, php_libvirt_volume*, &zvolume, PHP_LIBVIRT_VOLUME_RES_NAME, le_libvirt_volume);\
-        if ((volume == NULL) || (volume->volume == NULL))                                       \
-            RETURN_FALSE;                                                                       \
-    } while (0)                                                                                 \
-
 #define GET_SNAPSHOT_FROM_ARGS(args, ...)                                                       \
     do {                                                                                        \
         reset_error(TSRMLS_C);                                                                  \
@@ -2929,1075 +2812,8 @@ PHP_FUNCTION(libvirt_list_domain_snapshots)
     efree(names);
 }
 
-/* Storagepool functions */
-
-/*
- * Function name:   libvirt_storagepool_lookup_by_name
- * Since version:   0.4.1(-1)
- * Description:     Function is used to lookup for storage pool by it's name
- * Arguments:       @res [resource]: libvirt connection resource
- *                  @name [string]: storage pool name
- * Returns:         libvirt storagepool resource
- */
-PHP_FUNCTION(libvirt_storagepool_lookup_by_name)
-{
-    php_libvirt_connection *conn = NULL;
-    zval *zconn;
-    strsize_t name_len;
-    char *name = NULL;
-    virStoragePoolPtr pool = NULL;
-    php_libvirt_storagepool *res_pool;
-
-    GET_CONNECTION_FROM_ARGS("rs", &zconn, &name, &name_len);
-
-    if ((name == NULL) || (name_len < 1))
-        RETURN_FALSE;
-    pool = virStoragePoolLookupByName(conn->conn, name);
-    DPRINTF("%s: virStoragePoolLookupByName(%p, %s) returned %p\n", PHPFUNC, conn->conn, name, pool);
-    if (pool == NULL)
-        RETURN_FALSE;
-
-    res_pool = (php_libvirt_storagepool *)emalloc(sizeof(php_libvirt_storagepool));
-    res_pool->pool = pool;
-    res_pool->conn = conn;
-
-    DPRINTF("%s: returning %p\n", PHPFUNC, res_pool->pool);
-    resource_change_counter(INT_RESOURCE_STORAGEPOOL, conn->conn, res_pool->pool, 1 TSRMLS_CC);
-
-    VIRT_REGISTER_RESOURCE(res_pool, le_libvirt_storagepool);
-}
-
-/* Storagepool functions */
-
-/*
- * Function name:   libvirt_storagepool_lookup_by_volume
- * Since version:   0.4.1(-1)
- * Description:     Function is used to lookup for storage pool by a volume
- * Arguments:       @res [volume]: volume resource of storage pool
- * Returns:         libvirt storagepool resource
- */
-PHP_FUNCTION(libvirt_storagepool_lookup_by_volume)
-{
-    php_libvirt_volume *volume;
-    zval *zvolume;
-    virStoragePoolPtr pool = NULL;
-    php_libvirt_storagepool *res_pool;
-
-    GET_VOLUME_FROM_ARGS("r", &zvolume);
-
-    pool = virStoragePoolLookupByVolume(volume->volume);
-    DPRINTF("%s: virStoragePoolLookupByVolume(%p) returned %p\n", PHPFUNC, volume->volume, pool);
-    if (pool == NULL)
-        RETURN_FALSE;
-
-    res_pool = (php_libvirt_storagepool *)emalloc(sizeof(php_libvirt_storagepool));
-    res_pool->pool = pool;
-    res_pool->conn = volume->conn;
-
-    DPRINTF("%s: returning %p\n", PHPFUNC, res_pool->pool);
-    resource_change_counter(INT_RESOURCE_STORAGEPOOL, res_pool->conn->conn, res_pool->pool, 1 TSRMLS_CC);
-
-    VIRT_REGISTER_RESOURCE(res_pool, le_libvirt_storagepool);
-}
-
-/*
- * Function name:   libvirt_storagepool_list_volumes
- * Since version:   0.4.1(-1)
- * Description:     Function is used to list volumes in the specified storage pool
- * Arguments:       @res [resource]: libvirt storagepool resource
- * Returns:         list of storage volume names in the storage pool in an array using default keys (indexes)
- */
-PHP_FUNCTION(libvirt_storagepool_list_volumes)
-{
-    php_libvirt_storagepool *pool = NULL;
-    zval *zpool;
-    char **names = NULL;
-    int expectedcount = -1;
-    int i;
-    int count = -1;
-
-    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
-
-    if ((expectedcount = virStoragePoolNumOfVolumes(pool->pool)) < 0)
-        RETURN_FALSE;
-
-    DPRINTF("%s: virStoragePoolNumOfVolumes(%p) returned %d\n", PHPFUNC, pool->pool, expectedcount);
-    names = (char **)emalloc(expectedcount*sizeof(char *));
-
-    count = virStoragePoolListVolumes(pool->pool, names, expectedcount);
-    DPRINTF("%s: virStoragePoolListVolumes(%p, %p, %d) returned %d\n", PHPFUNC, pool->pool, names, expectedcount, count);
-    array_init(return_value);
-
-    if ((count != expectedcount) || (count < 0))
-        RETURN_FALSE;
-    for (i = 0; i < count; i++) {
-        VIRT_ADD_NEXT_INDEX_STRING(return_value,  names[i]);
-        free(names[i]);
-    }
-
-    efree(names);
-}
-
-/*
- * Function name:   libvirt_storagepool_get_info
- * Since version:   0.4.1(-1)
- * Description:     Function is used to get information about the storage pool
- * Arguments:       @res [resource]: libvirt storagepool resource
- * Returns:         storage pool information array of state, capacity, allocation and available space
- */
-PHP_FUNCTION(libvirt_storagepool_get_info)
-{
-    php_libvirt_storagepool *pool = NULL;
-    zval *zpool;
-    virStoragePoolInfo poolInfo;
-    int retval;
-
-    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
-
-    retval = virStoragePoolGetInfo(pool->pool, &poolInfo);
-    DPRINTF("%s: virStoragePoolGetInfo(%p, <info>) returned %d\n", PHPFUNC, pool->pool, retval);
-    if (retval != 0)
-        RETURN_FALSE;
-
-    array_init(return_value);
-
-    // @todo: fix the long long returns
-    LONGLONG_INIT;
-    add_assoc_long(return_value, "state", (long)poolInfo.state);
-    LONGLONG_ASSOC(return_value, "capacity", poolInfo.capacity);
-    LONGLONG_ASSOC(return_value, "allocation", poolInfo.allocation);
-    LONGLONG_ASSOC(return_value, "available", poolInfo.available);
-}
-
-/*
- * Function name:   libvirt_storagevolume_lookup_by_name
- * Since version:   0.4.1(-1)
- * Description:     Function is used to lookup for storage volume by it's name
- * Arguments:       @res [resource]: libvirt storagepool resource
- *                  @name [string]: name of the storage volume to look for
- * Returns:         libvirt storagevolume resource
- */
-PHP_FUNCTION(libvirt_storagevolume_lookup_by_name)
-{
-    php_libvirt_storagepool *pool = NULL;
-    php_libvirt_volume *res_volume;
-    zval *zpool;
-    strsize_t name_len;
-    char *name = NULL;
-    virStorageVolPtr volume = NULL;
-
-    GET_STORAGEPOOL_FROM_ARGS("rs", &zpool, &name, &name_len);
-    if ((name == NULL) || (name_len < 1))
-        RETURN_FALSE;
-
-    volume = virStorageVolLookupByName(pool->pool, name);
-    DPRINTF("%s: virStorageVolLookupByName(%p, %s) returned %p\n", PHPFUNC, pool->pool, name, volume);
-    if (volume == NULL)
-        RETURN_FALSE;
-
-    res_volume = (php_libvirt_volume *)emalloc(sizeof(php_libvirt_volume));
-    res_volume->volume = volume;
-    res_volume->conn   = pool->conn;
-
-    DPRINTF("%s: returning %p\n", PHPFUNC, res_volume->volume);
-    resource_change_counter(INT_RESOURCE_VOLUME, pool->conn->conn, res_volume->volume, 1 TSRMLS_CC);
-
-    VIRT_REGISTER_RESOURCE(res_volume, le_libvirt_volume);
-}
-
-/*
- * Function name:   libvirt_storagevolume_lookup_by_path
- * Since version:   0.4.1(-2)
- * Description:     Function is used to lookup for storage volume by it's path
- * Arguments:       @res [resource]: libvirt connection resource
- *                  @path [string]: path of the storage volume to look for
- * Returns:         libvirt storagevolume resource
- */
-PHP_FUNCTION(libvirt_storagevolume_lookup_by_path)
-{
-    php_libvirt_connection *conn = NULL;
-    php_libvirt_volume *res_volume;
-    zval *zconn;
-    strsize_t name_len;
-    char *name = NULL;
-    virStorageVolPtr volume = NULL;
-
-    GET_CONNECTION_FROM_ARGS("rs", &zconn, &name, &name_len);
-    if ((name == NULL) || (name_len < 1))
-        RETURN_FALSE;
-
-    volume = virStorageVolLookupByPath(conn->conn, name);
-    DPRINTF("%s: virStorageVolLookupByPath(%p, %s) returned %p\n", PHPFUNC, conn->conn, name, volume);
-    if (volume == NULL) {
-        set_error_if_unset("Cannot find storage volume on requested path" TSRMLS_CC);
-        RETURN_FALSE;
-    }
-
-    res_volume = (php_libvirt_volume *)emalloc(sizeof(php_libvirt_volume));
-    res_volume->volume = volume;
-    res_volume->conn   = conn;
-
-    DPRINTF("%s: returning %p\n", PHPFUNC, res_volume->volume);
-    resource_change_counter(INT_RESOURCE_VOLUME, conn->conn, res_volume->volume, 1 TSRMLS_CC);
-
-    VIRT_REGISTER_RESOURCE(res_volume, le_libvirt_volume);
-}
-
-/*
- * Function name:   libvirt_storagevolume_get_name
- * Since version:   0.4.1(-2)
- * Description:     Function is used to get the storage volume name
- * Arguments:       @res [resource]: libvirt storagevolume resource
- * Returns:         storagevolume name
- */
-PHP_FUNCTION(libvirt_storagevolume_get_name)
-{
-    php_libvirt_volume *volume = NULL;
-    zval *zvolume;
-    const char *retval;
-
-    GET_VOLUME_FROM_ARGS("r", &zvolume);
-
-    retval = virStorageVolGetName(volume->volume);
-    DPRINTF("%s: virStorageVolGetName(%p) returned %s\n", PHPFUNC, volume->volume, retval);
-    if (retval == NULL)
-        RETURN_FALSE;
-
-    VIRT_RETURN_STRING(retval);
-}
-
-/*
- * Function name:   libvirt_storagevolume_get_path
- * Since version:   0.4.1(-2)
- * Description:     Function is used to get the  storage volume path
- * Arguments:       @res [resource]: libvirt storagevolume resource
- * Returns:         storagevolume path
- */
-PHP_FUNCTION(libvirt_storagevolume_get_path)
-{
-    php_libvirt_volume *volume = NULL;
-    zval *zvolume;
-    char *retval;
-
-    GET_VOLUME_FROM_ARGS("r", &zvolume);
-
-    retval = virStorageVolGetPath(volume->volume);
-    DPRINTF("%s: virStorageVolGetPath(%p) returned %s\n", PHPFUNC, volume->volume, retval);
-    if (retval == NULL)
-        RETURN_FALSE;
-
-    VIRT_RETVAL_STRING(retval);
-    free(retval);
-}
-
-/*
- * Function name:   libvirt_storagevolume_get_info
- * Since version:   0.4.1(-1)
- * Description:     Function is used to get the storage volume information
- * Arguments:       @res [resource]: libvirt storagevolume resource
- * Returns:         storage volume information array of type, allocation and capacity
- */
-PHP_FUNCTION(libvirt_storagevolume_get_info)
-{
-    php_libvirt_volume *volume = NULL;
-    zval *zvolume;
-    virStorageVolInfo volumeInfo;
-    int retval;
-
-    GET_VOLUME_FROM_ARGS("r", &zvolume);
-
-    retval = virStorageVolGetInfo(volume->volume, &volumeInfo);
-    DPRINTF("%s: virStorageVolGetInfo(%p, <info>) returned %d\n", PHPFUNC, volume->volume, retval);
-    if (retval != 0)
-        RETURN_FALSE;
-
-    array_init(return_value);
-    LONGLONG_INIT;
-    add_assoc_long(return_value, "type", (long)volumeInfo.type);
-    LONGLONG_ASSOC(return_value, "capacity", volumeInfo.capacity);
-    LONGLONG_ASSOC(return_value, "allocation", volumeInfo.allocation);
-}
-
-/*
- * Function name:   libvirt_storagevolume_get_xml_desc
- * Since version:   0.4.1(-1), changed 0.4.2
- * Description:     Function is used to get the storage volume XML description
- * Arguments:       @res [resource]: libvirt storagevolume resource
- *                  @xpath [string]: optional xPath expression string to get just this entry, can be NULL
- *                  @flags [int]: optional flags
- * Returns:         storagevolume XML description or result of xPath expression
- */
-PHP_FUNCTION(libvirt_storagevolume_get_xml_desc)
-{
-    php_libvirt_volume *volume = NULL;
-    zval *zvolume;
-    char *tmp = NULL;
-    char *xml;
-    char *xpath = NULL;
-    strsize_t xpath_len;
-    zend_long flags = 0;
-    int retval = -1;
-
-    GET_VOLUME_FROM_ARGS("rs|l", &zvolume, &xpath, &xpath_len, &flags);
-    if (xpath_len < 1)
-        xpath = NULL;
-
-    DPRINTF("%s: volume = %p, xpath = %s, flags = %ld\n", PHPFUNC, volume->volume, xpath, flags);
-
-    xml = virStorageVolGetXMLDesc(volume->volume, flags);
-    if (xml == NULL) {
-        set_error_if_unset("Cannot get the XML description" TSRMLS_CC);
-        RETURN_FALSE;
-    }
-
-    tmp = get_string_from_xpath(xml, xpath, NULL, &retval);
-    if ((tmp == NULL) || (retval < 0)) {
-        VIRT_RETVAL_STRING(xml);
-    } else {
-        VIRT_RETVAL_STRING(tmp);
-    }
-
-    free(xml);
-    free(tmp);
-}
-
-/*
- * Function name:   libvirt_storagevolume_create_xml
- * Since version:   0.4.1(-1)
- * Description:     Function is used to create the new storage pool and return the handle to new storage pool
- * Arguments:       @res [resource]: libvirt storagepool resource
- *                  @xml [string]: XML string to create the storage volume in the storage pool
- *                  @flags [int]: virStorageVolCreateXML flags
- * Returns:         libvirt storagevolume resource
- */
-PHP_FUNCTION(libvirt_storagevolume_create_xml)
-{
-    php_libvirt_volume *res_volume = NULL;
-    php_libvirt_storagepool *pool = NULL;
-    zval *zpool;
-    virStorageVolPtr volume = NULL;
-    char *xml;
-    zend_long flags = 0;
-    strsize_t xml_len;
-
-    GET_STORAGEPOOL_FROM_ARGS("rs|l", &zpool, &xml, &xml_len, &flags);
-
-    volume = virStorageVolCreateXML(pool->pool, xml, flags);
-    DPRINTF("%s: virStorageVolCreateXML(%p, <xml>, 0) returned %p\n", PHPFUNC, pool->pool, volume);
-    if (volume == NULL)
-        RETURN_FALSE;
-
-    res_volume = (php_libvirt_volume *)emalloc(sizeof(php_libvirt_volume));
-    res_volume->volume = volume;
-    res_volume->conn   = pool->conn;
-
-    DPRINTF("%s: returning %p\n", PHPFUNC, res_volume->volume);
-    resource_change_counter(INT_RESOURCE_VOLUME, pool->conn->conn, res_volume->volume, 1 TSRMLS_CC);
-
-    VIRT_REGISTER_RESOURCE(res_volume, le_libvirt_volume);
-}
-
-/*
- * Function name:   libvirt_storagevolume_create_xml_from
- * Since version:   0.4.1(-2)
- * Description:     Function is used to clone the new storage volume into pool from the orignial volume
- * Arguments:       @pool [resource]: libvirt storagepool resource
- *                  @xml [string]: XML string to create the storage volume in the storage pool
- *                  @original_volume [resource]: libvirt storagevolume resource
- * Returns:         libvirt storagevolume resource
- */
-PHP_FUNCTION(libvirt_storagevolume_create_xml_from)
-{
-    php_libvirt_volume *res_volume = NULL;
-    php_libvirt_storagepool *pool = NULL;
-    zval *zpool;
-
-    php_libvirt_volume *pl_volume = NULL;
-    zval *zvolume;
-
-    virStorageVolPtr volume = NULL;
-    char *xml;
-    strsize_t xml_len;
-
-    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsr", &zpool, &xml, &xml_len, &zvolume) == FAILURE) {
-        set_error("Invalid pool resource, XML or volume resouce" TSRMLS_CC);
-        RETURN_FALSE;
-    }
-
-    VIRT_FETCH_RESOURCE(pool, php_libvirt_storagepool*, &zpool, PHP_LIBVIRT_STORAGEPOOL_RES_NAME, le_libvirt_storagepool);
-    if ((pool == NULL) || (pool->pool == NULL))
-        RETURN_FALSE;
-    VIRT_FETCH_RESOURCE(pl_volume, php_libvirt_volume*, &zvolume, PHP_LIBVIRT_VOLUME_RES_NAME, le_libvirt_volume);
-    if ((pl_volume == NULL) || (pl_volume->volume == NULL))
-        RETURN_FALSE;
-    resource_change_counter(INT_RESOURCE_VOLUME, NULL, pl_volume->volume, 1 TSRMLS_CC);
-
-    volume = virStorageVolCreateXMLFrom(pool->pool, xml, pl_volume->volume, 0);
-    DPRINTF("%s: virStorageVolCreateXMLFrom(%p, <xml>, %p, 0) returned %p\n", PHPFUNC, pool->pool, pl_volume->volume, volume);
-    if (volume == NULL)
-        RETURN_FALSE;
-
-    res_volume = (php_libvirt_volume *)emalloc(sizeof(php_libvirt_volume));
-    res_volume->volume = volume;
-    res_volume->conn   = pool->conn;
-
-    DPRINTF("%s: returning %p\n", PHPFUNC, res_volume->volume);
-    resource_change_counter(INT_RESOURCE_VOLUME, pool->conn->conn, res_volume->volume, 1 TSRMLS_CC);
-
-    VIRT_REGISTER_RESOURCE(res_volume, le_libvirt_volume);
-}
-
-/*
- * Function name:   libvirt_storagevolume_delete
- * Since version:   0.4.2
- * Description:     Function is used to delete to volume identified by it's resource
- * Arguments:       @res [resource]: libvirt storagevolume resource
- *                  @flags [int]: optional flags for the storage volume deletion for virStorageVolDelete()
- * Returns:         TRUE for success, FALSE on error
- */
-PHP_FUNCTION(libvirt_storagevolume_delete)
-{
-    php_libvirt_volume *volume = NULL;
-    zval *zvolume;
-    zend_long flags = 0;
-    int retval = 0;
-
-    GET_VOLUME_FROM_ARGS("r|l", &zvolume, &flags);
-
-    retval = virStorageVolDelete(volume->volume, flags);
-    DPRINTF("%s: virStorageVolDelete(%p, %d) returned %d\n", PHPFUNC, volume->volume, (int) flags, retval);
-    if (retval != 0) {
-        set_error_if_unset("Cannot delete storage volume" TSRMLS_CC);
-        RETURN_FALSE;
-    }
-
-    RETURN_TRUE;
-}
-
-/*
- * 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;
-    zend_long flags = 0;
-    zend_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;
-    zend_long flags = 0;
-    zend_long offset = 0;
-    zend_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);
-    VIRT_FETCH_RESOURCE(volume, php_libvirt_volume*, &zvolume, PHP_LIBVIRT_VOLUME_RES_NAME, le_libvirt_volume);
-    if ((volume == NULL) || (volume->volume == NULL))
-        RETURN_LONG(retval);
-    VIRT_FETCH_RESOURCE(stream, php_libvirt_stream*, &zstream, 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;
-    zend_long flags = 0;
-    zend_long offset = 0;
-    zend_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);
-    VIRT_FETCH_RESOURCE(volume, php_libvirt_volume*, &zvolume, PHP_LIBVIRT_VOLUME_RES_NAME, le_libvirt_volume);
-    if ((volume == NULL) || (volume->volume == NULL))
-        RETURN_LONG(retval);
-    VIRT_FETCH_RESOURCE(stream, php_libvirt_stream*, &zstream, 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
- * Arguments:       @res [resource]: libvirt storagepool resource
- * Returns:         storagepool UUID string
- */
-PHP_FUNCTION(libvirt_storagepool_get_uuid_string)
-{
-    php_libvirt_storagepool *pool = NULL;
-    zval *zpool;
-    char *uuid;
-    int retval;
-
-    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
-
-    uuid = (char *)emalloc(VIR_UUID_STRING_BUFLEN);
-    retval = virStoragePoolGetUUIDString(pool->pool, uuid);
-    DPRINTF("%s: virStoragePoolGetUUIDString(%p, %p) returned %d (%s)\n", PHPFUNC, pool->pool, uuid, retval, uuid);
-    if (retval != 0)
-        RETURN_FALSE;
-
-    VIRT_RETVAL_STRING(uuid);
-    efree(uuid);
-}
-
-/*
- * Function name:   libvirt_storagepool_get_name
- * Since version:   0.4.1(-1)
- * Description:     Function is used to get storage pool name from the storage pool resource
- * Arguments:       @res [resource]: libvirt storagepool resource
- * Returns:         storagepool name string
- */
-PHP_FUNCTION(libvirt_storagepool_get_name)
-{
-    php_libvirt_storagepool *pool = NULL;
-    zval *zpool;
-    const char *name = NULL;
-
-    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
-
-    name = virStoragePoolGetName(pool->pool);
-    DPRINTF("%s: virStoragePoolGetName(%p) returned %s\n", PHPFUNC, pool->pool, name);
-    if (name == NULL)
-        RETURN_FALSE;
-
-    VIRT_RETURN_STRING(name);
-}
-
-/*
- * Function name:   libvirt_storagepool_lookup_by_uuid_string
- * Since version:   0.4.1(-1)
- * Description:     Function is used to lookup for storage pool identified by UUID string
- * Arguments:       @res [resource]: libvirt connection resource
- *                  @uuid [string]: UUID string to look for storagepool
- * Returns:         libvirt storagepool resource
- */
-PHP_FUNCTION(libvirt_storagepool_lookup_by_uuid_string)
-{
-    php_libvirt_connection *conn = NULL;
-    zval *zconn;
-    char *uuid = NULL;
-    strsize_t uuid_len;
-    virStoragePoolPtr storage = NULL;
-    php_libvirt_storagepool *res_pool;
-
-    GET_CONNECTION_FROM_ARGS("rs", &zconn, &uuid, &uuid_len);
-
-    if ((uuid == NULL) || (uuid_len < 1))
-        RETURN_FALSE;
-
-    storage = virStoragePoolLookupByUUIDString(conn->conn, uuid);
-    DPRINTF("%s: virStoragePoolLookupByUUIDString(%p, %s) returned %p\n", PHPFUNC, conn->conn, uuid, storage);
-    if (storage == NULL)
-        RETURN_FALSE;
-
-    res_pool = (php_libvirt_storagepool *)emalloc(sizeof(php_libvirt_storagepool));
-    res_pool->pool = storage;
-    res_pool->conn = conn;
-
-    DPRINTF("%s: returning %p\n", PHPFUNC, res_pool->pool);
-    resource_change_counter(INT_RESOURCE_STORAGEPOOL, conn->conn, res_pool->pool, 1 TSRMLS_CC);
-
-    VIRT_REGISTER_RESOURCE(res_pool, le_libvirt_storagepool);
-}
-
-/*
- * Function name:   libvirt_storagepool_get_xml_desc
- * Since version:   0.4.1(-1), changed 0.4.2
- * Description:     Function is used to get the XML description for the storage pool identified by res
- * Arguments:       @res [resource]: libvirt storagepool resource
- *                  @xpath [string]: optional xPath expression string to get just this entry, can be NULL
- * Returns:         storagepool XML description string or result of xPath expression
- */
-PHP_FUNCTION(libvirt_storagepool_get_xml_desc)
-{
-    php_libvirt_storagepool *pool = NULL;
-    zval *zpool;
-    char *xml;
-    char *xpath = NULL;
-    char *tmp = NULL;
-    zend_long flags = 0;
-    strsize_t xpath_len;
-    int retval = -1;
-
-    GET_STORAGEPOOL_FROM_ARGS("r|s", &zpool, &xpath, &xpath_len, &flags);
-    if (xpath_len < 1)
-        xpath = NULL;
-
-    DPRINTF("%s: pool = %p, flags = %ld, xpath = %s\n", PHPFUNC, pool->pool, flags, xpath);
-
-    xml = virStoragePoolGetXMLDesc(pool->pool, flags);
-    if (xml == NULL) {
-        set_error_if_unset("Cannot get the XML description" TSRMLS_CC);
-        RETURN_FALSE;
-    }
-
-    tmp = get_string_from_xpath(xml, xpath, NULL, &retval);
-    if ((tmp == NULL) || (retval < 0)) {
-        VIRT_RETVAL_STRING(xml);
-    } else {
-        VIRT_RETVAL_STRING(tmp);
-    }
-
-    free(xml);
-    free(tmp);
-}
-
-/*
- * Function name:   libvirt_storagepool_define_xml
- * Since version:   0.4.1(-1)
- * Description:     Function is used to define the storage pool from XML string and return it's resource
- * Arguments:       @res [resource]: libvirt connection resource
- *                  @xml [string]: XML string definition of storagepool
- *                  @flags [int]: flags to define XML
- * Returns:         libvirt storagepool resource
- */
-PHP_FUNCTION(libvirt_storagepool_define_xml)
-{
-    php_libvirt_storagepool *res_pool = NULL;
-    php_libvirt_connection *conn = NULL;
-    zval *zconn;
-    virStoragePoolPtr pool = NULL;
-    char *xml;
-    strsize_t xml_len;
-    zend_long flags = 0;
-
-
-    GET_CONNECTION_FROM_ARGS("rs|l", &zconn, &xml, &xml_len, &flags);
-
-    pool = virStoragePoolDefineXML(conn->conn, xml, (unsigned int)flags);
-    DPRINTF("%s: virStoragePoolDefineXML(%p, <xml>) returned %p\n", PHPFUNC, conn->conn, pool);
-    if (pool == NULL)
-        RETURN_FALSE;
-
-    res_pool = (php_libvirt_storagepool *)emalloc(sizeof(php_libvirt_storagepool));
-    res_pool->pool = pool;
-    res_pool->conn = conn;
-
-    DPRINTF("%s: returning %p\n", PHPFUNC, res_pool->pool);
-    resource_change_counter(INT_RESOURCE_STORAGEPOOL, conn->conn, res_pool->pool, 1 TSRMLS_CC);
-
-    VIRT_REGISTER_RESOURCE(res_pool, le_libvirt_storagepool);
-}
-
-/*
- * Function name:   libvirt_storagepool_undefine
- * Since version:   0.4.1(-1)
- * Description:     Function is used to undefine the storage pool identified by it's resource
- * Arguments:       @res [resource]: libvirt storagepool resource
- * Returns:         TRUE if success, FALSE on error
- */
-PHP_FUNCTION(libvirt_storagepool_undefine)
-{
-    php_libvirt_storagepool *pool = NULL;
-    zval *zpool;
-    int retval = 0;
-
-    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
-
-    retval = virStoragePoolUndefine(pool->pool);
-    DPRINTF("%s: virStoragePoolUndefine(%p) returned %d\n", PHPFUNC, pool->pool, retval);
-    if (retval != 0)
-        RETURN_FALSE;
-
-    RETURN_TRUE;
-}
-
-/*
- * Function name:   libvirt_storagepool_create
- * Since version:   0.4.1(-1)
- * Description:     Function is used to create/start the storage pool
- * Arguments:       @res [resource]: libvirt storagepool resource
- * Returns:         TRUE if success, FALSE on error
- */
-PHP_FUNCTION(libvirt_storagepool_create)
-{
-    php_libvirt_storagepool *pool = NULL;
-    zval *zpool;
-    int retval;
-
-    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
-
-    retval = virStoragePoolCreate(pool->pool, 0);
-    DPRINTF("%s: virStoragePoolCreate(%p, 0) returned %d\n", PHPFUNC, pool->pool, retval);
-    if (retval != 0)
-        RETURN_FALSE;
-    RETURN_TRUE;
-}
-
-/*
- * Function name:   libvirt_storagepool_destroy
- * Since version:   0.4.1(-1)
- * Description:     Function is used to destory the storage pool
- * Arguments:       @res [resource]: libvirt storagepool resource
- * Returns:         TRUE if success, FALSE on error
- */
-PHP_FUNCTION(libvirt_storagepool_destroy)
-{
-    php_libvirt_storagepool *pool = NULL;
-    zval *zpool;
-    int retval;
-
-    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
-
-    retval = virStoragePoolDestroy(pool->pool);
-    DPRINTF("%s: virStoragePoolDestroy(%p) returned %d\n", PHPFUNC, pool->pool, retval);
-    if (retval != 0)
-        RETURN_FALSE;
-    RETURN_TRUE;
-}
-
-/*
- * Function name:   libvirt_storagepool_is_active
- * Since version:   0.4.1(-1)
- * Description:     Function is used to get information whether storage pool is active or not
- * Arguments:       @res [resource]: libvirt storagepool resource
- * Returns:         result of virStoragePoolIsActive
- */
-PHP_FUNCTION(libvirt_storagepool_is_active)
-{
-    php_libvirt_storagepool *pool = NULL;
-    zval *zpool;
-
-    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
-
-    RETURN_LONG(virStoragePoolIsActive(pool->pool));
-}
-
-/*
- * Function name:   libvirt_storagepool_get_volume_count
- * Since version:   0.4.1(-1)
- * Description:     Function is used to get storage volume count in the storage pool
- * Arguments:           @res [resource]: libvirt storagepool resource
- * Returns:             number of volumes in the pool
- */
-PHP_FUNCTION(libvirt_storagepool_get_volume_count)
-{
-    php_libvirt_storagepool *pool = NULL;
-    zval *zpool;
-
-    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
-
-    RETURN_LONG(virStoragePoolNumOfVolumes(pool->pool));
-}
-
-/*
- * Function name:   libvirt_storagepool_refresh
- * Since version:   0.4.1(-1)
- * Description:     Function is used to refresh the storage pool information
- * Arguments:       @res [resource]: libvirt storagepool resource
- *                  @flags [int]: refresh flags
- * Returns:         TRUE if success, FALSE on error
- */
-PHP_FUNCTION(libvirt_storagepool_refresh)
-{
-    php_libvirt_storagepool *pool = NULL;
-    zval *zpool;
-    zend_long flags = 0;
-    int retval;
-
-    GET_STORAGEPOOL_FROM_ARGS("r|l", &zpool, &flags);
-
-    retval = virStoragePoolRefresh(pool->pool, flags);
-    DPRINTF("%s: virStoragePoolRefresh(%p, %ld) returned %d\n", PHPFUNC, pool->pool, flags, retval);
-    if (retval < 0)
-        RETURN_FALSE;
-    RETURN_TRUE;
-}
-
-/*
- * Function name:   libvirt_storagepool_set_autostart
- * Since version:   0.4.1(-1)
- * Description:     Function is used to set autostart of the storage pool
- * Arguments:       @res [resource]: libvirt storagepool resource
- *                  @flags [int]: flags to set autostart
- * Returns:         result on setting storagepool autostart value
- */
-PHP_FUNCTION(libvirt_storagepool_set_autostart)
-{
-    php_libvirt_storagepool *pool = NULL;
-    zval *zpool;
-    zend_bool flags = 0;
-    int retval;
-
-    GET_STORAGEPOOL_FROM_ARGS("rb", &zpool, &flags);
-
-    retval = virStoragePoolSetAutostart(pool->pool, flags);
-    DPRINTF("%s: virStoragePoolSetAutostart(%p, %d) returned %d\n", PHPFUNC, pool->pool, flags, retval);
-    if (retval != 0)
-        RETURN_FALSE;
-    RETURN_TRUE;
-}
-
-/*
- * Function name:   libvirt_storagepool_get_autostart
- * Since version:   0.4.1(-1)
- * Description:     Function is used to get autostart of the storage pool
- * Arguments:       @res [resource]: libvirt storagepool resource
- * Returns:         TRUE for autostart enabled, FALSE for autostart disabled, FALSE with last_error set for error
- */
-PHP_FUNCTION(libvirt_storagepool_get_autostart)
-{
-    php_libvirt_storagepool *pool = NULL;
-    zval *zpool;
-    int autostart;
-
-    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
-
-    if (virStoragePoolGetAutostart(pool->pool, &autostart) == 0 &&
-        autostart != 0)
-        RETURN_TRUE;
-
-    RETURN_FALSE;
-}
-
-/*
- * Function name:   libvirt_storagepool_build
- * Since version:   0.4.2
- * Description:     Function is used to Build the underlying storage pool, e.g. create the destination directory for NFS
- * Arguments:       @res [resource]: libvirt storagepool resource
- * Returns:         TRUE if success, FALSE on error
- */
-PHP_FUNCTION(libvirt_storagepool_build)
-{
-    php_libvirt_storagepool *pool = NULL;
-    zval *zpool;
-    int flags = 0;
-    int retval;
-
-    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
-
-    retval = virStoragePoolBuild(pool->pool, flags);
-    DPRINTF("%s: virStoragePoolBuild(%p, %d) returned %d\n", PHPFUNC, pool->pool, flags, retval);
-    if (retval == 0)
-        RETURN_TRUE;
-
-    RETURN_FALSE;
-}
-
-/*
- * Function name:   libvirt_storagepool_delete
- * Since version:   0.4.6
- * Description:     Function is used to Delete the underlying storage pool, e.g. remove the destination directory for NFS
- * Arguments:       @res [resource]: libvirt storagepool resource
- * Returns:         TRUE if success, FALSE on error
- */
-PHP_FUNCTION(libvirt_storagepool_delete)
-{
-    php_libvirt_storagepool *pool = NULL;
-    zval *zpool;
-    int flags = 0;
-    int retval;
-
-    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
-
-    retval = virStoragePoolDelete(pool->pool, flags);
-    DPRINTF("%s: virStoragePoolDelete(%p, %d) returned %d\n", PHPFUNC, pool->pool, flags, retval);
-    if (retval == 0)
-        RETURN_TRUE;
-
-    RETURN_FALSE;
-}
-
 /* Listing functions */
 /*
- * Function name:   libvirt_list_storagepools
- * Since version:   0.4.1(-1)
- * Description:     Function is used to list storage pools on the connection
- * Arguments:       @res [resource]: libvirt connection resource
- * Returns:         libvirt storagepool names array for the connection
- */
-PHP_FUNCTION(libvirt_list_storagepools)
-{
-    php_libvirt_connection *conn = NULL;
-    zval *zconn;
-    int count = -1;
-    int expectedcount = -1;
-    char **names;
-    int i;
-
-    GET_CONNECTION_FROM_ARGS("r", &zconn);
-
-    if ((expectedcount = virConnectNumOfStoragePools(conn->conn)) < 0)
-        RETURN_FALSE;
-
-    names = (char **)emalloc(expectedcount*sizeof(char *));
-    count = virConnectListStoragePools(conn->conn, names, expectedcount);
-
-    if ((count != expectedcount) || (count < 0)) {
-        efree(names);
-        RETURN_FALSE;
-    }
-
-    array_init(return_value);
-    for (i = 0; i < count; i++) {
-        VIRT_ADD_NEXT_INDEX_STRING(return_value,  names[i]);
-        free(names[i]);
-    }
-    efree(names);
-
-
-    if ((expectedcount = virConnectNumOfDefinedStoragePools(conn->conn)) < 0)
-        RETURN_FALSE;
-    names = (char **)emalloc(expectedcount * sizeof(char *));
-    count = virConnectListDefinedStoragePools(conn->conn, names, expectedcount);
-    if ((count != expectedcount) || (count < 0)) {
-        efree(names);
-        RETURN_FALSE;
-    }
-
-    for (i = 0; i < count; i++) {
-        VIRT_ADD_NEXT_INDEX_STRING(return_value, names[i]);
-        free(names[i]);
-    }
-    efree(names);
-}
-
-/*
- * Function name:   libvirt_list_active_storagepools
- * Since version:   0.4.1(-1)
- * Description:     Function is used to list active storage pools on the connection
- * Arguments:       @res [resource]: libvirt connection resource
- * Returns:         libvirt storagepool names array for the connection
- */
-PHP_FUNCTION(libvirt_list_active_storagepools)
-{
-    php_libvirt_connection *conn = NULL;
-    zval *zconn;
-    int count = -1;
-    int expectedcount = -1;
-    char **names;
-    int i;
-
-    GET_CONNECTION_FROM_ARGS("r", &zconn);
-
-    if ((expectedcount = virConnectNumOfStoragePools(conn->conn)) < 0)
-        RETURN_FALSE;
-
-    names = (char **)emalloc(expectedcount*sizeof(char *));
-    count = virConnectListStoragePools(conn->conn, names, expectedcount);
-
-    if ((count != expectedcount) || (count < 0)) {
-        efree(names);
-        RETURN_FALSE;
-    }
-    array_init(return_value);
-    for (i = 0; i < count; i++) {
-        VIRT_ADD_NEXT_INDEX_STRING(return_value,  names[i]);
-        free(names[i]);
-    }
-    efree(names);
-}
-
-/*
- * Function name:   libvirt_list_inactive_storagepools
- * Since version:   0.4.1(-1)
- * Description:     Function is used to list inactive storage pools on the connection
- * Arguments:       @res [resource]: libvirt connection resource
- * Returns:         libvirt storagepool names array for the connection
- */
-PHP_FUNCTION(libvirt_list_inactive_storagepools)
-{
-    php_libvirt_connection *conn = NULL;
-    zval *zconn;
-    int count = -1;
-    int expectedcount = -1;
-    char **names;
-    int i;
-
-    GET_CONNECTION_FROM_ARGS("r", &zconn);
-
-    if ((expectedcount = virConnectNumOfDefinedStoragePools(conn->conn)) < 0)
-        RETURN_FALSE;
-
-    names = (char **)emalloc(expectedcount * sizeof(char *));
-    count = virConnectListDefinedStoragePools(conn->conn, names, expectedcount);
-    if ((count != expectedcount) || (count < 0)) {
-        efree(names);
-        RETURN_FALSE;
-    }
-
-    array_init(return_value);
-    for (i = 0; i < count; i++) {
-        VIRT_ADD_NEXT_INDEX_STRING(return_value, names[i]);
-        free(names[i]);
-    }
-    efree(names);
-}
-
-/*
  * Function name:   libvirt_list_nodedevs
  * Since version:   0.4.1(-1)
  * Description:     Function is used to list node devices on the connection
diff --git a/src/libvirt-php.h b/src/libvirt-php.h
index 7670582..1505878 100644
--- a/src/libvirt-php.h
+++ b/src/libvirt-php.h
@@ -129,8 +129,6 @@ typedef uint64_t arch_uint;
 
 /* Internal resource identifier objects */
 #define INT_RESOURCE_NODEDEV        0x08
-#define INT_RESOURCE_STORAGEPOOL    0x10
-#define INT_RESOURCE_VOLUME         0x20
 #define INT_RESOURCE_SNAPSHOT       0x40
 #define INT_RESOURCE_NWFILTER       0x60
 
@@ -176,16 +174,6 @@ typedef struct _php_libvirt_nodedev {
     php_libvirt_connection* conn;
 } php_libvirt_nodedev;
 
-typedef struct _php_libvirt_storagepool {
-    virStoragePoolPtr pool;
-    php_libvirt_connection* conn;
-} php_libvirt_storagepool;
-
-typedef struct _php_libvirt_volume {
-    virStorageVolPtr volume;
-    php_libvirt_connection* conn;
-} php_libvirt_volume;
-
 typedef struct _php_libvirt_nwfilter {
     virNWFilterPtr nwfilter;
     php_libvirt_connection* conn;
@@ -243,8 +231,6 @@ const char *get_feature_binary(const char *name);
 long get_next_free_numeric_value(virDomainPtr domain, char *xpath);
 int get_subnet_bits(char *ip);
 
-#define PHP_LIBVIRT_STORAGEPOOL_RES_NAME "Libvirt storagepool"
-#define PHP_LIBVIRT_VOLUME_RES_NAME "Libvirt volume"
 #define PHP_LIBVIRT_NODEDEV_RES_NAME "Libvirt node device"
 #define PHP_LIBVIRT_SNAPSHOT_RES_NAME "Libvirt domain snapshot"
 #define PHP_LIBVIRT_NWFILTER_RES_NAME "Libvirt nwfilter"
@@ -264,38 +250,6 @@ PHP_FUNCTION(libvirt_domain_snapshot_lookup_by_name);
 PHP_FUNCTION(libvirt_domain_snapshot_get_xml);
 PHP_FUNCTION(libvirt_domain_snapshot_revert);
 PHP_FUNCTION(libvirt_domain_snapshot_delete);
-/* Storage pool and storage volume functions */
-PHP_FUNCTION(libvirt_storagepool_lookup_by_name);
-PHP_FUNCTION(libvirt_storagepool_lookup_by_volume);
-PHP_FUNCTION(libvirt_storagepool_list_volumes);
-PHP_FUNCTION(libvirt_storagepool_get_info);
-PHP_FUNCTION(libvirt_storagevolume_lookup_by_name);
-PHP_FUNCTION(libvirt_storagevolume_lookup_by_path);
-PHP_FUNCTION(libvirt_storagevolume_get_name);
-PHP_FUNCTION(libvirt_storagevolume_get_path);
-PHP_FUNCTION(libvirt_storagevolume_get_info);
-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);
-PHP_FUNCTION(libvirt_storagepool_get_xml_desc);
-PHP_FUNCTION(libvirt_storagepool_define_xml);
-PHP_FUNCTION(libvirt_storagepool_undefine);
-PHP_FUNCTION(libvirt_storagepool_create);
-PHP_FUNCTION(libvirt_storagepool_destroy);
-PHP_FUNCTION(libvirt_storagepool_is_active);
-PHP_FUNCTION(libvirt_storagepool_get_volume_count);
-PHP_FUNCTION(libvirt_storagepool_refresh);
-PHP_FUNCTION(libvirt_storagepool_set_autostart);
-PHP_FUNCTION(libvirt_storagepool_get_autostart);
-PHP_FUNCTION(libvirt_storagepool_build);
-PHP_FUNCTION(libvirt_storagepool_delete);
 /* Nodedev functions */
 PHP_FUNCTION(libvirt_nodedev_get);
 PHP_FUNCTION(libvirt_nodedev_capabilities);
@@ -316,9 +270,6 @@ PHP_FUNCTION(libvirt_list_nodedevs);
 PHP_FUNCTION(libvirt_list_all_nwfilters);
 PHP_FUNCTION(libvirt_list_nwfilters);
 PHP_FUNCTION(libvirt_list_domain_snapshots);
-PHP_FUNCTION(libvirt_list_storagepools);
-PHP_FUNCTION(libvirt_list_active_storagepools);
-PHP_FUNCTION(libvirt_list_inactive_storagepools);
 /* Common functions */
 PHP_FUNCTION(libvirt_version);
 PHP_FUNCTION(libvirt_check_version);
diff --git a/src/libvirt-storage.c b/src/libvirt-storage.c
new file mode 100644
index 0000000..b620902
--- /dev/null
+++ b/src/libvirt-storage.c
@@ -0,0 +1,1129 @@
+/*
+ * libvirt-storage.c: The PHP bindings to libvirt storage API
+ *
+ * See COPYING for the license of this software
+ */
+
+#include <libvirt/libvirt.h>
+
+#include "libvirt-storage.h"
+#include "libvirt-stream.h"
+
+DEBUG_INIT("storage");
+
+void
+php_libvirt_storagepool_dtor(virt_resource *rsrc TSRMLS_DC)
+{
+    php_libvirt_storagepool *pool = (php_libvirt_storagepool *)rsrc->ptr;
+    int rv = 0;
+
+    if (pool != NULL) {
+        if (pool->pool != NULL) {
+            if (!check_resource_allocation(NULL, INT_RESOURCE_STORAGEPOOL, pool->pool TSRMLS_CC)) {
+                pool->pool = NULL;
+                efree(pool);
+                return;
+            }
+            rv = virStoragePoolFree(pool->pool);
+            if (rv != 0) {
+                DPRINTF("%s: virStoragePoolFree(%p) returned %d (%s)\n", __FUNCTION__, pool->pool, rv, LIBVIRT_G(last_error));
+                php_error_docref(NULL TSRMLS_CC, E_WARNING, "virStoragePoolFree failed with %i on destructor: %s", rv, LIBVIRT_G(last_error));
+            } else {
+                DPRINTF("%s: virStoragePoolFree(%p) completed successfully\n", __FUNCTION__, pool->pool);
+                resource_change_counter(INT_RESOURCE_STORAGEPOOL, NULL, pool->pool, 0 TSRMLS_CC);
+            }
+            pool->pool = NULL;
+        }
+        efree(pool);
+    }
+}
+
+void
+php_libvirt_volume_dtor(virt_resource *rsrc TSRMLS_DC)
+{
+    php_libvirt_volume *volume = (php_libvirt_volume *)rsrc->ptr;
+    int rv = 0;
+
+    if (volume != NULL) {
+        if (volume->volume != NULL) {
+            if (!check_resource_allocation(NULL, INT_RESOURCE_VOLUME, volume->volume TSRMLS_CC)) {
+                volume->volume = NULL;
+                efree(volume);
+                return;
+            }
+            rv = virStorageVolFree(volume->volume);
+            if (rv != 0) {
+                DPRINTF("%s: virStorageVolFree(%p) returned %d (%s)\n", __FUNCTION__, volume->volume, rv, LIBVIRT_G(last_error));
+                php_error_docref(NULL TSRMLS_CC, E_WARNING, "virStorageVolFree failed with %i on destructor: %s", rv, LIBVIRT_G(last_error));
+            } else {
+                DPRINTF("%s: virStorageVolFree(%p) completed successfully\n", __FUNCTION__, volume->volume);
+                resource_change_counter(INT_RESOURCE_VOLUME, NULL, volume->volume, 0 TSRMLS_CC);
+            }
+            volume->volume = NULL;
+        }
+        efree(volume);
+    }
+}
+
+/*
+ * Function name:   libvirt_storagepool_lookup_by_name
+ * Since version:   0.4.1(-1)
+ * Description:     Function is used to lookup for storage pool by it's name
+ * Arguments:       @res [resource]: libvirt connection resource
+ *                  @name [string]: storage pool name
+ * Returns:         libvirt storagepool resource
+ */
+PHP_FUNCTION(libvirt_storagepool_lookup_by_name)
+{
+    php_libvirt_connection *conn = NULL;
+    zval *zconn;
+    strsize_t name_len;
+    char *name = NULL;
+    virStoragePoolPtr pool = NULL;
+    php_libvirt_storagepool *res_pool;
+
+    GET_CONNECTION_FROM_ARGS("rs", &zconn, &name, &name_len);
+
+    if ((name == NULL) || (name_len < 1))
+        RETURN_FALSE;
+    pool = virStoragePoolLookupByName(conn->conn, name);
+    DPRINTF("%s: virStoragePoolLookupByName(%p, %s) returned %p\n", PHPFUNC, conn->conn, name, pool);
+    if (pool == NULL)
+        RETURN_FALSE;
+
+    res_pool = (php_libvirt_storagepool *)emalloc(sizeof(php_libvirt_storagepool));
+    res_pool->pool = pool;
+    res_pool->conn = conn;
+
+    DPRINTF("%s: returning %p\n", PHPFUNC, res_pool->pool);
+    resource_change_counter(INT_RESOURCE_STORAGEPOOL, conn->conn, res_pool->pool, 1 TSRMLS_CC);
+
+    VIRT_REGISTER_RESOURCE(res_pool, le_libvirt_storagepool);
+}
+
+/*
+ * Function name:   libvirt_storagepool_lookup_by_volume
+ * Since version:   0.4.1(-1)
+ * Description:     Function is used to lookup for storage pool by a volume
+ * Arguments:       @res [volume]: volume resource of storage pool
+ * Returns:         libvirt storagepool resource
+ */
+PHP_FUNCTION(libvirt_storagepool_lookup_by_volume)
+{
+    php_libvirt_volume *volume;
+    zval *zvolume;
+    virStoragePoolPtr pool = NULL;
+    php_libvirt_storagepool *res_pool;
+
+    GET_VOLUME_FROM_ARGS("r", &zvolume);
+
+    pool = virStoragePoolLookupByVolume(volume->volume);
+    DPRINTF("%s: virStoragePoolLookupByVolume(%p) returned %p\n", PHPFUNC, volume->volume, pool);
+    if (pool == NULL)
+        RETURN_FALSE;
+
+    res_pool = (php_libvirt_storagepool *)emalloc(sizeof(php_libvirt_storagepool));
+    res_pool->pool = pool;
+    res_pool->conn = volume->conn;
+
+    DPRINTF("%s: returning %p\n", PHPFUNC, res_pool->pool);
+    resource_change_counter(INT_RESOURCE_STORAGEPOOL, res_pool->conn->conn, res_pool->pool, 1 TSRMLS_CC);
+
+    VIRT_REGISTER_RESOURCE(res_pool, le_libvirt_storagepool);
+}
+
+/*
+ * Function name:   libvirt_storagepool_list_volumes
+ * Since version:   0.4.1(-1)
+ * Description:     Function is used to list volumes in the specified storage pool
+ * Arguments:       @res [resource]: libvirt storagepool resource
+ * Returns:         list of storage volume names in the storage pool in an array using default keys (indexes)
+ */
+PHP_FUNCTION(libvirt_storagepool_list_volumes)
+{
+    php_libvirt_storagepool *pool = NULL;
+    zval *zpool;
+    char **names = NULL;
+    int expectedcount = -1;
+    int i;
+    int count = -1;
+
+    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
+
+    if ((expectedcount = virStoragePoolNumOfVolumes(pool->pool)) < 0)
+        RETURN_FALSE;
+
+    DPRINTF("%s: virStoragePoolNumOfVolumes(%p) returned %d\n", PHPFUNC, pool->pool, expectedcount);
+    names = (char **)emalloc(expectedcount*sizeof(char *));
+
+    count = virStoragePoolListVolumes(pool->pool, names, expectedcount);
+    DPRINTF("%s: virStoragePoolListVolumes(%p, %p, %d) returned %d\n", PHPFUNC, pool->pool, names, expectedcount, count);
+    array_init(return_value);
+
+    if ((count != expectedcount) || (count < 0))
+        RETURN_FALSE;
+    for (i = 0; i < count; i++) {
+        VIRT_ADD_NEXT_INDEX_STRING(return_value,  names[i]);
+        free(names[i]);
+    }
+
+    efree(names);
+}
+
+/*
+ * Function name:   libvirt_storagepool_get_info
+ * Since version:   0.4.1(-1)
+ * Description:     Function is used to get information about the storage pool
+ * Arguments:       @res [resource]: libvirt storagepool resource
+ * Returns:         storage pool information array of state, capacity, allocation and available space
+ */
+PHP_FUNCTION(libvirt_storagepool_get_info)
+{
+    php_libvirt_storagepool *pool = NULL;
+    zval *zpool;
+    virStoragePoolInfo poolInfo;
+    int retval;
+
+    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
+
+    retval = virStoragePoolGetInfo(pool->pool, &poolInfo);
+    DPRINTF("%s: virStoragePoolGetInfo(%p, <info>) returned %d\n", PHPFUNC, pool->pool, retval);
+    if (retval != 0)
+        RETURN_FALSE;
+
+    array_init(return_value);
+
+    // @todo: fix the long long returns
+    LONGLONG_INIT;
+    add_assoc_long(return_value, "state", (long)poolInfo.state);
+    LONGLONG_ASSOC(return_value, "capacity", poolInfo.capacity);
+    LONGLONG_ASSOC(return_value, "allocation", poolInfo.allocation);
+    LONGLONG_ASSOC(return_value, "available", poolInfo.available);
+}
+
+/*
+ * Function name:   libvirt_storagepool_get_uuid_string
+ * Since version:   0.4.1(-1)
+ * Description:     Function is used to get storage pool by UUID string
+ * Arguments:       @res [resource]: libvirt storagepool resource
+ * Returns:         storagepool UUID string
+ */
+PHP_FUNCTION(libvirt_storagepool_get_uuid_string)
+{
+    php_libvirt_storagepool *pool = NULL;
+    zval *zpool;
+    char *uuid;
+    int retval;
+
+    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
+
+    uuid = (char *)emalloc(VIR_UUID_STRING_BUFLEN);
+    retval = virStoragePoolGetUUIDString(pool->pool, uuid);
+    DPRINTF("%s: virStoragePoolGetUUIDString(%p, %p) returned %d (%s)\n", PHPFUNC, pool->pool, uuid, retval, uuid);
+    if (retval != 0)
+        RETURN_FALSE;
+
+    VIRT_RETVAL_STRING(uuid);
+    efree(uuid);
+}
+
+/*
+ * Function name:   libvirt_storagepool_get_name
+ * Since version:   0.4.1(-1)
+ * Description:     Function is used to get storage pool name from the storage pool resource
+ * Arguments:       @res [resource]: libvirt storagepool resource
+ * Returns:         storagepool name string
+ */
+PHP_FUNCTION(libvirt_storagepool_get_name)
+{
+    php_libvirt_storagepool *pool = NULL;
+    zval *zpool;
+    const char *name = NULL;
+
+    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
+
+    name = virStoragePoolGetName(pool->pool);
+    DPRINTF("%s: virStoragePoolGetName(%p) returned %s\n", PHPFUNC, pool->pool, name);
+    if (name == NULL)
+        RETURN_FALSE;
+
+    VIRT_RETURN_STRING(name);
+}
+
+/*
+ * Function name:   libvirt_storagepool_lookup_by_uuid_string
+ * Since version:   0.4.1(-1)
+ * Description:     Function is used to lookup for storage pool identified by UUID string
+ * Arguments:       @res [resource]: libvirt connection resource
+ *                  @uuid [string]: UUID string to look for storagepool
+ * Returns:         libvirt storagepool resource
+ */
+PHP_FUNCTION(libvirt_storagepool_lookup_by_uuid_string)
+{
+    php_libvirt_connection *conn = NULL;
+    zval *zconn;
+    char *uuid = NULL;
+    strsize_t uuid_len;
+    virStoragePoolPtr storage = NULL;
+    php_libvirt_storagepool *res_pool;
+
+    GET_CONNECTION_FROM_ARGS("rs", &zconn, &uuid, &uuid_len);
+
+    if ((uuid == NULL) || (uuid_len < 1))
+        RETURN_FALSE;
+
+    storage = virStoragePoolLookupByUUIDString(conn->conn, uuid);
+    DPRINTF("%s: virStoragePoolLookupByUUIDString(%p, %s) returned %p\n", PHPFUNC, conn->conn, uuid, storage);
+    if (storage == NULL)
+        RETURN_FALSE;
+
+    res_pool = (php_libvirt_storagepool *)emalloc(sizeof(php_libvirt_storagepool));
+    res_pool->pool = storage;
+    res_pool->conn = conn;
+
+    DPRINTF("%s: returning %p\n", PHPFUNC, res_pool->pool);
+    resource_change_counter(INT_RESOURCE_STORAGEPOOL, conn->conn, res_pool->pool, 1 TSRMLS_CC);
+
+    VIRT_REGISTER_RESOURCE(res_pool, le_libvirt_storagepool);
+}
+
+/*
+ * Function name:   libvirt_storagepool_get_xml_desc
+ * Since version:   0.4.1(-1), changed 0.4.2
+ * Description:     Function is used to get the XML description for the storage pool identified by res
+ * Arguments:       @res [resource]: libvirt storagepool resource
+ *                  @xpath [string]: optional xPath expression string to get just this entry, can be NULL
+ * Returns:         storagepool XML description string or result of xPath expression
+ */
+PHP_FUNCTION(libvirt_storagepool_get_xml_desc)
+{
+    php_libvirt_storagepool *pool = NULL;
+    zval *zpool;
+    char *xml;
+    char *xpath = NULL;
+    char *tmp = NULL;
+    zend_long flags = 0;
+    strsize_t xpath_len;
+    int retval = -1;
+
+    GET_STORAGEPOOL_FROM_ARGS("r|s", &zpool, &xpath, &xpath_len, &flags);
+    if (xpath_len < 1)
+        xpath = NULL;
+
+    DPRINTF("%s: pool = %p, flags = %ld, xpath = %s\n", PHPFUNC, pool->pool, flags, xpath);
+
+    xml = virStoragePoolGetXMLDesc(pool->pool, flags);
+    if (xml == NULL) {
+        set_error_if_unset("Cannot get the XML description" TSRMLS_CC);
+        RETURN_FALSE;
+    }
+
+    tmp = get_string_from_xpath(xml, xpath, NULL, &retval);
+    if ((tmp == NULL) || (retval < 0)) {
+        VIRT_RETVAL_STRING(xml);
+    } else {
+        VIRT_RETVAL_STRING(tmp);
+    }
+
+    free(xml);
+    free(tmp);
+}
+
+/*
+ * Function name:   libvirt_storagepool_define_xml
+ * Since version:   0.4.1(-1)
+ * Description:     Function is used to define the storage pool from XML string and return it's resource
+ * Arguments:       @res [resource]: libvirt connection resource
+ *                  @xml [string]: XML string definition of storagepool
+ *                  @flags [int]: flags to define XML
+ * Returns:         libvirt storagepool resource
+ */
+PHP_FUNCTION(libvirt_storagepool_define_xml)
+{
+    php_libvirt_storagepool *res_pool = NULL;
+    php_libvirt_connection *conn = NULL;
+    zval *zconn;
+    virStoragePoolPtr pool = NULL;
+    char *xml;
+    strsize_t xml_len;
+    zend_long flags = 0;
+
+
+    GET_CONNECTION_FROM_ARGS("rs|l", &zconn, &xml, &xml_len, &flags);
+
+    pool = virStoragePoolDefineXML(conn->conn, xml, (unsigned int)flags);
+    DPRINTF("%s: virStoragePoolDefineXML(%p, <xml>) returned %p\n", PHPFUNC, conn->conn, pool);
+    if (pool == NULL)
+        RETURN_FALSE;
+
+    res_pool = (php_libvirt_storagepool *)emalloc(sizeof(php_libvirt_storagepool));
+    res_pool->pool = pool;
+    res_pool->conn = conn;
+
+    DPRINTF("%s: returning %p\n", PHPFUNC, res_pool->pool);
+    resource_change_counter(INT_RESOURCE_STORAGEPOOL, conn->conn, res_pool->pool, 1 TSRMLS_CC);
+
+    VIRT_REGISTER_RESOURCE(res_pool, le_libvirt_storagepool);
+}
+
+/*
+ * Function name:   libvirt_storagepool_undefine
+ * Since version:   0.4.1(-1)
+ * Description:     Function is used to undefine the storage pool identified by it's resource
+ * Arguments:       @res [resource]: libvirt storagepool resource
+ * Returns:         TRUE if success, FALSE on error
+ */
+PHP_FUNCTION(libvirt_storagepool_undefine)
+{
+    php_libvirt_storagepool *pool = NULL;
+    zval *zpool;
+    int retval = 0;
+
+    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
+
+    retval = virStoragePoolUndefine(pool->pool);
+    DPRINTF("%s: virStoragePoolUndefine(%p) returned %d\n", PHPFUNC, pool->pool, retval);
+    if (retval != 0)
+        RETURN_FALSE;
+
+    RETURN_TRUE;
+}
+
+/*
+ * Function name:   libvirt_storagepool_create
+ * Since version:   0.4.1(-1)
+ * Description:     Function is used to create/start the storage pool
+ * Arguments:       @res [resource]: libvirt storagepool resource
+ * Returns:         TRUE if success, FALSE on error
+ */
+PHP_FUNCTION(libvirt_storagepool_create)
+{
+    php_libvirt_storagepool *pool = NULL;
+    zval *zpool;
+    int retval;
+
+    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
+
+    retval = virStoragePoolCreate(pool->pool, 0);
+    DPRINTF("%s: virStoragePoolCreate(%p, 0) returned %d\n", PHPFUNC, pool->pool, retval);
+    if (retval != 0)
+        RETURN_FALSE;
+    RETURN_TRUE;
+}
+
+/*
+ * Function name:   libvirt_storagepool_destroy
+ * Since version:   0.4.1(-1)
+ * Description:     Function is used to destory the storage pool
+ * Arguments:       @res [resource]: libvirt storagepool resource
+ * Returns:         TRUE if success, FALSE on error
+ */
+PHP_FUNCTION(libvirt_storagepool_destroy)
+{
+    php_libvirt_storagepool *pool = NULL;
+    zval *zpool;
+    int retval;
+
+    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
+
+    retval = virStoragePoolDestroy(pool->pool);
+    DPRINTF("%s: virStoragePoolDestroy(%p) returned %d\n", PHPFUNC, pool->pool, retval);
+    if (retval != 0)
+        RETURN_FALSE;
+    RETURN_TRUE;
+}
+
+/*
+ * Function name:   libvirt_storagepool_is_active
+ * Since version:   0.4.1(-1)
+ * Description:     Function is used to get information whether storage pool is active or not
+ * Arguments:       @res [resource]: libvirt storagepool resource
+ * Returns:         result of virStoragePoolIsActive
+ */
+PHP_FUNCTION(libvirt_storagepool_is_active)
+{
+    php_libvirt_storagepool *pool = NULL;
+    zval *zpool;
+
+    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
+
+    RETURN_LONG(virStoragePoolIsActive(pool->pool));
+}
+
+/*
+ * Function name:   libvirt_storagepool_get_volume_count
+ * Since version:   0.4.1(-1)
+ * Description:     Function is used to get storage volume count in the storage pool
+ * Arguments:           @res [resource]: libvirt storagepool resource
+ * Returns:             number of volumes in the pool
+ */
+PHP_FUNCTION(libvirt_storagepool_get_volume_count)
+{
+    php_libvirt_storagepool *pool = NULL;
+    zval *zpool;
+
+    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
+
+    RETURN_LONG(virStoragePoolNumOfVolumes(pool->pool));
+}
+
+/*
+ * Function name:   libvirt_storagepool_refresh
+ * Since version:   0.4.1(-1)
+ * Description:     Function is used to refresh the storage pool information
+ * Arguments:       @res [resource]: libvirt storagepool resource
+ *                  @flags [int]: refresh flags
+ * Returns:         TRUE if success, FALSE on error
+ */
+PHP_FUNCTION(libvirt_storagepool_refresh)
+{
+    php_libvirt_storagepool *pool = NULL;
+    zval *zpool;
+    zend_long flags = 0;
+    int retval;
+
+    GET_STORAGEPOOL_FROM_ARGS("r|l", &zpool, &flags);
+
+    retval = virStoragePoolRefresh(pool->pool, flags);
+    DPRINTF("%s: virStoragePoolRefresh(%p, %ld) returned %d\n", PHPFUNC, pool->pool, flags, retval);
+    if (retval < 0)
+        RETURN_FALSE;
+    RETURN_TRUE;
+}
+
+/*
+ * Function name:   libvirt_storagepool_set_autostart
+ * Since version:   0.4.1(-1)
+ * Description:     Function is used to set autostart of the storage pool
+ * Arguments:       @res [resource]: libvirt storagepool resource
+ *                  @flags [int]: flags to set autostart
+ * Returns:         result on setting storagepool autostart value
+ */
+PHP_FUNCTION(libvirt_storagepool_set_autostart)
+{
+    php_libvirt_storagepool *pool = NULL;
+    zval *zpool;
+    zend_bool flags = 0;
+    int retval;
+
+    GET_STORAGEPOOL_FROM_ARGS("rb", &zpool, &flags);
+
+    retval = virStoragePoolSetAutostart(pool->pool, flags);
+    DPRINTF("%s: virStoragePoolSetAutostart(%p, %d) returned %d\n", PHPFUNC, pool->pool, flags, retval);
+    if (retval != 0)
+        RETURN_FALSE;
+    RETURN_TRUE;
+}
+
+/*
+ * Function name:   libvirt_storagepool_get_autostart
+ * Since version:   0.4.1(-1)
+ * Description:     Function is used to get autostart of the storage pool
+ * Arguments:       @res [resource]: libvirt storagepool resource
+ * Returns:         TRUE for autostart enabled, FALSE for autostart disabled, FALSE with last_error set for error
+ */
+PHP_FUNCTION(libvirt_storagepool_get_autostart)
+{
+    php_libvirt_storagepool *pool = NULL;
+    zval *zpool;
+    int autostart;
+
+    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
+
+    if (virStoragePoolGetAutostart(pool->pool, &autostart) == 0 &&
+        autostart != 0)
+        RETURN_TRUE;
+
+    RETURN_FALSE;
+}
+
+/*
+ * Function name:   libvirt_storagepool_build
+ * Since version:   0.4.2
+ * Description:     Function is used to Build the underlying storage pool, e.g. create the destination directory for NFS
+ * Arguments:       @res [resource]: libvirt storagepool resource
+ * Returns:         TRUE if success, FALSE on error
+ */
+PHP_FUNCTION(libvirt_storagepool_build)
+{
+    php_libvirt_storagepool *pool = NULL;
+    zval *zpool;
+    int flags = 0;
+    int retval;
+
+    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
+
+    retval = virStoragePoolBuild(pool->pool, flags);
+    DPRINTF("%s: virStoragePoolBuild(%p, %d) returned %d\n", PHPFUNC, pool->pool, flags, retval);
+    if (retval == 0)
+        RETURN_TRUE;
+
+    RETURN_FALSE;
+}
+
+/*
+ * Function name:   libvirt_storagepool_delete
+ * Since version:   0.4.6
+ * Description:     Function is used to Delete the underlying storage pool, e.g. remove the destination directory for NFS
+ * Arguments:       @res [resource]: libvirt storagepool resource
+ * Returns:         TRUE if success, FALSE on error
+ */
+PHP_FUNCTION(libvirt_storagepool_delete)
+{
+    php_libvirt_storagepool *pool = NULL;
+    zval *zpool;
+    int flags = 0;
+    int retval;
+
+    GET_STORAGEPOOL_FROM_ARGS("r", &zpool);
+
+    retval = virStoragePoolDelete(pool->pool, flags);
+    DPRINTF("%s: virStoragePoolDelete(%p, %d) returned %d\n", PHPFUNC, pool->pool, flags, retval);
+    if (retval == 0)
+        RETURN_TRUE;
+
+    RETURN_FALSE;
+}
+
+/*
+ * Function name:   libvirt_storagevolume_lookup_by_name
+ * Since version:   0.4.1(-1)
+ * Description:     Function is used to lookup for storage volume by it's name
+ * Arguments:       @res [resource]: libvirt storagepool resource
+ *                  @name [string]: name of the storage volume to look for
+ * Returns:         libvirt storagevolume resource
+ */
+PHP_FUNCTION(libvirt_storagevolume_lookup_by_name)
+{
+    php_libvirt_storagepool *pool = NULL;
+    php_libvirt_volume *res_volume;
+    zval *zpool;
+    strsize_t name_len;
+    char *name = NULL;
+    virStorageVolPtr volume = NULL;
+
+    GET_STORAGEPOOL_FROM_ARGS("rs", &zpool, &name, &name_len);
+    if ((name == NULL) || (name_len < 1))
+        RETURN_FALSE;
+
+    volume = virStorageVolLookupByName(pool->pool, name);
+    DPRINTF("%s: virStorageVolLookupByName(%p, %s) returned %p\n", PHPFUNC, pool->pool, name, volume);
+    if (volume == NULL)
+        RETURN_FALSE;
+
+    res_volume = (php_libvirt_volume *)emalloc(sizeof(php_libvirt_volume));
+    res_volume->volume = volume;
+    res_volume->conn   = pool->conn;
+
+    DPRINTF("%s: returning %p\n", PHPFUNC, res_volume->volume);
+    resource_change_counter(INT_RESOURCE_VOLUME, pool->conn->conn, res_volume->volume, 1 TSRMLS_CC);
+
+    VIRT_REGISTER_RESOURCE(res_volume, le_libvirt_volume);
+}
+
+/*
+ * Function name:   libvirt_storagevolume_lookup_by_path
+ * Since version:   0.4.1(-2)
+ * Description:     Function is used to lookup for storage volume by it's path
+ * Arguments:       @res [resource]: libvirt connection resource
+ *                  @path [string]: path of the storage volume to look for
+ * Returns:         libvirt storagevolume resource
+ */
+PHP_FUNCTION(libvirt_storagevolume_lookup_by_path)
+{
+    php_libvirt_connection *conn = NULL;
+    php_libvirt_volume *res_volume;
+    zval *zconn;
+    strsize_t name_len;
+    char *name = NULL;
+    virStorageVolPtr volume = NULL;
+
+    GET_CONNECTION_FROM_ARGS("rs", &zconn, &name, &name_len);
+    if ((name == NULL) || (name_len < 1))
+        RETURN_FALSE;
+
+    volume = virStorageVolLookupByPath(conn->conn, name);
+    DPRINTF("%s: virStorageVolLookupByPath(%p, %s) returned %p\n", PHPFUNC, conn->conn, name, volume);
+    if (volume == NULL) {
+        set_error_if_unset("Cannot find storage volume on requested path" TSRMLS_CC);
+        RETURN_FALSE;
+    }
+
+    res_volume = (php_libvirt_volume *)emalloc(sizeof(php_libvirt_volume));
+    res_volume->volume = volume;
+    res_volume->conn   = conn;
+
+    DPRINTF("%s: returning %p\n", PHPFUNC, res_volume->volume);
+    resource_change_counter(INT_RESOURCE_VOLUME, conn->conn, res_volume->volume, 1 TSRMLS_CC);
+
+    VIRT_REGISTER_RESOURCE(res_volume, le_libvirt_volume);
+}
+
+/*
+ * Function name:   libvirt_storagevolume_get_name
+ * Since version:   0.4.1(-2)
+ * Description:     Function is used to get the storage volume name
+ * Arguments:       @res [resource]: libvirt storagevolume resource
+ * Returns:         storagevolume name
+ */
+PHP_FUNCTION(libvirt_storagevolume_get_name)
+{
+    php_libvirt_volume *volume = NULL;
+    zval *zvolume;
+    const char *retval;
+
+    GET_VOLUME_FROM_ARGS("r", &zvolume);
+
+    retval = virStorageVolGetName(volume->volume);
+    DPRINTF("%s: virStorageVolGetName(%p) returned %s\n", PHPFUNC, volume->volume, retval);
+    if (retval == NULL)
+        RETURN_FALSE;
+
+    VIRT_RETURN_STRING(retval);
+}
+
+/*
+ * Function name:   libvirt_storagevolume_get_path
+ * Since version:   0.4.1(-2)
+ * Description:     Function is used to get the  storage volume path
+ * Arguments:       @res [resource]: libvirt storagevolume resource
+ * Returns:         storagevolume path
+ */
+PHP_FUNCTION(libvirt_storagevolume_get_path)
+{
+    php_libvirt_volume *volume = NULL;
+    zval *zvolume;
+    char *retval;
+
+    GET_VOLUME_FROM_ARGS("r", &zvolume);
+
+    retval = virStorageVolGetPath(volume->volume);
+    DPRINTF("%s: virStorageVolGetPath(%p) returned %s\n", PHPFUNC, volume->volume, retval);
+    if (retval == NULL)
+        RETURN_FALSE;
+
+    VIRT_RETVAL_STRING(retval);
+    free(retval);
+}
+
+/*
+ * Function name:   libvirt_storagevolume_get_info
+ * Since version:   0.4.1(-1)
+ * Description:     Function is used to get the storage volume information
+ * Arguments:       @res [resource]: libvirt storagevolume resource
+ * Returns:         storage volume information array of type, allocation and capacity
+ */
+PHP_FUNCTION(libvirt_storagevolume_get_info)
+{
+    php_libvirt_volume *volume = NULL;
+    zval *zvolume;
+    virStorageVolInfo volumeInfo;
+    int retval;
+
+    GET_VOLUME_FROM_ARGS("r", &zvolume);
+
+    retval = virStorageVolGetInfo(volume->volume, &volumeInfo);
+    DPRINTF("%s: virStorageVolGetInfo(%p, <info>) returned %d\n", PHPFUNC, volume->volume, retval);
+    if (retval != 0)
+        RETURN_FALSE;
+
+    array_init(return_value);
+    LONGLONG_INIT;
+    add_assoc_long(return_value, "type", (long)volumeInfo.type);
+    LONGLONG_ASSOC(return_value, "capacity", volumeInfo.capacity);
+    LONGLONG_ASSOC(return_value, "allocation", volumeInfo.allocation);
+}
+
+/*
+ * Function name:   libvirt_storagevolume_get_xml_desc
+ * Since version:   0.4.1(-1), changed 0.4.2
+ * Description:     Function is used to get the storage volume XML description
+ * Arguments:       @res [resource]: libvirt storagevolume resource
+ *                  @xpath [string]: optional xPath expression string to get just this entry, can be NULL
+ *                  @flags [int]: optional flags
+ * Returns:         storagevolume XML description or result of xPath expression
+ */
+PHP_FUNCTION(libvirt_storagevolume_get_xml_desc)
+{
+    php_libvirt_volume *volume = NULL;
+    zval *zvolume;
+    char *tmp = NULL;
+    char *xml;
+    char *xpath = NULL;
+    strsize_t xpath_len;
+    zend_long flags = 0;
+    int retval = -1;
+
+    GET_VOLUME_FROM_ARGS("rs|l", &zvolume, &xpath, &xpath_len, &flags);
+    if (xpath_len < 1)
+        xpath = NULL;
+
+    DPRINTF("%s: volume = %p, xpath = %s, flags = %ld\n", PHPFUNC, volume->volume, xpath, flags);
+
+    xml = virStorageVolGetXMLDesc(volume->volume, flags);
+    if (xml == NULL) {
+        set_error_if_unset("Cannot get the XML description" TSRMLS_CC);
+        RETURN_FALSE;
+    }
+
+    tmp = get_string_from_xpath(xml, xpath, NULL, &retval);
+    if ((tmp == NULL) || (retval < 0)) {
+        VIRT_RETVAL_STRING(xml);
+    } else {
+        VIRT_RETVAL_STRING(tmp);
+    }
+
+    free(xml);
+    free(tmp);
+}
+
+/*
+ * Function name:   libvirt_storagevolume_create_xml
+ * Since version:   0.4.1(-1)
+ * Description:     Function is used to create the new storage pool and return the handle to new storage pool
+ * Arguments:       @res [resource]: libvirt storagepool resource
+ *                  @xml [string]: XML string to create the storage volume in the storage pool
+ *                  @flags [int]: virStorageVolCreateXML flags
+ * Returns:         libvirt storagevolume resource
+ */
+PHP_FUNCTION(libvirt_storagevolume_create_xml)
+{
+    php_libvirt_volume *res_volume = NULL;
+    php_libvirt_storagepool *pool = NULL;
+    zval *zpool;
+    virStorageVolPtr volume = NULL;
+    char *xml;
+    zend_long flags = 0;
+    strsize_t xml_len;
+
+    GET_STORAGEPOOL_FROM_ARGS("rs|l", &zpool, &xml, &xml_len, &flags);
+
+    volume = virStorageVolCreateXML(pool->pool, xml, flags);
+    DPRINTF("%s: virStorageVolCreateXML(%p, <xml>, 0) returned %p\n", PHPFUNC, pool->pool, volume);
+    if (volume == NULL)
+        RETURN_FALSE;
+
+    res_volume = (php_libvirt_volume *)emalloc(sizeof(php_libvirt_volume));
+    res_volume->volume = volume;
+    res_volume->conn   = pool->conn;
+
+    DPRINTF("%s: returning %p\n", PHPFUNC, res_volume->volume);
+    resource_change_counter(INT_RESOURCE_VOLUME, pool->conn->conn, res_volume->volume, 1 TSRMLS_CC);
+
+    VIRT_REGISTER_RESOURCE(res_volume, le_libvirt_volume);
+}
+
+/*
+ * Function name:   libvirt_storagevolume_create_xml_from
+ * Since version:   0.4.1(-2)
+ * Description:     Function is used to clone the new storage volume into pool from the orignial volume
+ * Arguments:       @pool [resource]: libvirt storagepool resource
+ *                  @xml [string]: XML string to create the storage volume in the storage pool
+ *                  @original_volume [resource]: libvirt storagevolume resource
+ * Returns:         libvirt storagevolume resource
+ */
+PHP_FUNCTION(libvirt_storagevolume_create_xml_from)
+{
+    php_libvirt_volume *res_volume = NULL;
+    php_libvirt_storagepool *pool = NULL;
+    zval *zpool;
+
+    php_libvirt_volume *pl_volume = NULL;
+    zval *zvolume;
+
+    virStorageVolPtr volume = NULL;
+    char *xml;
+    strsize_t xml_len;
+
+    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rsr", &zpool, &xml, &xml_len, &zvolume) == FAILURE) {
+        set_error("Invalid pool resource, XML or volume resouce" TSRMLS_CC);
+        RETURN_FALSE;
+    }
+
+    VIRT_FETCH_RESOURCE(pool, php_libvirt_storagepool*, &zpool, PHP_LIBVIRT_STORAGEPOOL_RES_NAME, le_libvirt_storagepool);
+    if ((pool == NULL) || (pool->pool == NULL))
+        RETURN_FALSE;
+    VIRT_FETCH_RESOURCE(pl_volume, php_libvirt_volume*, &zvolume, PHP_LIBVIRT_VOLUME_RES_NAME, le_libvirt_volume);
+    if ((pl_volume == NULL) || (pl_volume->volume == NULL))
+        RETURN_FALSE;
+    resource_change_counter(INT_RESOURCE_VOLUME, NULL, pl_volume->volume, 1 TSRMLS_CC);
+
+    volume = virStorageVolCreateXMLFrom(pool->pool, xml, pl_volume->volume, 0);
+    DPRINTF("%s: virStorageVolCreateXMLFrom(%p, <xml>, %p, 0) returned %p\n", PHPFUNC, pool->pool, pl_volume->volume, volume);
+    if (volume == NULL)
+        RETURN_FALSE;
+
+    res_volume = (php_libvirt_volume *)emalloc(sizeof(php_libvirt_volume));
+    res_volume->volume = volume;
+    res_volume->conn   = pool->conn;
+
+    DPRINTF("%s: returning %p\n", PHPFUNC, res_volume->volume);
+    resource_change_counter(INT_RESOURCE_VOLUME, pool->conn->conn, res_volume->volume, 1 TSRMLS_CC);
+
+    VIRT_REGISTER_RESOURCE(res_volume, le_libvirt_volume);
+}
+
+/*
+ * Function name:   libvirt_storagevolume_delete
+ * Since version:   0.4.2
+ * Description:     Function is used to delete to volume identified by it's resource
+ * Arguments:       @res [resource]: libvirt storagevolume resource
+ *                  @flags [int]: optional flags for the storage volume deletion for virStorageVolDelete()
+ * Returns:         TRUE for success, FALSE on error
+ */
+PHP_FUNCTION(libvirt_storagevolume_delete)
+{
+    php_libvirt_volume *volume = NULL;
+    zval *zvolume;
+    zend_long flags = 0;
+    int retval = 0;
+
+    GET_VOLUME_FROM_ARGS("r|l", &zvolume, &flags);
+
+    retval = virStorageVolDelete(volume->volume, flags);
+    DPRINTF("%s: virStorageVolDelete(%p, %d) returned %d\n", PHPFUNC, volume->volume, (int) flags, retval);
+    if (retval != 0) {
+        set_error_if_unset("Cannot delete storage volume" TSRMLS_CC);
+        RETURN_FALSE;
+    }
+
+    RETURN_TRUE;
+}
+
+/*
+ * 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;
+    zend_long flags = 0;
+    zend_long offset = 0;
+    zend_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);
+    VIRT_FETCH_RESOURCE(volume, php_libvirt_volume*, &zvolume, PHP_LIBVIRT_VOLUME_RES_NAME, le_libvirt_volume);
+    if ((volume == NULL) || (volume->volume == NULL))
+        RETURN_LONG(retval);
+    VIRT_FETCH_RESOURCE(stream, php_libvirt_stream*, &zstream, 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;
+    zend_long flags = 0;
+    zend_long offset = 0;
+    zend_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);
+    VIRT_FETCH_RESOURCE(volume, php_libvirt_volume*, &zvolume, PHP_LIBVIRT_VOLUME_RES_NAME, le_libvirt_volume);
+    if ((volume == NULL) || (volume->volume == NULL))
+        RETURN_LONG(retval);
+    VIRT_FETCH_RESOURCE(stream, php_libvirt_stream*, &zstream, 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_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;
+    zend_long flags = 0;
+    zend_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_list_storagepools
+ * Since version:   0.4.1(-1)
+ * Description:     Function is used to list storage pools on the connection
+ * Arguments:       @res [resource]: libvirt connection resource
+ * Returns:         libvirt storagepool names array for the connection
+ */
+PHP_FUNCTION(libvirt_list_storagepools)
+{
+    php_libvirt_connection *conn = NULL;
+    zval *zconn;
+    int count = -1;
+    int expectedcount = -1;
+    char **names;
+    int i;
+
+    GET_CONNECTION_FROM_ARGS("r", &zconn);
+
+    if ((expectedcount = virConnectNumOfStoragePools(conn->conn)) < 0)
+        RETURN_FALSE;
+
+    names = (char **)emalloc(expectedcount*sizeof(char *));
+    count = virConnectListStoragePools(conn->conn, names, expectedcount);
+
+    if ((count != expectedcount) || (count < 0)) {
+        efree(names);
+        RETURN_FALSE;
+    }
+
+    array_init(return_value);
+    for (i = 0; i < count; i++) {
+        VIRT_ADD_NEXT_INDEX_STRING(return_value,  names[i]);
+        free(names[i]);
+    }
+    efree(names);
+
+
+    if ((expectedcount = virConnectNumOfDefinedStoragePools(conn->conn)) < 0)
+        RETURN_FALSE;
+    names = (char **)emalloc(expectedcount * sizeof(char *));
+    count = virConnectListDefinedStoragePools(conn->conn, names, expectedcount);
+    if ((count != expectedcount) || (count < 0)) {
+        efree(names);
+        RETURN_FALSE;
+    }
+
+    for (i = 0; i < count; i++) {
+        VIRT_ADD_NEXT_INDEX_STRING(return_value, names[i]);
+        free(names[i]);
+    }
+    efree(names);
+}
+
+/*
+ * Function name:   libvirt_list_active_storagepools
+ * Since version:   0.4.1(-1)
+ * Description:     Function is used to list active storage pools on the connection
+ * Arguments:       @res [resource]: libvirt connection resource
+ * Returns:         libvirt storagepool names array for the connection
+ */
+PHP_FUNCTION(libvirt_list_active_storagepools)
+{
+    php_libvirt_connection *conn = NULL;
+    zval *zconn;
+    int count = -1;
+    int expectedcount = -1;
+    char **names;
+    int i;
+
+    GET_CONNECTION_FROM_ARGS("r", &zconn);
+
+    if ((expectedcount = virConnectNumOfStoragePools(conn->conn)) < 0)
+        RETURN_FALSE;
+
+    names = (char **)emalloc(expectedcount*sizeof(char *));
+    count = virConnectListStoragePools(conn->conn, names, expectedcount);
+
+    if ((count != expectedcount) || (count < 0)) {
+        efree(names);
+        RETURN_FALSE;
+    }
+    array_init(return_value);
+    for (i = 0; i < count; i++) {
+        VIRT_ADD_NEXT_INDEX_STRING(return_value,  names[i]);
+        free(names[i]);
+    }
+    efree(names);
+}
+
+/*
+ * Function name:   libvirt_list_inactive_storagepools
+ * Since version:   0.4.1(-1)
+ * Description:     Function is used to list inactive storage pools on the connection
+ * Arguments:       @res [resource]: libvirt connection resource
+ * Returns:         libvirt storagepool names array for the connection
+ */
+PHP_FUNCTION(libvirt_list_inactive_storagepools)
+{
+    php_libvirt_connection *conn = NULL;
+    zval *zconn;
+    int count = -1;
+    int expectedcount = -1;
+    char **names;
+    int i;
+
+    GET_CONNECTION_FROM_ARGS("r", &zconn);
+
+    if ((expectedcount = virConnectNumOfDefinedStoragePools(conn->conn)) < 0)
+        RETURN_FALSE;
+
+    names = (char **)emalloc(expectedcount * sizeof(char *));
+    count = virConnectListDefinedStoragePools(conn->conn, names, expectedcount);
+    if ((count != expectedcount) || (count < 0)) {
+        efree(names);
+        RETURN_FALSE;
+    }
+
+    array_init(return_value);
+    for (i = 0; i < count; i++) {
+        VIRT_ADD_NEXT_INDEX_STRING(return_value, names[i]);
+        free(names[i]);
+    }
+    efree(names);
+}
diff --git a/src/libvirt-storage.h b/src/libvirt-storage.h
new file mode 100644
index 0000000..2f6f5b3
--- /dev/null
+++ b/src/libvirt-storage.h
@@ -0,0 +1,138 @@
+/*
+ * libvirt-storage.h: The PHP bindings to libvirt storage API
+ *
+ * See COPYING for the license of this software
+ */
+
+#ifndef __LIBVIRT_STORAGE_H__
+# define __LIBVIRT_STORAGE_H__
+
+# include "util.h"
+# include "libvirt-connection.h"
+
+# define PHP_LIBVIRT_STORAGEPOOL_RES_NAME "Libvirt storagepool"
+# define PHP_LIBVIRT_VOLUME_RES_NAME "Libvirt volume"
+# define INT_RESOURCE_STORAGEPOOL 0x10
+# define INT_RESOURCE_VOLUME 0x20
+
+# define PHP_FE_LIBVIRT_STORAGE                                                                      \
+    PHP_FE(libvirt_storagepool_lookup_by_name,        arginfo_libvirt_conn_name)                     \
+    PHP_FE(libvirt_storagepool_lookup_by_volume,      arginfo_libvirt_conn)                          \
+    PHP_FE(libvirt_storagepool_list_volumes,          arginfo_libvirt_conn)                          \
+    PHP_FE(libvirt_storagepool_get_info,              arginfo_libvirt_conn)                          \
+    PHP_FE(libvirt_storagepool_get_uuid_string,       arginfo_libvirt_conn)                          \
+    PHP_FE(libvirt_storagepool_get_name,              arginfo_libvirt_conn)                          \
+    PHP_FE(libvirt_storagepool_lookup_by_uuid_string, arginfo_libvirt_conn_uuid)                     \
+    PHP_FE(libvirt_storagepool_get_xml_desc,          arginfo_libvirt_conn_xpath)                    \
+    PHP_FE(libvirt_storagepool_define_xml,            arginfo_libvirt_storagepool_define_xml)        \
+    PHP_FE(libvirt_storagepool_undefine,              arginfo_libvirt_conn)                          \
+    PHP_FE(libvirt_storagepool_create,                arginfo_libvirt_conn)                          \
+    PHP_FE(libvirt_storagepool_destroy,               arginfo_libvirt_conn)                          \
+    PHP_FE(libvirt_storagepool_is_active,             arginfo_libvirt_conn)                          \
+    PHP_FE(libvirt_storagepool_get_volume_count,      arginfo_libvirt_conn)                          \
+    PHP_FE(libvirt_storagepool_refresh,               arginfo_libvirt_conn_optflags)                 \
+    PHP_FE(libvirt_storagepool_set_autostart,         arginfo_libvirt_conn_flags)                    \
+    PHP_FE(libvirt_storagepool_get_autostart,         arginfo_libvirt_conn)                          \
+    PHP_FE(libvirt_storagepool_build,                 arginfo_libvirt_conn)                          \
+    PHP_FE(libvirt_storagepool_delete,                arginfo_libvirt_conn)                          \
+    PHP_FE(libvirt_storagevolume_lookup_by_name,      arginfo_libvirt_conn_name)                     \
+    PHP_FE(libvirt_storagevolume_lookup_by_path,      arginfo_libvirt_storagevolume_lookup_by_path)  \
+    PHP_FE(libvirt_storagevolume_get_name,            arginfo_libvirt_conn)                          \
+    PHP_FE(libvirt_storagevolume_get_path,            arginfo_libvirt_conn)                          \
+    PHP_FE(libvirt_storagevolume_get_info,            arginfo_libvirt_conn)                          \
+    PHP_FE(libvirt_storagevolume_get_xml_desc,        arginfo_libvirt_storagevolume_get_xml_desc)    \
+    PHP_FE(libvirt_storagevolume_create_xml,          arginfo_libvirt_conn_xml)                      \
+    PHP_FE(libvirt_storagevolume_create_xml_from,     arginfo_libvirt_storagevolume_create_xml_from) \
+    PHP_FE(libvirt_storagevolume_delete,              arginfo_libvirt_conn_optflags)                 \
+    PHP_FE(libvirt_storagevolume_download,            arginfo_libvirt_storagevolume_download)        \
+    PHP_FE(libvirt_storagevolume_upload,              arginfo_libvirt_storagevolume_download)        \
+    PHP_FE(libvirt_storagevolume_resize,              arginfo_libvirt_storagevolume_resize)          \
+    PHP_FE(libvirt_list_storagepools,                 arginfo_libvirt_conn)                          \
+    PHP_FE(libvirt_list_active_storagepools,          arginfo_libvirt_conn)                          \
+    PHP_FE(libvirt_list_inactive_storagepools,        arginfo_libvirt_conn)
+
+# define GET_STORAGEPOOL_FROM_ARGS(args, ...)                                  \
+    do {                                                                       \
+        reset_error(TSRMLS_C);                                                 \
+        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,                   \
+                                  args,                                        \
+                                  __VA_ARGS__) == FAILURE) {                   \
+            set_error("Invalid arguments" TSRMLS_CC);                          \
+            RETURN_FALSE;                                                      \
+        }                                                                      \
+                                                                               \
+        VIRT_FETCH_RESOURCE(pool, php_libvirt_storagepool*, &zpool,            \
+                            PHP_LIBVIRT_STORAGEPOOL_RES_NAME,                  \
+                            le_libvirt_storagepool);                           \
+        if ((pool == NULL) || (pool->pool == NULL))                            \
+            RETURN_FALSE;                                                      \
+    } while (0)                                                                \
+
+# define GET_VOLUME_FROM_ARGS(args, ...)                                       \
+    do {                                                                       \
+        reset_error(TSRMLS_C);                                                 \
+        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC,                   \
+                                  args,                                        \
+                                  __VA_ARGS__) == FAILURE) {                   \
+            set_error("Invalid arguments" TSRMLS_CC);                          \
+            RETURN_FALSE;                                                      \
+        }                                                                      \
+                                                                               \
+        VIRT_FETCH_RESOURCE(volume, php_libvirt_volume*, &zvolume,             \
+                            PHP_LIBVIRT_VOLUME_RES_NAME, le_libvirt_volume);   \
+        if ((volume == NULL) || (volume->volume == NULL))                      \
+            RETURN_FALSE;                                                      \
+    } while (0)                                                                \
+
+int le_libvirt_storagepool;
+int le_libvirt_volume;
+
+typedef struct _php_libvirt_storagepool {
+    virStoragePoolPtr pool;
+    php_libvirt_connection* conn;
+} php_libvirt_storagepool;
+
+typedef struct _php_libvirt_volume {
+    virStorageVolPtr volume;
+    php_libvirt_connection* conn;
+} php_libvirt_volume;
+
+void php_libvirt_storagepool_dtor(virt_resource *rsrc TSRMLS_DC);
+void php_libvirt_volume_dtor(virt_resource *rsrc TSRMLS_DC);
+
+PHP_FUNCTION(libvirt_storagepool_lookup_by_name);
+PHP_FUNCTION(libvirt_storagepool_lookup_by_volume);
+PHP_FUNCTION(libvirt_storagepool_list_volumes);
+PHP_FUNCTION(libvirt_storagepool_get_info);
+PHP_FUNCTION(libvirt_storagepool_get_uuid_string);
+PHP_FUNCTION(libvirt_storagepool_get_name);
+PHP_FUNCTION(libvirt_storagepool_lookup_by_uuid_string);
+PHP_FUNCTION(libvirt_storagepool_get_xml_desc);
+PHP_FUNCTION(libvirt_storagepool_define_xml);
+PHP_FUNCTION(libvirt_storagepool_undefine);
+PHP_FUNCTION(libvirt_storagepool_create);
+PHP_FUNCTION(libvirt_storagepool_destroy);
+PHP_FUNCTION(libvirt_storagepool_is_active);
+PHP_FUNCTION(libvirt_storagepool_get_volume_count);
+PHP_FUNCTION(libvirt_storagepool_refresh);
+PHP_FUNCTION(libvirt_storagepool_set_autostart);
+PHP_FUNCTION(libvirt_storagepool_get_autostart);
+PHP_FUNCTION(libvirt_storagepool_build);
+PHP_FUNCTION(libvirt_storagepool_delete);
+PHP_FUNCTION(libvirt_storagevolume_lookup_by_name);
+PHP_FUNCTION(libvirt_storagevolume_lookup_by_path);
+PHP_FUNCTION(libvirt_storagevolume_get_name);
+PHP_FUNCTION(libvirt_storagevolume_get_path);
+PHP_FUNCTION(libvirt_storagevolume_get_info);
+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_list_storagepools);
+PHP_FUNCTION(libvirt_list_active_storagepools);
+PHP_FUNCTION(libvirt_list_inactive_storagepools);
+
+#endif
-- 
2.13.3




More information about the libvir-list mailing list