--- src/libvirt-php.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- src/libvirt-php.h | 7 +++++++ 2 files changed, 66 insertions(+), 2 deletions(-) diff --git a/src/libvirt-php.c b/src/libvirt-php.c index 7784450..535d321 100644 --- a/src/libvirt-php.c +++ b/src/libvirt-php.c @@ -54,6 +54,7 @@ int le_libvirt_network; int le_libvirt_nodedev; int le_libvirt_stream; int le_libvirt_snapshot; +int le_libvirt_nwfilter; ZEND_BEGIN_ARG_INFO_EX(arginfo_libvirt_connect, 0, 0, 0) ZEND_ARG_INFO(0, url) @@ -823,6 +824,8 @@ translate_counter_type(int type) return "storage volume"; case INT_RESOURCE_SNAPSHOT: return "snapshot"; + case INT_RESOURCE_NWFILTER: + return "nwfilter"; } return "unknown"; @@ -1226,6 +1229,17 @@ void free_resource(int type, void *mem TSRMLS_DC) resource_change_counter(INT_RESOURCE_SNAPSHOT, NULL, (virDomainSnapshotPtr)mem, 0 TSRMLS_CC); } } + + if (type == INT_RESOURCE_NWFILTER) { + rv = virNWFilterFree((virNWFilterPtr) mem); + if (rv != 0) { + DPRINTF("%s: virNWFilterFree(%p) returned %d (%s)\n", __FUNCTION__, (virNWFilterPtr) mem, rv, LIBVIRT_G(last_error)); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "virDomainSnapshotFree failed with %i on destructor: %s", rv, LIBVIRT_G(last_error)); + } else { + DPRINTF("%s: virNWFilterFree(%p) completed successfully\n", __FUNCTION__, (virNWFilterPtr) mem); + resource_change_counter(INT_RESOURCE_NWFILTER, NULL, (virNWFilterPtr) mem, 0 TSRMLS_CC); + } + } } /* @@ -1570,7 +1584,7 @@ static void php_libvirt_snapshot_dtor(virt_resource *rsrc TSRMLS_DC) 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, "virStorageVolFree failed with %i on destructor: %s", rv, LIBVIRT_G(last_error)); + 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); @@ -1581,6 +1595,34 @@ static void php_libvirt_snapshot_dtor(virt_resource *rsrc TSRMLS_DC) } } +/* Destructor for nwfilter resource */ +static void php_libvirt_nwfilter_dtor(virt_resource *rsrc) +{ + php_libvirt_nwfilter *nwfilter = (php_libvirt_nwfilter *) rsrc->ptr; + int rv = 0; + + if (nwfilter != NULL) { + if (nwfilter->nwfilter != NULL) { + if (!check_resource_allocation(NULL, INT_RESOURCE_NWFILTER, nwfilter->nwfilter TSRMLS_CC)) { + nwfilter->nwfilter = NULL; + efree(nwfilter); + + return; + } + rv = virNWFilterFree(nwfilter->nwfilter); + if (rv != 0) { + DPRINTF("%s: virNWFilterFree(%p) returned %d\n", __FUNCTION__, nwfilter->nwfilter, rv); + php_error_docref(NULL TSRMLS_CC, E_WARNING, "virNWFilterFree failed with %i on destructor: %s", rv, LIBVIRT_G(last_error)); + } else { + DPRINTF("%s: virNWFilterFee(%p) completed successfully\n", __FUNCTION__, nwfilter->nwfilter); + resource_change_counter(INT_RESOURCE_NWFILTER, nwfilter->conn->conn, nwfilter->nwfilter, 0 TSRMLS_CC); + } + nwfilter->nwfilter = NULL; + } + efree(nwfilter); + } +} + /* ZEND Module inicialization function */ PHP_MINIT_FUNCTION(libvirt) { @@ -1593,6 +1635,7 @@ PHP_MINIT_FUNCTION(libvirt) le_libvirt_network = zend_register_list_destructors_ex(php_libvirt_network_dtor, NULL, PHP_LIBVIRT_NETWORK_RES_NAME, module_number); le_libvirt_nodedev = zend_register_list_destructors_ex(php_libvirt_nodedev_dtor, NULL, PHP_LIBVIRT_NODEDEV_RES_NAME, module_number); le_libvirt_snapshot = zend_register_list_destructors_ex(php_libvirt_snapshot_dtor, NULL, PHP_LIBVIRT_SNAPSHOT_RES_NAME, module_number); + le_libvirt_nwfilter = zend_register_list_destructors_ex(php_libvirt_nwfilter_dtor, NULL, PHP_LIBVIRT_NWFILTER_RES_NAME, module_number); ZEND_INIT_MODULE_GLOBALS(libvirt, php_libvirt_init_globals, NULL); @@ -1994,7 +2037,21 @@ PHP_MSHUTDOWN_FUNCTION(libvirt) 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) \ + } while (0) \ + +#define GET_NWFILTER_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(nwfilter, php_libvirt_nwfilter *, &znwfilter, \ + PHP_LIBVIRT_NWFILTER_RES_NAME, le_libvirt_nwfilter); \ + if ((nwfilter == NULL) || (nwfilter->nwfilter == NULL)) \ + RETURN_FALSE; \ + } while (0) \ #define LONGLONG_INIT \ char tmpnumber[64] diff --git a/src/libvirt-php.h b/src/libvirt-php.h index 757c5f5..2e7a3ca 100644 --- a/src/libvirt-php.h +++ b/src/libvirt-php.h @@ -298,6 +298,7 @@ typedef struct _resource_info { #define INT_RESOURCE_VOLUME 0x20 #define INT_RESOURCE_SNAPSHOT 0x40 #define INT_RESOURCE_STREAM 0x50 +#define INT_RESOURCE_NWFILTER 0x60 typedef struct tVMDisk { char *path; @@ -355,6 +356,11 @@ typedef struct _php_libvirt_volume { php_libvirt_connection* conn; } php_libvirt_volume; +typedef struct _php_libvirt_nwfilter { + virNWFilterPtr nwfilter; + php_libvirt_connection* conn; +} php_libvirt_nwfilter; + typedef struct _php_libvirt_cred_value { int count; int type; @@ -382,6 +388,7 @@ char **get_array_from_xpath(char *xml, char *xpath, int *num); #define PHP_LIBVIRT_NETWORK_RES_NAME "Libvirt virtual network" #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); PHP_MSHUTDOWN_FUNCTION(libvirt); -- 2.13.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list