Some hypervisors (like Hyper-V) allow duplicate network names which
makes existing libvirt_list_networks not very useful as it returns just
names. Since virConnectListAllNetworks returns array of handles to
virNetworkPtr, one can use e.g. virNetworkGetUUIDString to resolve
such ambiguity issues.
---
src/libvirt-php.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
src/libvirt-php.h | 1 +
2 files changed, 63 insertions(+)
diff --git a/src/libvirt-php.c b/src/libvirt-php.c
index 3a80a53..fa02457 100644
--- a/src/libvirt-php.c
+++ b/src/libvirt-php.c
@@ -737,6 +737,7 @@ static zend_function_entry libvirt_functions[] = {
PHP_FE(libvirt_list_domain_snapshots, arginfo_libvirt_conn_optflags)
PHP_FE(libvirt_list_domain_resources, arginfo_libvirt_conn)
PHP_FE(libvirt_list_nodedevs, arginfo_libvirt_conn_optcap)
+ PHP_FE(libvirt_list_all_networks, arginfo_libvirt_conn_optflags)
PHP_FE(libvirt_list_networks, arginfo_libvirt_conn_optflags)
PHP_FE(libvirt_list_storagepools, arginfo_libvirt_conn)
PHP_FE(libvirt_list_active_storagepools, arginfo_libvirt_conn)
@@ -1814,6 +1815,13 @@ PHP_MINIT_FUNCTION(libvirt)
REGISTER_LONG_CONSTANT("VIR_NETWORKS_INACTIVE", VIR_NETWORKS_INACTIVE,
CONST_CS | CONST_PERSISTENT);
REGISTER_LONG_CONSTANT("VIR_NETWORKS_ALL", VIR_NETWORKS_ACTIVE |
VIR_NETWORKS_INACTIVE, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("VIR_CONNECT_LIST_NETWORKS_INACTIVE",
VIR_CONNECT_LIST_NETWORKS_INACTIVE, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("VIR_CONNECT_LIST_NETWORKS_ACTIVE",
VIR_CONNECT_LIST_NETWORKS_ACTIVE, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("VIR_CONNECT_LIST_NETWORKS_PERSISTENT",
VIR_CONNECT_LIST_NETWORKS_PERSISTENT, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("VIR_CONNECT_LIST_NETWORKS_TRANSIENT",
VIR_CONNECT_LIST_NETWORKS_TRANSIENT, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("VIR_CONNECT_LIST_NETWORKS_AUTOSTART",
VIR_CONNECT_LIST_NETWORKS_AUTOSTART, CONST_CS | CONST_PERSISTENT);
+ REGISTER_LONG_CONSTANT("VIR_CONNECT_LIST_NETWORKS_NO_AUTOSTART",
VIR_CONNECT_LIST_NETWORKS_NO_AUTOSTART, CONST_CS | CONST_PERSISTENT);
+
/* Credential constants */
REGISTER_LONG_CONSTANT("VIR_CRED_USERNAME", 1, CONST_CS |
CONST_PERSISTENT);
@@ -9160,6 +9168,60 @@ PHP_FUNCTION(libvirt_list_inactive_domains)
}
/*
+ * Function name: libvirt_list_all_networks
+ * Since version: 0.5.3
+ * Description: Function is used to list networks on the connection
+ * Arguments: @res [resource]: libvirt connection resource
+ * @flags [int]: optional flags to filter the results for a smaller list
of targetted networks (bitwise-OR VIR_CONNECT_LIST_NETWORKS_* constants)
+ * Returns: libvirt network resources array for the connection
+ */
+PHP_FUNCTION(libvirt_list_all_networks)
+{
+ php_libvirt_connection *conn = NULL;
+ zval *zconn;
+#if PHP_MAJOR_VERSION >= 7
+ zval znetwork;
+#else
+ zval *znetwork;
+#endif
+ zend_long flags = VIR_CONNECT_LIST_NETWORKS_ACTIVE |
+ VIR_CONNECT_LIST_NETWORKS_INACTIVE;
+ int count = -1;
+ size_t i = 0;
+ virNetworkPtr *nets = NULL;
+ virNetworkPtr network = NULL;
+ php_libvirt_network *res_network;
+
+ GET_CONNECTION_FROM_ARGS("r|l", &zconn, &flags);
+
+ if ((count = virConnectListAllNetworks(conn->conn, &nets, flags)) < 0)
+ RETURN_FALSE;
+
+ DPRINTF("%s: Found %d networks\n", PHPFUNC, count);
+
+ array_init(return_value);
+
+ for (i = 0; i < count; i++) {
+ network = nets[i];
+ res_network = (php_libvirt_network *) emalloc(sizeof(php_libvirt_network));
+ res_network->network = network;
+ res_network->conn = conn;
+
+ resource_change_counter(INT_RESOURCE_NETWORK, conn->conn,
+ res_network->network, 1 TSRMLS_CC);
+#if PHP_MAJOR_VERSION >= 7
+ ZVAL_RES(&znetwork, zend_register_resource(res_network,
+ le_libvirt_network));
+ add_next_index_zval(return_value, &znetwork);
+#else
+ ALLOC_INIT_ZVAL(znetwork);
+ ZEND_REGISTER_RESOURCE(znetwork, res_network, le_libvirt_network);
+ add_next_index_zval(return_value, znetwork);
+#endif
+ }
+}
+
+/*
* Function name: libvirt_list_networks
* Since version: 0.4.1(-1)
* Description: Function is used to list networks on the connection
diff --git a/src/libvirt-php.h b/src/libvirt-php.h
index 9978e27..1a003f5 100644
--- a/src/libvirt-php.h
+++ b/src/libvirt-php.h
@@ -427,6 +427,7 @@ PHP_FUNCTION(libvirt_nodedev_get_xml_desc);
PHP_FUNCTION(libvirt_nodedev_get_information);
/* Listing functions */
PHP_FUNCTION(libvirt_list_nodedevs);
+PHP_FUNCTION(libvirt_list_all_networks);
PHP_FUNCTION(libvirt_list_networks);
PHP_FUNCTION(libvirt_list_domains);
PHP_FUNCTION(libvirt_list_domain_snapshots);
--
2.12.2