于 2013-3-15 6:56, John Ferlan 写道:
Rather than the somewhat unreliable get a count and get a list of
active
names, use the newer virConnectListAll* interfaces in order to retrieve both
a count and list in one call.
---
src/Virt_DevicePool.c | 121 +++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 119 insertions(+), 2 deletions(-)
diff --git a/src/Virt_DevicePool.c b/src/Virt_DevicePool.c
index bf3dd3b..bffa0cf 100644
--- a/src/Virt_DevicePool.c
+++ b/src/Virt_DevicePool.c
@@ -146,13 +146,24 @@ static int get_diskpool_config(virConnectPtr conn,
struct tmp_disk_pool **_pools,
int *_count)
{
+#if LIBVIR_VERSION_NUMBER >= 100002
+ int i, realcount = 0, count = 0;
+ virStoragePoolPtr *nameList = NULL;
+ int flags = VIR_CONNECT_LIST_STORAGE_POOLS_ACTIVE;
+#else
int count = 0, realcount = 0;
int i;
char ** names = NULL;
+#endif
struct tmp_disk_pool *pools = NULL;
int ret = 0;
bool bret;
+#if LIBVIR_VERSION_NUMBER >= 100002
+ realcount = virConnectListAllStoragePools(conn,
+ &nameList,
+ flags);
+#else
count = virConnectNumOfStoragePools(conn);
if (count < 0) {
ret = count;
@@ -169,6 +180,7 @@ static int get_diskpool_config(virConnectPtr conn,
}
realcount = virConnectListStoragePools(conn, names, count);
+#endif
if (realcount < 0) {
CU_DEBUG("Failed to get storage pools, return %d.",
realcount);
ret = realcount;
@@ -187,7 +199,13 @@ static int get_diskpool_config(virConnectPtr conn,
}
for (i = 0; i < realcount; i++) {
- pools[i].tag = strdup(names[i]);
+#if LIBVIR_VERSION_NUMBER >= 100002
+ pools[i].tag = strdup(getVirStoragePoolName(nameList[i]));
+#else
+ /* Just take names[i], since we're free()'ing later */
+ pools[i].tag = names[i];
+ names[i] = NULL;
+#endif
if (pools[i].tag == NULL) {
CU_DEBUG("Failed in strdup for name '%s'.",
names[i]);
ret = -3;
@@ -213,10 +231,18 @@ static int get_diskpool_config(virConnectPtr conn,
free_diskpool(pools, realcount);
free_names:
+#if LIBVIR_VERSION_NUMBER >= 100002
+ if (nameList != NULL) {
+ for (i = 0; i < realcount; i++)
+ virStoragePoolFree(nameList[i]);
+ free(nameList);
+ }
+#else
for (i = 0; i < count; i++) {
free(names[i]);
}
free(names);
+#endif
out:
return ret;
@@ -529,6 +555,40 @@ static char *diskpool_member_of(const CMPIBroker *broker,
static virNetworkPtr bridge_to_network(virConnectPtr conn,
const char *bridge)
{
+#if LIBVIR_VERSION_NUMBER >= 100002
+ int num;
+ virNetworkPtr **nameList = NULL;
+ virNetworkPtr network = NULL;
+ flags = VIR_CONNECT_LIST_NETWORKS_ACTIVE;
+
+ num = virConnectListAllNetworks(conn,
+ &nameList,
+ flags);
+ if (num < 0) {
+ CU_DEBUG("Failed to get network pools.");
+ return NULL;
+ }
+
+ for (i = 0; i < num; i++) {
+ char *_netname;
+ char *_bridge;
+
+ _netname = virNetworkGetName(nameList[i]);
+ _bridge = virNetworkGetBridgeName(network);
+ CU_DEBUG("Network `%s' has bridge `%s'", _netname,
_bridge);
+ if (STREQ(bridge, _bridge)) {
+ network = nameList[i];
+ nameList[i] = NULL;
+ i = num; /* Loop breaker */
+ }
+ free(_bridge);
+ }
+
+ for (i = 0; i < num; i++) {
+ virNetworkFree(nameList[i]);
+ }
+ free(nameList);
+#else
char **networks = NULL;
virNetworkPtr network = NULL;
int num;
@@ -566,7 +626,7 @@ static virNetworkPtr bridge_to_network(virConnectPtr conn,
for (i = 0; i < num; i++)
free(networks[i]);
free(networks);
-
+#endif
return network;
}
@@ -748,6 +808,29 @@ static bool mempool_set_total(CMPIInstance *inst, virConnectPtr
conn)
static bool mempool_set_consumed(CMPIInstance *inst, virConnectPtr conn)
{
uint64_t memory = 0;
+#if LIBVIR_VERSION_NUMBER >= 9013
+ virDomainPtr *nameList = NULL;
+ int n_names, i;
+ int flags = VIR_CONNECT_LIST_DOMAINS_ACTIVE;
+
+ n_names = virConnectListAllDomains(conn,
+ &nameList,
+ flags);
+ if (n_names < 0) {
+ CU_DEBUG("Failed to get a list of all domains");
+ goto out;
+ }
+
+ for (i = 0; i < n_names; i++) {
+ virDomainInfo dom_info;
+ if (virDomainGetInfo(nameList[i], &dom_info) == 0)
+ memory += dom_info.memory;
+ virDomainFree(nameList[i]);
+ }
+ free(nameList);
+
+ out:
+#else
int *domain_ids = NULL;
int count, i = 0;
@@ -781,6 +864,7 @@ static bool mempool_set_consumed(CMPIInstance *inst, virConnectPtr
conn)
out:
free(domain_ids);
+#endif /* LIBVIR_VERSION_NUMBER >= 0913 */
CMSetProperty(inst, "Reserved",
(CMPIValue *)&memory, CMPI_uint64);
@@ -1034,6 +1118,10 @@ static CMPIStatus netpool_instance(virConnectPtr conn,
char **netnames = NULL;
int i;
int nets = 0;
+#if LIBVIR_VERSION_NUMBER >= 100002
+ virNetworkPtr **nameList = NULL;
+ flags = VIR_CONNECT_LIST_NETWORKS_ACTIVE;
+#endif
if (id != NULL) {
return _netpool_for_network(list,
@@ -1044,7 +1132,16 @@ static CMPIStatus netpool_instance(virConnectPtr conn,
broker);
}
+#if LIBVIR_VERSION_NUMBER >= 100002
+ nets = virConnectListAllNetworks(conn,
+ &nameList,
+ flags);
+ /* Avoids the need to realloc since we have a true number */
+ if (nets >= 0)
+ nets++;
+#else
nets = virConnectNumOfNetworks(conn);
+#endif
if (nets < 0) {
virt_set_status(broker, &s,
CMPI_RC_ERR_FAILED,
@@ -1062,6 +1159,18 @@ static CMPIStatus netpool_instance(virConnectPtr conn,
goto out;
}
+#if LIBVIR_VERSION_NUMBER >= 100002
+ for (i = 0; i < nets - 1; i++) {
+ netnames[i] = strdup(virNetworkGetName(nameList[i]));
+ if (netnames[i] == NULL) {
+ cu_statusf(broker, &s,
+ CMPI_RC_ERR_FAILED,
+ "Failed to strdup memory for %i net names",
+ nets);
+ goto out;
+ }
+ }
+#else
nets = virConnectListNetworks(conn, netnames, nets);
nets++;
@@ -1072,6 +1181,7 @@ static CMPIStatus netpool_instance(virConnectPtr conn,
"Failed to allocate memory for %i net names",
nets);
goto out;
}
+#endif
netnames[nets - 1] = strdup("0");
@@ -1085,6 +1195,13 @@ static CMPIStatus netpool_instance(virConnectPtr conn,
}
out:
+#if LIBVIR_VERSION_NUMBER >= 100002
+ if (nameList != NULL) {
+ for (i = 0; i < nets - 1; i++)
+ virNetworkFree(nameList[i]);
+ free(nameList);
+ }
+#endif
if (netnames != NULL) {
for (i = 0; i < nets; i++)
free(netnames[i]);
-1, too much inline macros, which will make the file very hard to read
later, please use mirrored function pairs.
--
Best Regards
Wenchao Xia