于 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

_______________________________________________
Libvirt-cim mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libvirt-cim

Reply via email to