[libvirt] [libvirt-php PATCH 10/13] Split up the bindings for libvirt snapshot API

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


---
 src/Makefile.am        |   1 +
 src/libvirt-php.c      | 257 +------------------------------------------------
 src/libvirt-php.h      |  18 +---
 src/libvirt-snapshot.c | 243 ++++++++++++++++++++++++++++++++++++++++++++++
 src/libvirt-snapshot.h |  58 +++++++++++
 5 files changed, 305 insertions(+), 272 deletions(-)
 create mode 100644 src/libvirt-snapshot.c
 create mode 100644 src/libvirt-snapshot.h

diff --git a/src/Makefile.am b/src/Makefile.am
index 32b23cf..1b78011 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -26,6 +26,7 @@ libvirt_php_la_SOURCES = \
 	libvirt-node.c libvirt-node.h \
 	libvirt-stream.c libvirt-stream.h \
 	libvirt-domain.c libvirt-domain.h \
+	libvirt-snapshot.c libvirt-snapshot.h \
 	libvirt-network.c libvirt-network.h \
 	libvirt-storage.c libvirt-storage.h
 libvirt_php_la_CFLAGS = \
diff --git a/src/libvirt-php.c b/src/libvirt-php.c
index 1f0d058..8814e54 100644
--- a/src/libvirt-php.c
+++ b/src/libvirt-php.c
@@ -24,6 +24,7 @@
 #include "libvirt-node.h"
 #include "libvirt-stream.h"
 #include "libvirt-domain.h"
+#include "libvirt-snapshot.h"
 #include "libvirt-network.h"
 #include "libvirt-storage.h"
 
@@ -40,7 +41,6 @@ const char *features_binaries[] = { NULL };
 
 /* ZEND thread safe per request globals definition */
 int le_libvirt_nodedev;
-int le_libvirt_snapshot;
 int le_libvirt_nwfilter;
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_libvirt_connect, 0, 0, 0)
@@ -477,13 +477,7 @@ static zend_function_entry libvirt_functions[] = {
     PHP_FE_LIBVIRT_CONNECTION
     PHP_FE_LIBVIRT_STREAM
     PHP_FE_LIBVIRT_DOMAIN
-    /* Domain snapshot functions */
-    PHP_FE(libvirt_domain_has_current_snapshot,  arginfo_libvirt_conn_optflags)
-    PHP_FE(libvirt_domain_snapshot_create,       arginfo_libvirt_conn_optflags)
-    PHP_FE(libvirt_domain_snapshot_get_xml,      arginfo_libvirt_conn_optflags)
-    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)
+    PHP_FE_LIBVIRT_SNAPSHOT
     PHP_FE_LIBVIRT_STORAGE
     PHP_FE_LIBVIRT_NETWORK
     PHP_FE_LIBVIRT_NODE
@@ -503,7 +497,6 @@ static zend_function_entry libvirt_functions[] = {
     PHP_FE(libvirt_nwfilter_lookup_by_uuid_string, arginfo_libvirt_conn_uuid)
     PHP_FE(libvirt_nwfilter_lookup_by_uuid,      arginfo_libvirt_conn_uuid)
     /* 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_all_nwfilters,           arginfo_libvirt_conn)
     PHP_FE(libvirt_list_nwfilters,               arginfo_libvirt_conn)
@@ -1213,33 +1206,6 @@ static void php_libvirt_nodedev_dtor(virt_resource *rsrc TSRMLS_DC)
     }
 }
 
-/* Destructor for snapshot resource */
-static void php_libvirt_snapshot_dtor(virt_resource *rsrc TSRMLS_DC)
-{
-    php_libvirt_snapshot *snapshot = (php_libvirt_snapshot *)rsrc->ptr;
-    int rv = 0;
-
-    if (snapshot != NULL) {
-        if (snapshot->snapshot != NULL) {
-            if (!check_resource_allocation(NULL, INT_RESOURCE_SNAPSHOT, snapshot->snapshot TSRMLS_CC)) {
-                snapshot->snapshot = NULL;
-                efree(snapshot);
-                return;
-            }
-            rv = virDomainSnapshotFree(snapshot->snapshot);
-            if (rv != 0) {
-                DPRINTF("%s: virDomainSnapshotFree(%p) returned %d\n", __FUNCTION__, snapshot->snapshot, rv);
-                php_error_docref(NULL TSRMLS_CC, E_WARNING, "virDomainSnapshotFree failed with %i on destructor: %s", rv, LIBVIRT_G(last_error));
-            } else {
-                DPRINTF("%s: virDomainSnapshotFree(%p) completed successfully\n", __FUNCTION__, snapshot->snapshot);
-                resource_change_counter(INT_RESOURCE_SNAPSHOT, snapshot->domain->conn->conn, snapshot->snapshot, 0 TSRMLS_CC);
-            }
-            snapshot->snapshot = NULL;
-        }
-        efree(snapshot);
-    }
-}
-
 /* Destructor for nwfilter resource */
 static void php_libvirt_nwfilter_dtor(virt_resource *rsrc TSRMLS_DC)
 {
@@ -1606,19 +1572,6 @@ PHP_MSHUTDOWN_FUNCTION(libvirt)
             RETURN_FALSE;                                                                       \
     } while (0)
 
-#define GET_SNAPSHOT_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(snapshot, php_libvirt_snapshot*, &zsnapshot, PHP_LIBVIRT_SNAPSHOT_RES_NAME, le_libvirt_snapshot);\
-        if ((snapshot == NULL) || (snapshot->snapshot == NULL))                                 \
-            RETURN_FALSE;                                                                       \
-    } while (0)                                                                                 \
-
 #define GET_NWFILTER_FROM_ARGS(args, ...)                                                       \
     do {                                                                                        \
         reset_error(TSRMLS_C);                                                                  \
@@ -2606,212 +2559,6 @@ void parse_array(zval *arr, tVMDisk *disk, tVMNetwork *network)
     } VIRT_FOREACH_END();
 }
 
-/*
- * Function name:   libvirt_domain_has_current_snapshot
- * Since version:   0.4.1(-2)
- * Description:     Function is used to get the information whether domain has the current snapshot
- * Arguments:       @res [resource]: libvirt domain resource
- *                  @flags [int]: libvirt snapshot flags
- * Returns:         TRUE is domain has the current snapshot, otherwise FALSE (you may need to check for error using libvirt_get_last_error())
- */
-PHP_FUNCTION(libvirt_domain_has_current_snapshot)
-{
-    php_libvirt_domain *domain = NULL;
-    zval *zdomain;
-    int retval;
-    zend_long flags = 0;
-
-    GET_DOMAIN_FROM_ARGS("r|l", &zdomain, &flags);
-
-    retval = virDomainHasCurrentSnapshot(domain->domain, flags);
-    if (retval <= 0)
-        RETURN_FALSE;
-    RETURN_TRUE;
-}
-
-/*
- * Function name:   libvirt_domain_snapshot_lookup_by_name
- * Since version:   0.4.1(-2)
- * Description:     This functions is used to lookup for the snapshot by it's name
- * Arguments:       @res [resource]: libvirt domain resource
- *                  @name [string]: name of the snapshot to get the resource
- *                  @flags [int]: libvirt snapshot flags
- * Returns:         domain snapshot resource
- */
-PHP_FUNCTION(libvirt_domain_snapshot_lookup_by_name)
-{
-    php_libvirt_domain *domain = NULL;
-    zval *zdomain;
-    strsize_t name_len;
-    char *name = NULL;
-    zend_long flags = 0;
-    php_libvirt_snapshot *res_snapshot;
-    virDomainSnapshotPtr snapshot = NULL;
-
-    GET_DOMAIN_FROM_ARGS("rs|l", &zdomain, &name, &name_len, &flags);
-
-    if ((name == NULL) || (name_len < 1))
-        RETURN_FALSE;
-    snapshot=virDomainSnapshotLookupByName(domain->domain, name, flags);
-    if (snapshot == NULL)
-        RETURN_FALSE;
-
-    res_snapshot = (php_libvirt_snapshot *)emalloc(sizeof(php_libvirt_snapshot));
-    res_snapshot->domain = domain;
-    res_snapshot->snapshot = snapshot;
-
-    DPRINTF("%s: returning %p\n", PHPFUNC, res_snapshot->snapshot);
-    resource_change_counter(INT_RESOURCE_SNAPSHOT, domain->conn->conn, res_snapshot->snapshot, 1 TSRMLS_CC);
-
-    VIRT_REGISTER_RESOURCE(res_snapshot, le_libvirt_snapshot);
-}
-
-/*
- * Function name:   libvirt_domain_snapshot_create
- * Since version:   0.4.1(-2)
- * Description:     This function creates the domain snapshot for the domain identified by it's resource
- * Arguments:       @res [resource]: libvirt domain resource
- *                  @flags [int]: libvirt snapshot flags
- * Returns:         domain snapshot resource
- */
-PHP_FUNCTION(libvirt_domain_snapshot_create)
-{
-    php_libvirt_domain *domain = NULL;
-    php_libvirt_snapshot *res_snapshot;
-    zval *zdomain;
-    virDomainSnapshotPtr snapshot = NULL;
-    zend_long flags = 0;
-
-    GET_DOMAIN_FROM_ARGS("r|l", &zdomain, &flags);
-
-    snapshot = virDomainSnapshotCreateXML(domain->domain, "<domainsnapshot/>", flags);
-    DPRINTF("%s: virDomainSnapshotCreateXML(%p, <xml>) returned %p\n", PHPFUNC, domain->domain, snapshot);
-    if (snapshot == NULL)
-        RETURN_FALSE;
-
-    res_snapshot = (php_libvirt_snapshot *)emalloc(sizeof(php_libvirt_snapshot));
-    res_snapshot->domain = domain;
-    res_snapshot->snapshot = snapshot;
-
-    DPRINTF("%s: returning %p\n", PHPFUNC, res_snapshot->snapshot);
-    resource_change_counter(INT_RESOURCE_SNAPSHOT, domain->conn->conn, res_snapshot->snapshot, 1 TSRMLS_CC);
-
-    VIRT_REGISTER_RESOURCE(res_snapshot, le_libvirt_snapshot);
-}
-
-/*
- * Function name:   libvirt_domain_snapshot_get_xml
- * Since version:   0.4.1(-2)
- * Description:     Function is used to get the XML description of the snapshot identified by it's resource
- * Arguments:       @res [resource]: libvirt snapshot resource
- *                  @flags [int]: libvirt snapshot flags
- * Returns:         XML description string for the snapshot
- */
-PHP_FUNCTION(libvirt_domain_snapshot_get_xml)
-{
-    char *xml;
-    zval *zsnapshot;
-    php_libvirt_snapshot *snapshot;
-    zend_long flags = 0;
-
-    GET_SNAPSHOT_FROM_ARGS("r|l", &zsnapshot, &flags);
-
-    xml = virDomainSnapshotGetXMLDesc(snapshot->snapshot, flags);
-    if (xml == NULL)
-        RETURN_FALSE;
-
-    VIRT_RETVAL_STRING(xml);
-    free(xml);
-}
-
-/*
- * Function name:   libvirt_domain_snapshot_revert
- * Since version:   0.4.1(-2)
- * Description:     Function is used to revert the domain state to the state identified by the snapshot
- * Arguments:       @res [resource]: libvirt snapshot resource
- *                  @flags [int]: libvirt snapshot flags
- * Returns:         TRUE on success, FALSE on error
- */
-PHP_FUNCTION(libvirt_domain_snapshot_revert)
-{
-    zval *zsnapshot;
-    php_libvirt_snapshot *snapshot;
-    int ret;
-    zend_long flags = 0;
-
-    GET_SNAPSHOT_FROM_ARGS("r|l", &zsnapshot, &flags);
-
-    ret = virDomainRevertToSnapshot(snapshot->snapshot, flags);
-    DPRINTF("%s: virDomainRevertToSnapshot(%p, 0) returned %d\n", PHPFUNC, snapshot->snapshot, ret);
-    if (ret == -1)
-        RETURN_FALSE;
-    RETURN_TRUE;
-}
-
-/*
- * Function name:   libvirt_domain_snapshot_delete
- * Since version:   0.4.1(-2)
- * Description:     Function is used to revert the domain state to the state identified by the snapshot
- * Arguments:       @res [resource]: libvirt snapshot resource
- *                  @flags [int]: 0 to delete just snapshot, VIR_SNAPSHOT_DELETE_CHILDREN to delete snapshot children as well
- * Returns:         TRUE on success, FALSE on error
- */
-PHP_FUNCTION(libvirt_domain_snapshot_delete)
-{
-    zval *zsnapshot;
-    php_libvirt_snapshot *snapshot;
-    zend_long flags = 0;
-    int retval;
-
-    GET_SNAPSHOT_FROM_ARGS("r|l", &zsnapshot, &flags);
-
-    retval = virDomainSnapshotDelete(snapshot->snapshot, flags);
-    DPRINTF("%s: virDomainSnapshotDelete(%p, %d) returned %d\n", PHPFUNC, snapshot->snapshot, (int) flags, retval);
-    if (retval == -1)
-        RETURN_FALSE;
-    RETURN_TRUE;
-}
-
-/*
- * Function name:   libvirt_list_domain_snapshots
- * Since version:   0.4.1(-2)
- * Description:     Function is used to list domain snapshots for the domain specified by it's resource
- * Arguments:       @res [resource]: libvirt domain resource
- *                  @flags [int]: libvirt snapshot flags
- * Returns:         libvirt domain snapshot names array
- */
-PHP_FUNCTION(libvirt_list_domain_snapshots)
-{
-    php_libvirt_domain *domain = NULL;
-    zval *zdomain;
-    int count = -1;
-    int expectedcount = -1;
-    char **names;
-    zend_long flags = 0;
-    int i;
-
-    GET_DOMAIN_FROM_ARGS("r|l", &zdomain, &flags);
-
-    expectedcount = virDomainSnapshotNum(domain->domain, flags);
-    DPRINTF("%s: virDomainSnapshotNum(%p, 0) returned %d\n", PHPFUNC, domain->domain, expectedcount);
-
-    if (expectedcount != -1) {
-        names = (char **)emalloc(expectedcount * sizeof(char *));
-        count = virDomainSnapshotListNames(domain->domain, names, expectedcount, 0);
-    }
-
-    if ((count != expectedcount) || (count < 0)) {
-        RETURN_FALSE;
-    } else {
-        array_init(return_value);
-        for (i = 0; i < count; i++) {
-            VIRT_ADD_NEXT_INDEX_STRING(return_value, names[i]);
-            free(names[i]);
-        }
-    }
-    efree(names);
-}
-
 /* Listing functions */
 /*
  * Function name:   libvirt_list_nodedevs
diff --git a/src/libvirt-php.h b/src/libvirt-php.h
index 1505878..ca10d23 100644
--- a/src/libvirt-php.h
+++ b/src/libvirt-php.h
@@ -129,7 +129,6 @@ typedef uint64_t arch_uint;
 
 /* Internal resource identifier objects */
 #define INT_RESOURCE_NODEDEV        0x08
-#define INT_RESOURCE_SNAPSHOT       0x40
 #define INT_RESOURCE_NWFILTER       0x60
 
 typedef struct tTokenizer {
@@ -159,16 +158,10 @@ typedef struct tVMNetwork {
     char *model;
 } tVMNetwork;
 
-/* TODO: temporary forward declarations until other parts are "modularized" */
+/* TODO: temporary forward declaration until other parts are "modularized" */
 typedef struct _php_libvirt_connection php_libvirt_connection;
-typedef struct _php_libvirt_domain php_libvirt_domain;
 
 /* Libvirt-php types */
-typedef struct _php_libvirt_snapshot {
-    virDomainSnapshotPtr snapshot;
-    php_libvirt_domain* domain;
-} php_libvirt_snapshot;
-
 typedef struct _php_libvirt_nodedev {
     virNodeDevicePtr device;
     php_libvirt_connection* conn;
@@ -232,7 +225,6 @@ long get_next_free_numeric_value(virDomainPtr domain, char *xpath);
 int get_subnet_bits(char *ip);
 
 #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"
 
 PHP_MINIT_FUNCTION(libvirt);
@@ -243,13 +235,6 @@ PHP_MINFO_FUNCTION(libvirt);
 
 /* Common functions */
 PHP_FUNCTION(libvirt_get_last_error);
-/* Domain snapshot functions */
-PHP_FUNCTION(libvirt_domain_has_current_snapshot);
-PHP_FUNCTION(libvirt_domain_snapshot_create);
-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);
 /* Nodedev functions */
 PHP_FUNCTION(libvirt_nodedev_get);
 PHP_FUNCTION(libvirt_nodedev_capabilities);
@@ -269,7 +254,6 @@ PHP_FUNCTION(libvirt_nwfilter_lookup_by_uuid);
 PHP_FUNCTION(libvirt_list_nodedevs);
 PHP_FUNCTION(libvirt_list_all_nwfilters);
 PHP_FUNCTION(libvirt_list_nwfilters);
-PHP_FUNCTION(libvirt_list_domain_snapshots);
 /* Common functions */
 PHP_FUNCTION(libvirt_version);
 PHP_FUNCTION(libvirt_check_version);
diff --git a/src/libvirt-snapshot.c b/src/libvirt-snapshot.c
new file mode 100644
index 0000000..c4c8d81
--- /dev/null
+++ b/src/libvirt-snapshot.c
@@ -0,0 +1,243 @@
+/*
+ * libvirt-snapshot.c: The PHP bindings to libvirt domain snapshot API
+ *
+ * See COPYING for the license of this software
+ */
+
+#include <libvirt/libvirt.h>
+
+#include "libvirt-snapshot.h"
+
+DEBUG_INIT("snapshot");
+
+void php_libvirt_snapshot_dtor(virt_resource *rsrc TSRMLS_DC)
+{
+    php_libvirt_snapshot *snapshot = (php_libvirt_snapshot *)rsrc->ptr;
+    int rv = 0;
+
+    if (snapshot != NULL) {
+        if (snapshot->snapshot != NULL) {
+            if (!check_resource_allocation(NULL, INT_RESOURCE_SNAPSHOT, snapshot->snapshot TSRMLS_CC)) {
+                snapshot->snapshot = NULL;
+                efree(snapshot);
+                return;
+            }
+            rv = virDomainSnapshotFree(snapshot->snapshot);
+            if (rv != 0) {
+                DPRINTF("%s: virDomainSnapshotFree(%p) returned %d\n", __FUNCTION__, snapshot->snapshot, rv);
+                php_error_docref(NULL TSRMLS_CC, E_WARNING, "virDomainSnapshotFree failed with %i on destructor: %s", rv, LIBVIRT_G(last_error));
+            } else {
+                DPRINTF("%s: virDomainSnapshotFree(%p) completed successfully\n", __FUNCTION__, snapshot->snapshot);
+                resource_change_counter(INT_RESOURCE_SNAPSHOT, snapshot->domain->conn->conn, snapshot->snapshot, 0 TSRMLS_CC);
+            }
+            snapshot->snapshot = NULL;
+        }
+        efree(snapshot);
+    }
+}
+
+/*
+ * Function name:   libvirt_domain_has_current_snapshot
+ * Since version:   0.4.1(-2)
+ * Description:     Function is used to get the information whether domain has the current snapshot
+ * Arguments:       @res [resource]: libvirt domain resource
+ *                  @flags [int]: libvirt snapshot flags
+ * Returns:         TRUE is domain has the current snapshot, otherwise FALSE (you may need to check for error using libvirt_get_last_error())
+ */
+PHP_FUNCTION(libvirt_domain_has_current_snapshot)
+{
+    php_libvirt_domain *domain = NULL;
+    zval *zdomain;
+    int retval;
+    zend_long flags = 0;
+
+    GET_DOMAIN_FROM_ARGS("r|l", &zdomain, &flags);
+
+    retval = virDomainHasCurrentSnapshot(domain->domain, flags);
+    if (retval <= 0)
+        RETURN_FALSE;
+    RETURN_TRUE;
+}
+
+/*
+ * Function name:   libvirt_domain_snapshot_lookup_by_name
+ * Since version:   0.4.1(-2)
+ * Description:     This functions is used to lookup for the snapshot by it's name
+ * Arguments:       @res [resource]: libvirt domain resource
+ *                  @name [string]: name of the snapshot to get the resource
+ *                  @flags [int]: libvirt snapshot flags
+ * Returns:         domain snapshot resource
+ */
+PHP_FUNCTION(libvirt_domain_snapshot_lookup_by_name)
+{
+    php_libvirt_domain *domain = NULL;
+    zval *zdomain;
+    strsize_t name_len;
+    char *name = NULL;
+    zend_long flags = 0;
+    php_libvirt_snapshot *res_snapshot;
+    virDomainSnapshotPtr snapshot = NULL;
+
+    GET_DOMAIN_FROM_ARGS("rs|l", &zdomain, &name, &name_len, &flags);
+
+    if ((name == NULL) || (name_len < 1))
+        RETURN_FALSE;
+    snapshot=virDomainSnapshotLookupByName(domain->domain, name, flags);
+    if (snapshot == NULL)
+        RETURN_FALSE;
+
+    res_snapshot = (php_libvirt_snapshot *)emalloc(sizeof(php_libvirt_snapshot));
+    res_snapshot->domain = domain;
+    res_snapshot->snapshot = snapshot;
+
+    DPRINTF("%s: returning %p\n", PHPFUNC, res_snapshot->snapshot);
+    resource_change_counter(INT_RESOURCE_SNAPSHOT, domain->conn->conn, res_snapshot->snapshot, 1 TSRMLS_CC);
+
+    VIRT_REGISTER_RESOURCE(res_snapshot, le_libvirt_snapshot);
+}
+
+/*
+ * Function name:   libvirt_domain_snapshot_create
+ * Since version:   0.4.1(-2)
+ * Description:     This function creates the domain snapshot for the domain identified by it's resource
+ * Arguments:       @res [resource]: libvirt domain resource
+ *                  @flags [int]: libvirt snapshot flags
+ * Returns:         domain snapshot resource
+ */
+PHP_FUNCTION(libvirt_domain_snapshot_create)
+{
+    php_libvirt_domain *domain = NULL;
+    php_libvirt_snapshot *res_snapshot;
+    zval *zdomain;
+    virDomainSnapshotPtr snapshot = NULL;
+    zend_long flags = 0;
+
+    GET_DOMAIN_FROM_ARGS("r|l", &zdomain, &flags);
+
+    snapshot = virDomainSnapshotCreateXML(domain->domain, "<domainsnapshot/>", flags);
+    DPRINTF("%s: virDomainSnapshotCreateXML(%p, <xml>) returned %p\n", PHPFUNC, domain->domain, snapshot);
+    if (snapshot == NULL)
+        RETURN_FALSE;
+
+    res_snapshot = (php_libvirt_snapshot *)emalloc(sizeof(php_libvirt_snapshot));
+    res_snapshot->domain = domain;
+    res_snapshot->snapshot = snapshot;
+
+    DPRINTF("%s: returning %p\n", PHPFUNC, res_snapshot->snapshot);
+    resource_change_counter(INT_RESOURCE_SNAPSHOT, domain->conn->conn, res_snapshot->snapshot, 1 TSRMLS_CC);
+
+    VIRT_REGISTER_RESOURCE(res_snapshot, le_libvirt_snapshot);
+}
+
+/*
+ * Function name:   libvirt_domain_snapshot_get_xml
+ * Since version:   0.4.1(-2)
+ * Description:     Function is used to get the XML description of the snapshot identified by it's resource
+ * Arguments:       @res [resource]: libvirt snapshot resource
+ *                  @flags [int]: libvirt snapshot flags
+ * Returns:         XML description string for the snapshot
+ */
+PHP_FUNCTION(libvirt_domain_snapshot_get_xml)
+{
+    char *xml;
+    zval *zsnapshot;
+    php_libvirt_snapshot *snapshot;
+    zend_long flags = 0;
+
+    GET_SNAPSHOT_FROM_ARGS("r|l", &zsnapshot, &flags);
+
+    xml = virDomainSnapshotGetXMLDesc(snapshot->snapshot, flags);
+    if (xml == NULL)
+        RETURN_FALSE;
+
+    VIRT_RETVAL_STRING(xml);
+    free(xml);
+}
+
+/*
+ * Function name:   libvirt_domain_snapshot_revert
+ * Since version:   0.4.1(-2)
+ * Description:     Function is used to revert the domain state to the state identified by the snapshot
+ * Arguments:       @res [resource]: libvirt snapshot resource
+ *                  @flags [int]: libvirt snapshot flags
+ * Returns:         TRUE on success, FALSE on error
+ */
+PHP_FUNCTION(libvirt_domain_snapshot_revert)
+{
+    zval *zsnapshot;
+    php_libvirt_snapshot *snapshot;
+    int ret;
+    zend_long flags = 0;
+
+    GET_SNAPSHOT_FROM_ARGS("r|l", &zsnapshot, &flags);
+
+    ret = virDomainRevertToSnapshot(snapshot->snapshot, flags);
+    DPRINTF("%s: virDomainRevertToSnapshot(%p, 0) returned %d\n", PHPFUNC, snapshot->snapshot, ret);
+    if (ret == -1)
+        RETURN_FALSE;
+    RETURN_TRUE;
+}
+
+/*
+ * Function name:   libvirt_domain_snapshot_delete
+ * Since version:   0.4.1(-2)
+ * Description:     Function is used to revert the domain state to the state identified by the snapshot
+ * Arguments:       @res [resource]: libvirt snapshot resource
+ *                  @flags [int]: 0 to delete just snapshot, VIR_SNAPSHOT_DELETE_CHILDREN to delete snapshot children as well
+ * Returns:         TRUE on success, FALSE on error
+ */
+PHP_FUNCTION(libvirt_domain_snapshot_delete)
+{
+    zval *zsnapshot;
+    php_libvirt_snapshot *snapshot;
+    zend_long flags = 0;
+    int retval;
+
+    GET_SNAPSHOT_FROM_ARGS("r|l", &zsnapshot, &flags);
+
+    retval = virDomainSnapshotDelete(snapshot->snapshot, flags);
+    DPRINTF("%s: virDomainSnapshotDelete(%p, %d) returned %d\n", PHPFUNC, snapshot->snapshot, (int) flags, retval);
+    if (retval == -1)
+        RETURN_FALSE;
+    RETURN_TRUE;
+}
+
+/*
+ * Function name:   libvirt_list_domain_snapshots
+ * Since version:   0.4.1(-2)
+ * Description:     Function is used to list domain snapshots for the domain specified by it's resource
+ * Arguments:       @res [resource]: libvirt domain resource
+ *                  @flags [int]: libvirt snapshot flags
+ * Returns:         libvirt domain snapshot names array
+ */
+PHP_FUNCTION(libvirt_list_domain_snapshots)
+{
+    php_libvirt_domain *domain = NULL;
+    zval *zdomain;
+    int count = -1;
+    int expectedcount = -1;
+    char **names;
+    zend_long flags = 0;
+    int i;
+
+    GET_DOMAIN_FROM_ARGS("r|l", &zdomain, &flags);
+
+    expectedcount = virDomainSnapshotNum(domain->domain, flags);
+    DPRINTF("%s: virDomainSnapshotNum(%p, 0) returned %d\n", PHPFUNC, domain->domain, expectedcount);
+
+    if (expectedcount != -1) {
+        names = (char **)emalloc(expectedcount * sizeof(char *));
+        count = virDomainSnapshotListNames(domain->domain, names, expectedcount, 0);
+    }
+
+    if ((count != expectedcount) || (count < 0)) {
+        RETURN_FALSE;
+    } else {
+        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-snapshot.h b/src/libvirt-snapshot.h
new file mode 100644
index 0000000..e6092aa
--- /dev/null
+++ b/src/libvirt-snapshot.h
@@ -0,0 +1,58 @@
+/*
+ * libvirt-snapshot.h: The PHP bindings to libvirt domain snapshot API
+ *
+ * See COPYING for the license of this software
+ */
+
+#ifndef __LIBVIRT_SNAPSHOT_H__
+# define __LIBVIRT_SNAPSHOT_H__
+
+# include "libvirt-domain.h"
+
+# define PHP_LIBVIRT_SNAPSHOT_RES_NAME "Libvirt domain snapshot"
+# define INT_RESOURCE_SNAPSHOT 0x40
+
+# define PHP_FE_LIBVIRT_SNAPSHOT                                                                   \
+    PHP_FE(libvirt_domain_has_current_snapshot,    arginfo_libvirt_conn_optflags)                  \
+    PHP_FE(libvirt_domain_snapshot_lookup_by_name, arginfo_libvirt_domain_snapshot_lookup_by_name) \
+    PHP_FE(libvirt_domain_snapshot_create,         arginfo_libvirt_conn_optflags)                  \
+    PHP_FE(libvirt_domain_snapshot_get_xml,        arginfo_libvirt_conn_optflags)                  \
+    PHP_FE(libvirt_domain_snapshot_revert,         arginfo_libvirt_conn_optflags)                  \
+    PHP_FE(libvirt_domain_snapshot_delete,         arginfo_libvirt_conn_optflags)                  \
+    PHP_FE(libvirt_list_domain_snapshots,          arginfo_libvirt_conn_optflags)
+
+# define GET_SNAPSHOT_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(snapshot, php_libvirt_snapshot*, &zsnapshot,       \
+                            PHP_LIBVIRT_SNAPSHOT_RES_NAME,                     \
+                            le_libvirt_snapshot);                              \
+        if (snapshot == NULL || snapshot->snapshot == NULL)                    \
+            RETURN_FALSE;                                                      \
+    } while (0)                                                                \
+
+int le_libvirt_snapshot;
+
+typedef struct _php_libvirt_snapshot {
+    virDomainSnapshotPtr snapshot;
+    php_libvirt_domain* domain;
+} php_libvirt_snapshot;
+
+void php_libvirt_snapshot_dtor(virt_resource *rsrc TSRMLS_DC);
+
+PHP_FUNCTION(libvirt_domain_has_current_snapshot);
+PHP_FUNCTION(libvirt_domain_snapshot_lookup_by_name);
+PHP_FUNCTION(libvirt_domain_snapshot_create);
+PHP_FUNCTION(libvirt_domain_snapshot_get_xml);
+PHP_FUNCTION(libvirt_domain_snapshot_revert);
+PHP_FUNCTION(libvirt_domain_snapshot_delete);
+PHP_FUNCTION(libvirt_list_domain_snapshots);
+
+#endif
-- 
2.13.3




More information about the libvir-list mailing list