---
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