[libvirt] [PATCH 09/22] remote generator, daemon: Handle functions that return lists

Matthias Bolte matthias.bolte at googlemail.com
Sun Apr 24 09:13:56 UTC 2011


---
 daemon/remote.c                 |  701 ---------------------------------------
 daemon/remote_dispatch_bodies.c |  681 +++++++++++++++++++++++++++++++++++++-
 daemon/remote_generator.pl      |  111 +++++-
 3 files changed, 758 insertions(+), 735 deletions(-)

diff --git a/daemon/remote.c b/daemon/remote.c
index f42e2db..4c05567 100644
--- a/daemon/remote.c
+++ b/daemon/remote.c
@@ -531,53 +531,6 @@ cleanup:
 }
 
 static int
-remoteDispatchNodeGetCellsFreeMemory(struct qemud_server *server ATTRIBUTE_UNUSED,
-                                     struct qemud_client *client ATTRIBUTE_UNUSED,
-                                     virConnectPtr conn,
-                                     remote_message_header *hdr ATTRIBUTE_UNUSED,
-                                     remote_error *rerr,
-                                     remote_node_get_cells_free_memory_args *args,
-                                     remote_node_get_cells_free_memory_ret *ret)
-{
-    int len;
-    int rv = -1;
-
-    if (!conn) {
-        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
-        goto cleanup;
-    }
-
-    if (args->maxCells > REMOTE_NODE_MAX_CELLS) {
-        virNetError(VIR_ERR_INTERNAL_ERROR,
-                    "%s", _("maxCells > REMOTE_NODE_MAX_CELLS"));
-        goto cleanup;
-    }
-
-    /* Allocate return buffer. */
-    if (VIR_ALLOC_N(ret->freeMems.freeMems_val, args->maxCells) < 0) {
-        virReportOOMError();
-        goto cleanup;
-    }
-
-    len = virNodeGetCellsFreeMemory(conn,
-                                    (unsigned long long *)ret->freeMems.freeMems_val,
-                                    args->startCell,
-                                    args->maxCells);
-    if (len <= 0)
-        goto cleanup;
-    ret->freeMems.freeMems_len = len;
-
-    rv = 0;
-
-cleanup:
-    if (rv < 0) {
-        remoteDispatchError(rerr);
-        VIR_FREE(ret->freeMems.freeMems_val);
-    }
-    return rv;
-}
-
-static int
 remoteDispatchDomainGetSchedulerType(struct qemud_server *server ATTRIBUTE_UNUSED,
                                      struct qemud_client *client ATTRIBUTE_UNUSED,
                                      virConnectPtr conn,
@@ -1426,51 +1379,6 @@ cleanup:
 }
 
 static int
-remoteDispatchListDefinedDomains(struct qemud_server *server ATTRIBUTE_UNUSED,
-                                 struct qemud_client *client ATTRIBUTE_UNUSED,
-                                 virConnectPtr conn,
-                                 remote_message_header *hdr ATTRIBUTE_UNUSED,
-                                 remote_error *rerr,
-                                 remote_list_defined_domains_args *args,
-                                 remote_list_defined_domains_ret *ret)
-{
-    int rv = -1;
-    int len;
-
-    if (!conn) {
-        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
-        goto cleanup;
-    }
-
-    if (args->maxnames > REMOTE_DOMAIN_NAME_LIST_MAX) {
-        virNetError(VIR_ERR_INTERNAL_ERROR,
-                    "%s", _("maxnames > REMOTE_DOMAIN_NAME_LIST_MAX"));
-        goto cleanup;
-    }
-
-    /* Allocate return buffer. */
-    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
-        virReportOOMError();
-        goto cleanup;
-    }
-
-    len = virConnectListDefinedDomains(conn,
-                                       ret->names.names_val, args->maxnames);
-    if (len < 0)
-        goto cleanup;
-    ret->names.names_len = len;
-
-    rv = 0;
-
-cleanup:
-    if (rv < 0) {
-        remoteDispatchError(rerr);
-        VIR_FREE(ret->names.names_val);
-    }
-    return rv;
-}
-
-static int
 remoteDispatchDomainPinVcpu(struct qemud_server *server ATTRIBUTE_UNUSED,
                             struct qemud_client *client ATTRIBUTE_UNUSED,
                             virConnectPtr conn,
@@ -1942,233 +1850,6 @@ no_memory:
     goto cleanup;
 }
 
-static int
-remoteDispatchListDefinedNetworks(struct qemud_server *server ATTRIBUTE_UNUSED,
-                                  struct qemud_client *client ATTRIBUTE_UNUSED,
-                                  virConnectPtr conn,
-                                  remote_message_header *hdr ATTRIBUTE_UNUSED,
-                                  remote_error *rerr,
-                                  remote_list_defined_networks_args *args,
-                                  remote_list_defined_networks_ret *ret)
-{
-    int rv = -1;
-    int len;
-
-    if (!conn) {
-        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
-        goto cleanup;
-    }
-
-    if (args->maxnames > REMOTE_NETWORK_NAME_LIST_MAX) {
-        virNetError(VIR_ERR_INTERNAL_ERROR,
-                    "%s", _("maxnames > REMOTE_NETWORK_NAME_LIST_MAX"));
-        goto cleanup;
-    }
-
-    /* Allocate return buffer. */
-    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
-        virReportOOMError();
-        goto cleanup;
-    }
-
-    len = virConnectListDefinedNetworks(conn,
-                                      ret->names.names_val, args->maxnames);
-    if (len < 0)
-        goto cleanup;
-    ret->names.names_len = len;
-
-    rv = 0;
-
-cleanup:
-    if (rv < 0) {
-        remoteDispatchError(rerr);
-        VIR_FREE(ret->names.names_val);
-    }
-    return rv;
-}
-
-static int
-remoteDispatchListDomains(struct qemud_server *server ATTRIBUTE_UNUSED,
-                          struct qemud_client *client ATTRIBUTE_UNUSED,
-                          virConnectPtr conn,
-                          remote_message_header *hdr ATTRIBUTE_UNUSED,
-                          remote_error *rerr,
-                          remote_list_domains_args *args,
-                          remote_list_domains_ret *ret)
-{
-    int rv = -1;
-    int len;
-
-    if (!conn) {
-        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
-        goto cleanup;
-    }
-
-    if (args->maxids > REMOTE_DOMAIN_ID_LIST_MAX) {
-        virNetError(VIR_ERR_INTERNAL_ERROR,
-                    "%s", _("maxids > REMOTE_DOMAIN_ID_LIST_MAX"));
-        goto cleanup;
-    }
-
-    /* Allocate return buffer. */
-    if (VIR_ALLOC_N(ret->ids.ids_val, args->maxids) < 0) {
-        virReportOOMError();
-        goto cleanup;
-    }
-
-    len = virConnectListDomains(conn,
-                                ret->ids.ids_val, args->maxids);
-    if (len < 0)
-        goto cleanup;
-    ret->ids.ids_len = len;
-
-    rv = 0;
-
-cleanup:
-    if (rv < 0) {
-        remoteDispatchError(rerr);
-        VIR_FREE(ret->ids.ids_val);
-    }
-    return rv;
-}
-
-static int
-remoteDispatchListNetworks(struct qemud_server *server ATTRIBUTE_UNUSED,
-                           struct qemud_client *client ATTRIBUTE_UNUSED,
-                           virConnectPtr conn,
-                           remote_message_header *hdr ATTRIBUTE_UNUSED,
-                           remote_error *rerr,
-                           remote_list_networks_args *args,
-                           remote_list_networks_ret *ret)
-{
-    int rv = -1;
-    int len;
-
-    if (!conn) {
-        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
-        goto cleanup;
-    }
-
-    if (args->maxnames > REMOTE_NETWORK_NAME_LIST_MAX) {
-        virNetError(VIR_ERR_INTERNAL_ERROR,
-                    "%s", _("maxnames > REMOTE_NETWORK_NAME_LIST_MAX"));
-        goto cleanup;
-    }
-
-    /* Allocate return buffer. */
-    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
-        virReportOOMError();
-        goto cleanup;
-    }
-
-    len = virConnectListNetworks(conn,
-                                 ret->names.names_val, args->maxnames);
-    if (len < 0)
-        goto cleanup;
-    ret->names.names_len = len;
-
-    rv = 0;
-
-cleanup:
-    if (rv < 0) {
-        remoteDispatchError(rerr);
-        VIR_FREE(ret->names.names_val);
-    }
-    return rv;
-}
-
-/*-------------------------------------------------------------*/
-
-static int
-remoteDispatchListInterfaces(struct qemud_server *server ATTRIBUTE_UNUSED,
-                             struct qemud_client *client ATTRIBUTE_UNUSED,
-                             virConnectPtr conn,
-                             remote_message_header *hdr ATTRIBUTE_UNUSED,
-                             remote_error *rerr,
-                             remote_list_interfaces_args *args,
-                             remote_list_interfaces_ret *ret)
-{
-    int rv = -1;
-    int len;
-
-    if (!conn) {
-        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
-        goto cleanup;
-    }
-
-    if (args->maxnames > REMOTE_INTERFACE_NAME_LIST_MAX) {
-        virNetError(VIR_ERR_INTERNAL_ERROR,
-                    "%s", _("maxnames > REMOTE_INTERFACE_NAME_LIST_MAX"));
-        goto cleanup;
-    }
-
-    /* Allocate return buffer. */
-    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
-        virReportOOMError();
-        goto cleanup;
-    }
-
-    len = virConnectListInterfaces(conn,
-                                   ret->names.names_val, args->maxnames);
-    if (len < 0)
-        goto cleanup;
-    ret->names.names_len = len;
-
-    rv = 0;
-
-cleanup:
-    if (rv < 0) {
-        remoteDispatchError(rerr);
-        VIR_FREE(ret->names.names_val);
-    }
-    return rv;
-}
-
-static int
-remoteDispatchListDefinedInterfaces(struct qemud_server *server ATTRIBUTE_UNUSED,
-                                    struct qemud_client *client ATTRIBUTE_UNUSED,
-                                    virConnectPtr conn,
-                                    remote_message_header *hdr ATTRIBUTE_UNUSED,
-                                    remote_error *rerr,
-                                    remote_list_defined_interfaces_args *args,
-                                    remote_list_defined_interfaces_ret *ret)
-{
-    int rv = -1;
-    int len;
-
-    if (!conn) {
-        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
-        goto cleanup;
-    }
-
-    if (args->maxnames > REMOTE_DEFINED_INTERFACE_NAME_LIST_MAX) {
-        virNetError(VIR_ERR_INTERNAL_ERROR,
-                    "%s", _("maxnames > REMOTE_DEFINED_INTERFACE_NAME_LIST_MAX"));
-        goto cleanup;
-    }
-
-    /* Allocate return buffer. */
-    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
-        virReportOOMError();
-        goto cleanup;
-    }
-
-    len = virConnectListDefinedInterfaces(conn,
-                                          ret->names.names_val, args->maxnames);
-    if (len < 0)
-        goto cleanup;
-    ret->names.names_len = len;
-
-    rv = 0;
-
-cleanup:
-    if (rv < 0) {
-        remoteDispatchError(rerr);
-        VIR_FREE(ret->names.names_val);
-    }
-    return rv;
-}
-
 /*-------------------------------------------------------------*/
 
 static int
@@ -2973,97 +2654,6 @@ remoteDispatchAuthPolkit(struct qemud_server *server ATTRIBUTE_UNUSED,
  *     STORAGE POOL APIS
  ***************************************************************/
 
-
-static int
-remoteDispatchListDefinedStoragePools(struct qemud_server *server ATTRIBUTE_UNUSED,
-                                      struct qemud_client *client ATTRIBUTE_UNUSED,
-                                      virConnectPtr conn,
-                                      remote_message_header *hdr ATTRIBUTE_UNUSED,
-                                      remote_error *rerr,
-                                      remote_list_defined_storage_pools_args *args,
-                                      remote_list_defined_storage_pools_ret *ret)
-{
-    int rv = -1;
-    int len;
-
-    if (!conn) {
-        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
-        goto cleanup;
-    }
-
-    if (args->maxnames > REMOTE_NETWORK_NAME_LIST_MAX) {
-        virNetError(VIR_ERR_INTERNAL_ERROR, "%s",
-                    _("maxnames > REMOTE_NETWORK_NAME_LIST_MAX"));
-        goto cleanup;
-    }
-
-    /* Allocate return buffer. */
-    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
-        virReportOOMError();
-        goto cleanup;
-    }
-
-    len = virConnectListDefinedStoragePools(conn,
-                                            ret->names.names_val, args->maxnames);
-    if (len < 0)
-        goto cleanup;
-    ret->names.names_len = len;
-
-    rv = 0;
-
-cleanup:
-    if (rv < 0) {
-        remoteDispatchError(rerr);
-        VIR_FREE(ret->names.names_val);
-    }
-    return rv;
-}
-
-static int
-remoteDispatchListStoragePools(struct qemud_server *server ATTRIBUTE_UNUSED,
-                               struct qemud_client *client ATTRIBUTE_UNUSED,
-                               virConnectPtr conn,
-                               remote_message_header *hdr ATTRIBUTE_UNUSED,
-                               remote_error *rerr,
-                               remote_list_storage_pools_args *args,
-                               remote_list_storage_pools_ret *ret)
-{
-    int rv = -1;
-    int len;
-
-    if (!conn) {
-        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
-        goto cleanup;
-    }
-
-    if (args->maxnames > REMOTE_STORAGE_POOL_NAME_LIST_MAX) {
-        virNetError(VIR_ERR_INTERNAL_ERROR,
-                    "%s", _("maxnames > REMOTE_STORAGE_POOL_NAME_LIST_MAX"));
-        goto cleanup;
-    }
-
-    /* Allocate return buffer. */
-    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
-        virReportOOMError();
-        goto cleanup;
-    }
-
-    len = virConnectListStoragePools(conn,
-                                     ret->names.names_val, args->maxnames);
-    if (len < 0)
-        goto cleanup;
-    ret->names.names_len = len;
-
-    rv = 0;
-
-cleanup:
-    if (rv < 0) {
-        remoteDispatchError(rerr);
-        VIR_FREE(ret->names.names_val);
-    }
-    return rv;
-}
-
 static int
 remoteDispatchStoragePoolGetInfo(struct qemud_server *server ATTRIBUTE_UNUSED,
                                  struct qemud_client *client ATTRIBUTE_UNUSED,
@@ -3103,58 +2693,6 @@ cleanup:
     return rv;
 }
 
-static int
-remoteDispatchStoragePoolListVolumes(struct qemud_server *server ATTRIBUTE_UNUSED,
-                                     struct qemud_client *client ATTRIBUTE_UNUSED,
-                                     virConnectPtr conn,
-                                     remote_message_header *hdr ATTRIBUTE_UNUSED,
-                                     remote_error *rerr,
-                                     remote_storage_pool_list_volumes_args *args,
-                                     remote_storage_pool_list_volumes_ret *ret)
-{
-    virStoragePoolPtr pool = NULL;
-    int rv = -1;
-    int len;
-
-    if (!conn) {
-        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
-        goto cleanup;
-    }
-
-    if (args->maxnames > REMOTE_STORAGE_VOL_NAME_LIST_MAX) {
-        virNetError(VIR_ERR_INTERNAL_ERROR,
-                    "%s", _("maxnames > REMOTE_STORAGE_VOL_NAME_LIST_MAX"));
-        goto cleanup;
-    }
-
-    if (!(pool = get_nonnull_storage_pool(conn, args->pool)))
-        goto cleanup;
-
-    /* Allocate return buffer. */
-    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
-        virReportOOMError();
-        goto cleanup;
-    }
-
-    len = virStoragePoolListVolumes(pool,
-                                    ret->names.names_val, args->maxnames);
-    if (len < 0)
-        goto cleanup;
-    ret->names.names_len = len;
-
-    rv = 0;
-
-cleanup:
-    if (rv < 0) {
-        remoteDispatchError(rerr);
-        VIR_FREE(ret->names.names_val);
-    }
-    if (pool)
-        virStoragePoolFree(pool);
-    return rv;
-}
-
-
 /***************************************************************
  *     STORAGE VOL APIS
  ***************************************************************/
@@ -3202,52 +2740,6 @@ cleanup:
  **************************************************************/
 
 static int
-remoteDispatchNodeListDevices(struct qemud_server *server ATTRIBUTE_UNUSED,
-                              struct qemud_client *client ATTRIBUTE_UNUSED,
-                              virConnectPtr conn,
-                              remote_message_header *hdr ATTRIBUTE_UNUSED,
-                              remote_error *rerr,
-                              remote_node_list_devices_args *args,
-                              remote_node_list_devices_ret *ret)
-{
-    int rv = -1;
-    int len;
-
-    if (!conn) {
-        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
-        goto cleanup;
-    }
-
-    if (args->maxnames > REMOTE_NODE_DEVICE_NAME_LIST_MAX) {
-        virNetError(VIR_ERR_INTERNAL_ERROR,
-                    "%s", _("maxnames > REMOTE_NODE_DEVICE_NAME_LIST_MAX"));
-        goto cleanup;
-    }
-
-    /* Allocate return buffer. */
-    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
-        virReportOOMError();
-        goto cleanup;
-    }
-
-    len = virNodeListDevices(conn,
-                             args->cap ? *args->cap : NULL,
-                             ret->names.names_val, args->maxnames, args->flags);
-    if (len < 0)
-        goto cleanup;
-    ret->names.names_len = len;
-
-    rv = 0;
-
-cleanup:
-    if (rv < 0) {
-        remoteDispatchError(rerr);
-        VIR_FREE(ret->names.names_val);
-    }
-    return rv;
-}
-
-static int
 remoteDispatchNodeDeviceGetParent(struct qemud_server *server ATTRIBUTE_UNUSED,
                                   struct qemud_client *client ATTRIBUTE_UNUSED,
                                   virConnectPtr conn,
@@ -3297,57 +2789,6 @@ cleanup:
     return rv;
 }
 
-static int
-remoteDispatchNodeDeviceListCaps(struct qemud_server *server ATTRIBUTE_UNUSED,
-                                 struct qemud_client *client ATTRIBUTE_UNUSED,
-                                 virConnectPtr conn,
-                                 remote_message_header *hdr ATTRIBUTE_UNUSED,
-                                 remote_error *rerr,
-                                 remote_node_device_list_caps_args *args,
-                                 remote_node_device_list_caps_ret *ret)
-{
-    virNodeDevicePtr dev = NULL;
-    int rv = -1;
-    int len;
-
-    if (!conn) {
-        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
-        goto cleanup;
-    }
-
-    if (!(dev = virNodeDeviceLookupByName(conn, args->name)))
-        goto cleanup;
-
-    if (args->maxnames > REMOTE_NODE_DEVICE_NAME_LIST_MAX) {
-        virNetError(VIR_ERR_INTERNAL_ERROR,
-                    "%s", _("maxnames > REMOTE_NODE_DEVICE_NAME_LIST_MAX"));
-        goto cleanup;
-    }
-
-    /* Allocate return buffer. */
-    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
-        virReportOOMError();
-        goto cleanup;
-    }
-
-    len = virNodeDeviceListCaps(dev, ret->names.names_val,
-                                args->maxnames);
-    if (len < 0)
-        goto cleanup;
-    ret->names.names_len = len;
-
-    rv = 0;
-
-cleanup:
-    if (rv < 0) {
-        remoteDispatchError(rerr);
-        VIR_FREE(ret->names.names_val);
-    }
-    if (dev)
-        virNodeDeviceFree(dev);
-    return rv;
-}
-
 static int remoteDispatchStorageVolUpload(struct qemud_server *server ATTRIBUTE_UNUSED,
                                           struct qemud_client *client,
                                           virConnectPtr conn,
@@ -3580,50 +3021,6 @@ cleanup:
 }
 
 static int
-remoteDispatchListSecrets(struct qemud_server *server ATTRIBUTE_UNUSED,
-                          struct qemud_client *client ATTRIBUTE_UNUSED,
-                          virConnectPtr conn,
-                          remote_message_header *hdr ATTRIBUTE_UNUSED,
-                          remote_error *rerr,
-                          remote_list_secrets_args *args,
-                          remote_list_secrets_ret *ret)
-{
-    int rv = -1;
-    int len;
-
-    if (!conn) {
-        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
-        goto cleanup;
-    }
-
-    if (args->maxuuids > REMOTE_SECRET_UUID_LIST_MAX) {
-        virNetError(VIR_ERR_INTERNAL_ERROR, "%s",
-                    _("maxuuids > REMOTE_SECRET_UUID_LIST_MAX"));
-        goto cleanup;
-    }
-
-    if (VIR_ALLOC_N(ret->uuids.uuids_val, args->maxuuids) < 0) {
-        virReportOOMError();
-        goto cleanup;
-    }
-
-    len = virConnectListSecrets(conn, ret->uuids.uuids_val,
-                                args->maxuuids);
-    if (len < 0)
-        goto cleanup;
-    ret->uuids.uuids_len = len;
-
-    rv = 0;
-
-cleanup:
-    if (rv < 0) {
-        remoteDispatchError(rerr);
-        VIR_FREE(ret->uuids.uuids_val);
-    }
-    return rv;
-}
-
-static int
 remoteDispatchSecretGetValue(struct qemud_server *server ATTRIBUTE_UNUSED,
                              struct qemud_client *client ATTRIBUTE_UNUSED,
                              virConnectPtr conn,
@@ -3773,59 +3170,6 @@ cleanup:
 }
 
 static int
-remoteDispatchDomainSnapshotListNames(struct qemud_server *server ATTRIBUTE_UNUSED,
-                                      struct qemud_client *client ATTRIBUTE_UNUSED,
-                                      virConnectPtr conn,
-                                      remote_message_header *hdr ATTRIBUTE_UNUSED,
-                                      remote_error *rerr,
-                                      remote_domain_snapshot_list_names_args *args,
-                                      remote_domain_snapshot_list_names_ret *ret)
-{
-    virDomainPtr dom = NULL;
-    int rv = -1;
-    int len;
-
-    if (!conn) {
-        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
-        goto cleanup;
-    }
-
-    if (args->maxnames > REMOTE_DOMAIN_SNAPSHOT_LIST_NAMES_MAX) {
-        virNetError(VIR_ERR_INTERNAL_ERROR, "%s",
-                    _("maxnames > REMOTE_DOMAIN_SNAPSHOT_LIST_NAMES_MAX"));
-        goto cleanup;
-    }
-
-    if (!(dom = get_nonnull_domain(conn, args->dom)))
-        goto cleanup;
-
-    /* Allocate return buffer. */
-    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
-        virReportOOMError();
-        goto cleanup;
-    }
-
-    len = virDomainSnapshotListNames(dom,
-                                     ret->names.names_val,
-                                     args->maxnames,
-                                     args->flags);
-    if (len < 0)
-        goto cleanup;
-    ret->names.names_len = len;
-
-    rv = 0;
-
-cleanup:
-    if (rv < 0) {
-        remoteDispatchError(rerr);
-        VIR_FREE(ret->names.names_val);
-    }
-    if (dom)
-        virDomainFree(dom);
-    return rv;
-}
-
-static int
 remoteDispatchDomainEventsRegisterAny(struct qemud_server *server ATTRIBUTE_UNUSED,
                                       struct qemud_client *client ATTRIBUTE_UNUSED,
                                       virConnectPtr conn,
@@ -3912,51 +3256,6 @@ cleanup:
 }
 
 static int
-remoteDispatchListNWFilters(struct qemud_server *server ATTRIBUTE_UNUSED,
-                            struct qemud_client *client ATTRIBUTE_UNUSED,
-                            virConnectPtr conn,
-                            remote_message_header *hdr ATTRIBUTE_UNUSED,
-                            remote_error *rerr,
-                            remote_list_nwfilters_args *args,
-                            remote_list_nwfilters_ret *ret)
-{
-    int rv = -1;
-    int len;
-
-    if (!conn) {
-        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
-        goto cleanup;
-    }
-
-    if (args->maxnames > REMOTE_NWFILTER_NAME_LIST_MAX) {
-        virNetError(VIR_ERR_INTERNAL_ERROR,
-                    "%s", _("maxnames > REMOTE_NWFILTER_NAME_LIST_MAX"));
-        goto cleanup;
-    }
-
-    /* Allocate return buffer. */
-    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
-        virReportOOMError();
-        goto cleanup;
-    }
-
-    len = virConnectListNWFilters(conn,
-                                  ret->names.names_val, args->maxnames);
-    if (len < 0)
-        goto cleanup;
-    ret->names.names_len = len;
-
-    rv = 0;
-
-cleanup:
-    if (rv < 0) {
-        remoteDispatchError(rerr);
-        VIR_FREE(ret->names.names_val);
-    }
-    return rv;
-}
-
-static int
 remoteDispatchDomainGetBlockInfo(struct qemud_server *server ATTRIBUTE_UNUSED,
                                  struct qemud_client *client ATTRIBUTE_UNUSED,
                                  virConnectPtr conn,
diff --git a/daemon/remote_dispatch_bodies.c b/daemon/remote_dispatch_bodies.c
index 77b7db4..d12988e 100644
--- a/daemon/remote_dispatch_bodies.c
+++ b/daemon/remote_dispatch_bodies.c
@@ -1703,7 +1703,55 @@ cleanup:
     return rv;
 }
 
-/* remoteDispatchDomainSnapshotListNames has to be implemented manually */
+static int
+remoteDispatchDomainSnapshotListNames(
+    struct qemud_server *server ATTRIBUTE_UNUSED,
+    struct qemud_client *client ATTRIBUTE_UNUSED,
+    virConnectPtr conn,
+    remote_message_header *hdr ATTRIBUTE_UNUSED,
+    remote_error *rerr,
+    remote_domain_snapshot_list_names_args *args,
+    remote_domain_snapshot_list_names_ret *ret)
+{
+    int rv = -1;
+    virDomainPtr dom = NULL;
+    int len;
+
+    if (!conn) {
+        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
+        goto cleanup;
+    }
+
+    if (args->maxnames > REMOTE_DOMAIN_SNAPSHOT_LIST_NAMES_MAX) {
+        virNetError(VIR_ERR_INTERNAL_ERROR,
+                    "%s", _("maxnames > REMOTE_DOMAIN_SNAPSHOT_LIST_NAMES_MAX"));
+        goto cleanup;
+    }
+
+    if (!(dom = get_nonnull_domain(conn, args->dom)))
+        goto cleanup;
+
+    /* Allocate return buffer. */
+    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
+        virReportOOMError();
+        goto cleanup;
+    }
+
+    if ((len = virDomainSnapshotListNames(dom, ret->names.names_val, args->maxnames, args->flags)) < 0)
+        goto cleanup;
+
+    ret->names.names_len = len;
+    rv = 0;
+
+cleanup:
+    if (rv < 0)
+        remoteDispatchError(rerr);
+    if (dom)
+        virDomainFree(dom);
+    if (rv < 0)
+        VIR_FREE(ret->names.names_val);
+    return rv;
+}
 
 static int
 remoteDispatchDomainSnapshotLookupByName(
@@ -2489,25 +2537,445 @@ cleanup:
     return rv;
 }
 
-/* remoteDispatchListDefinedDomains has to be implemented manually */
+static int
+remoteDispatchListDefinedDomains(
+    struct qemud_server *server ATTRIBUTE_UNUSED,
+    struct qemud_client *client ATTRIBUTE_UNUSED,
+    virConnectPtr conn,
+    remote_message_header *hdr ATTRIBUTE_UNUSED,
+    remote_error *rerr,
+    remote_list_defined_domains_args *args,
+    remote_list_defined_domains_ret *ret)
+{
+    int rv = -1;
+    int len;
+
+    if (!conn) {
+        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
+        goto cleanup;
+    }
+
+    if (args->maxnames > REMOTE_DOMAIN_NAME_LIST_MAX) {
+        virNetError(VIR_ERR_INTERNAL_ERROR,
+                    "%s", _("maxnames > REMOTE_DOMAIN_NAME_LIST_MAX"));
+        goto cleanup;
+    }
+
+    /* Allocate return buffer. */
+    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
+        virReportOOMError();
+        goto cleanup;
+    }
+
+    if ((len = virConnectListDefinedDomains(conn, ret->names.names_val, args->maxnames)) < 0)
+        goto cleanup;
+
+    ret->names.names_len = len;
+    rv = 0;
+
+cleanup:
+    if (rv < 0)
+        remoteDispatchError(rerr);
+    if (rv < 0)
+        VIR_FREE(ret->names.names_val);
+    return rv;
+}
+
+static int
+remoteDispatchListDefinedInterfaces(
+    struct qemud_server *server ATTRIBUTE_UNUSED,
+    struct qemud_client *client ATTRIBUTE_UNUSED,
+    virConnectPtr conn,
+    remote_message_header *hdr ATTRIBUTE_UNUSED,
+    remote_error *rerr,
+    remote_list_defined_interfaces_args *args,
+    remote_list_defined_interfaces_ret *ret)
+{
+    int rv = -1;
+    int len;
+
+    if (!conn) {
+        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
+        goto cleanup;
+    }
+
+    if (args->maxnames > REMOTE_DEFINED_INTERFACE_NAME_LIST_MAX) {
+        virNetError(VIR_ERR_INTERNAL_ERROR,
+                    "%s", _("maxnames > REMOTE_DEFINED_INTERFACE_NAME_LIST_MAX"));
+        goto cleanup;
+    }
+
+    /* Allocate return buffer. */
+    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
+        virReportOOMError();
+        goto cleanup;
+    }
+
+    if ((len = virConnectListDefinedInterfaces(conn, ret->names.names_val, args->maxnames)) < 0)
+        goto cleanup;
+
+    ret->names.names_len = len;
+    rv = 0;
+
+cleanup:
+    if (rv < 0)
+        remoteDispatchError(rerr);
+    if (rv < 0)
+        VIR_FREE(ret->names.names_val);
+    return rv;
+}
+
+static int
+remoteDispatchListDefinedNetworks(
+    struct qemud_server *server ATTRIBUTE_UNUSED,
+    struct qemud_client *client ATTRIBUTE_UNUSED,
+    virConnectPtr conn,
+    remote_message_header *hdr ATTRIBUTE_UNUSED,
+    remote_error *rerr,
+    remote_list_defined_networks_args *args,
+    remote_list_defined_networks_ret *ret)
+{
+    int rv = -1;
+    int len;
+
+    if (!conn) {
+        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
+        goto cleanup;
+    }
+
+    if (args->maxnames > REMOTE_NETWORK_NAME_LIST_MAX) {
+        virNetError(VIR_ERR_INTERNAL_ERROR,
+                    "%s", _("maxnames > REMOTE_NETWORK_NAME_LIST_MAX"));
+        goto cleanup;
+    }
+
+    /* Allocate return buffer. */
+    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
+        virReportOOMError();
+        goto cleanup;
+    }
+
+    if ((len = virConnectListDefinedNetworks(conn, ret->names.names_val, args->maxnames)) < 0)
+        goto cleanup;
+
+    ret->names.names_len = len;
+    rv = 0;
+
+cleanup:
+    if (rv < 0)
+        remoteDispatchError(rerr);
+    if (rv < 0)
+        VIR_FREE(ret->names.names_val);
+    return rv;
+}
+
+static int
+remoteDispatchListDefinedStoragePools(
+    struct qemud_server *server ATTRIBUTE_UNUSED,
+    struct qemud_client *client ATTRIBUTE_UNUSED,
+    virConnectPtr conn,
+    remote_message_header *hdr ATTRIBUTE_UNUSED,
+    remote_error *rerr,
+    remote_list_defined_storage_pools_args *args,
+    remote_list_defined_storage_pools_ret *ret)
+{
+    int rv = -1;
+    int len;
+
+    if (!conn) {
+        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
+        goto cleanup;
+    }
+
+    if (args->maxnames > REMOTE_STORAGE_POOL_NAME_LIST_MAX) {
+        virNetError(VIR_ERR_INTERNAL_ERROR,
+                    "%s", _("maxnames > REMOTE_STORAGE_POOL_NAME_LIST_MAX"));
+        goto cleanup;
+    }
+
+    /* Allocate return buffer. */
+    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
+        virReportOOMError();
+        goto cleanup;
+    }
+
+    if ((len = virConnectListDefinedStoragePools(conn, ret->names.names_val, args->maxnames)) < 0)
+        goto cleanup;
+
+    ret->names.names_len = len;
+    rv = 0;
+
+cleanup:
+    if (rv < 0)
+        remoteDispatchError(rerr);
+    if (rv < 0)
+        VIR_FREE(ret->names.names_val);
+    return rv;
+}
+
+static int
+remoteDispatchListDomains(
+    struct qemud_server *server ATTRIBUTE_UNUSED,
+    struct qemud_client *client ATTRIBUTE_UNUSED,
+    virConnectPtr conn,
+    remote_message_header *hdr ATTRIBUTE_UNUSED,
+    remote_error *rerr,
+    remote_list_domains_args *args,
+    remote_list_domains_ret *ret)
+{
+    int rv = -1;
+    int len;
+
+    if (!conn) {
+        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
+        goto cleanup;
+    }
+
+    if (args->maxids > REMOTE_DOMAIN_ID_LIST_MAX) {
+        virNetError(VIR_ERR_INTERNAL_ERROR,
+                    "%s", _("maxids > REMOTE_DOMAIN_ID_LIST_MAX"));
+        goto cleanup;
+    }
+
+    /* Allocate return buffer. */
+    if (VIR_ALLOC_N(ret->ids.ids_val, args->maxids) < 0) {
+        virReportOOMError();
+        goto cleanup;
+    }
 
-/* remoteDispatchListDefinedInterfaces has to be implemented manually */
+    if ((len = virConnectListDomains(conn, ret->ids.ids_val, args->maxids)) < 0)
+        goto cleanup;
 
-/* remoteDispatchListDefinedNetworks has to be implemented manually */
+    ret->ids.ids_len = len;
+    rv = 0;
 
-/* remoteDispatchListDefinedStoragePools has to be implemented manually */
+cleanup:
+    if (rv < 0)
+        remoteDispatchError(rerr);
+    if (rv < 0)
+        VIR_FREE(ret->ids.ids_val);
+    return rv;
+}
 
-/* remoteDispatchListDomains has to be implemented manually */
+static int
+remoteDispatchListInterfaces(
+    struct qemud_server *server ATTRIBUTE_UNUSED,
+    struct qemud_client *client ATTRIBUTE_UNUSED,
+    virConnectPtr conn,
+    remote_message_header *hdr ATTRIBUTE_UNUSED,
+    remote_error *rerr,
+    remote_list_interfaces_args *args,
+    remote_list_interfaces_ret *ret)
+{
+    int rv = -1;
+    int len;
 
-/* remoteDispatchListInterfaces has to be implemented manually */
+    if (!conn) {
+        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
+        goto cleanup;
+    }
 
-/* remoteDispatchListNetworks has to be implemented manually */
+    if (args->maxnames > REMOTE_INTERFACE_NAME_LIST_MAX) {
+        virNetError(VIR_ERR_INTERNAL_ERROR,
+                    "%s", _("maxnames > REMOTE_INTERFACE_NAME_LIST_MAX"));
+        goto cleanup;
+    }
 
-/* remoteDispatchListNWFilters has to be implemented manually */
+    /* Allocate return buffer. */
+    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
+        virReportOOMError();
+        goto cleanup;
+    }
 
-/* remoteDispatchListSecrets has to be implemented manually */
+    if ((len = virConnectListInterfaces(conn, ret->names.names_val, args->maxnames)) < 0)
+        goto cleanup;
 
-/* remoteDispatchListStoragePools has to be implemented manually */
+    ret->names.names_len = len;
+    rv = 0;
+
+cleanup:
+    if (rv < 0)
+        remoteDispatchError(rerr);
+    if (rv < 0)
+        VIR_FREE(ret->names.names_val);
+    return rv;
+}
+
+static int
+remoteDispatchListNetworks(
+    struct qemud_server *server ATTRIBUTE_UNUSED,
+    struct qemud_client *client ATTRIBUTE_UNUSED,
+    virConnectPtr conn,
+    remote_message_header *hdr ATTRIBUTE_UNUSED,
+    remote_error *rerr,
+    remote_list_networks_args *args,
+    remote_list_networks_ret *ret)
+{
+    int rv = -1;
+    int len;
+
+    if (!conn) {
+        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
+        goto cleanup;
+    }
+
+    if (args->maxnames > REMOTE_NETWORK_NAME_LIST_MAX) {
+        virNetError(VIR_ERR_INTERNAL_ERROR,
+                    "%s", _("maxnames > REMOTE_NETWORK_NAME_LIST_MAX"));
+        goto cleanup;
+    }
+
+    /* Allocate return buffer. */
+    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
+        virReportOOMError();
+        goto cleanup;
+    }
+
+    if ((len = virConnectListNetworks(conn, ret->names.names_val, args->maxnames)) < 0)
+        goto cleanup;
+
+    ret->names.names_len = len;
+    rv = 0;
+
+cleanup:
+    if (rv < 0)
+        remoteDispatchError(rerr);
+    if (rv < 0)
+        VIR_FREE(ret->names.names_val);
+    return rv;
+}
+
+static int
+remoteDispatchListNWFilters(
+    struct qemud_server *server ATTRIBUTE_UNUSED,
+    struct qemud_client *client ATTRIBUTE_UNUSED,
+    virConnectPtr conn,
+    remote_message_header *hdr ATTRIBUTE_UNUSED,
+    remote_error *rerr,
+    remote_list_nwfilters_args *args,
+    remote_list_nwfilters_ret *ret)
+{
+    int rv = -1;
+    int len;
+
+    if (!conn) {
+        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
+        goto cleanup;
+    }
+
+    if (args->maxnames > REMOTE_NWFILTER_NAME_LIST_MAX) {
+        virNetError(VIR_ERR_INTERNAL_ERROR,
+                    "%s", _("maxnames > REMOTE_NWFILTER_NAME_LIST_MAX"));
+        goto cleanup;
+    }
+
+    /* Allocate return buffer. */
+    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
+        virReportOOMError();
+        goto cleanup;
+    }
+
+    if ((len = virConnectListNWFilters(conn, ret->names.names_val, args->maxnames)) < 0)
+        goto cleanup;
+
+    ret->names.names_len = len;
+    rv = 0;
+
+cleanup:
+    if (rv < 0)
+        remoteDispatchError(rerr);
+    if (rv < 0)
+        VIR_FREE(ret->names.names_val);
+    return rv;
+}
+
+static int
+remoteDispatchListSecrets(
+    struct qemud_server *server ATTRIBUTE_UNUSED,
+    struct qemud_client *client ATTRIBUTE_UNUSED,
+    virConnectPtr conn,
+    remote_message_header *hdr ATTRIBUTE_UNUSED,
+    remote_error *rerr,
+    remote_list_secrets_args *args,
+    remote_list_secrets_ret *ret)
+{
+    int rv = -1;
+    int len;
+
+    if (!conn) {
+        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
+        goto cleanup;
+    }
+
+    if (args->maxuuids > REMOTE_SECRET_UUID_LIST_MAX) {
+        virNetError(VIR_ERR_INTERNAL_ERROR,
+                    "%s", _("maxuuids > REMOTE_SECRET_UUID_LIST_MAX"));
+        goto cleanup;
+    }
+
+    /* Allocate return buffer. */
+    if (VIR_ALLOC_N(ret->uuids.uuids_val, args->maxuuids) < 0) {
+        virReportOOMError();
+        goto cleanup;
+    }
+
+    if ((len = virConnectListSecrets(conn, ret->uuids.uuids_val, args->maxuuids)) < 0)
+        goto cleanup;
+
+    ret->uuids.uuids_len = len;
+    rv = 0;
+
+cleanup:
+    if (rv < 0)
+        remoteDispatchError(rerr);
+    if (rv < 0)
+        VIR_FREE(ret->uuids.uuids_val);
+    return rv;
+}
+
+static int
+remoteDispatchListStoragePools(
+    struct qemud_server *server ATTRIBUTE_UNUSED,
+    struct qemud_client *client ATTRIBUTE_UNUSED,
+    virConnectPtr conn,
+    remote_message_header *hdr ATTRIBUTE_UNUSED,
+    remote_error *rerr,
+    remote_list_storage_pools_args *args,
+    remote_list_storage_pools_ret *ret)
+{
+    int rv = -1;
+    int len;
+
+    if (!conn) {
+        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
+        goto cleanup;
+    }
+
+    if (args->maxnames > REMOTE_STORAGE_POOL_NAME_LIST_MAX) {
+        virNetError(VIR_ERR_INTERNAL_ERROR,
+                    "%s", _("maxnames > REMOTE_STORAGE_POOL_NAME_LIST_MAX"));
+        goto cleanup;
+    }
+
+    /* Allocate return buffer. */
+    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
+        virReportOOMError();
+        goto cleanup;
+    }
+
+    if ((len = virConnectListStoragePools(conn, ret->names.names_val, args->maxnames)) < 0)
+        goto cleanup;
+
+    ret->names.names_len = len;
+    rv = 0;
+
+cleanup:
+    if (rv < 0)
+        remoteDispatchError(rerr);
+    if (rv < 0)
+        VIR_FREE(ret->names.names_val);
+    return rv;
+}
 
 static int
 remoteDispatchNetworkCreate(
@@ -3091,7 +3559,55 @@ cleanup:
 
 /* remoteDispatchNodeDeviceGetParent has to be implemented manually */
 
-/* remoteDispatchNodeDeviceListCaps has to be implemented manually */
+static int
+remoteDispatchNodeDeviceListCaps(
+    struct qemud_server *server ATTRIBUTE_UNUSED,
+    struct qemud_client *client ATTRIBUTE_UNUSED,
+    virConnectPtr conn,
+    remote_message_header *hdr ATTRIBUTE_UNUSED,
+    remote_error *rerr,
+    remote_node_device_list_caps_args *args,
+    remote_node_device_list_caps_ret *ret)
+{
+    int rv = -1;
+    virNodeDevicePtr dev = NULL;
+    int len;
+
+    if (!conn) {
+        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
+        goto cleanup;
+    }
+
+    if (args->maxnames > REMOTE_NODE_DEVICE_CAPS_LIST_MAX) {
+        virNetError(VIR_ERR_INTERNAL_ERROR,
+                    "%s", _("maxnames > REMOTE_NODE_DEVICE_CAPS_LIST_MAX"));
+        goto cleanup;
+    }
+
+    if (!(dev = virNodeDeviceLookupByName(conn, args->name)))
+        goto cleanup;
+
+    /* Allocate return buffer. */
+    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
+        virReportOOMError();
+        goto cleanup;
+    }
+
+    if ((len = virNodeDeviceListCaps(dev, ret->names.names_val, args->maxnames)) < 0)
+        goto cleanup;
+
+    ret->names.names_len = len;
+    rv = 0;
+
+cleanup:
+    if (rv < 0)
+        remoteDispatchError(rerr);
+    if (dev)
+        virNodeDeviceFree(dev);
+    if (rv < 0)
+        VIR_FREE(ret->names.names_val);
+    return rv;
+}
 
 static int
 remoteDispatchNodeDeviceLookupByName(
@@ -3229,7 +3745,49 @@ cleanup:
     return rv;
 }
 
-/* remoteDispatchNodeGetCellsFreeMemory has to be implemented manually */
+static int
+remoteDispatchNodeGetCellsFreeMemory(
+    struct qemud_server *server ATTRIBUTE_UNUSED,
+    struct qemud_client *client ATTRIBUTE_UNUSED,
+    virConnectPtr conn,
+    remote_message_header *hdr ATTRIBUTE_UNUSED,
+    remote_error *rerr,
+    remote_node_get_cells_free_memory_args *args,
+    remote_node_get_cells_free_memory_ret *ret)
+{
+    int rv = -1;
+    int len;
+
+    if (!conn) {
+        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
+        goto cleanup;
+    }
+
+    if (args->maxCells > REMOTE_NODE_MAX_CELLS) {
+        virNetError(VIR_ERR_INTERNAL_ERROR,
+                    "%s", _("maxfreeMems > REMOTE_NODE_MAX_CELLS"));
+        goto cleanup;
+    }
+
+    /* Allocate return buffer. */
+    if (VIR_ALLOC_N(ret->freeMems.freeMems_val, args->maxCells) < 0) {
+        virReportOOMError();
+        goto cleanup;
+    }
+
+    if ((len = virNodeGetCellsFreeMemory(conn, (unsigned long long *)ret->freeMems.freeMems_val, args->startCell, args->maxCells)) <= 0)
+        goto cleanup;
+
+    ret->freeMems.freeMems_len = len;
+    rv = 0;
+
+cleanup:
+    if (rv < 0)
+        remoteDispatchError(rerr);
+    if (rv < 0)
+        VIR_FREE(ret->freeMems.freeMems_val);
+    return rv;
+}
 
 static int
 remoteDispatchNodeGetFreeMemory(
@@ -3265,7 +3823,52 @@ cleanup:
 
 /* remoteDispatchNodeGetSecurityModel has to be implemented manually */
 
-/* remoteDispatchNodeListDevices has to be implemented manually */
+static int
+remoteDispatchNodeListDevices(
+    struct qemud_server *server ATTRIBUTE_UNUSED,
+    struct qemud_client *client ATTRIBUTE_UNUSED,
+    virConnectPtr conn,
+    remote_message_header *hdr ATTRIBUTE_UNUSED,
+    remote_error *rerr,
+    remote_node_list_devices_args *args,
+    remote_node_list_devices_ret *ret)
+{
+    int rv = -1;
+    char *cap;
+    int len;
+
+    if (!conn) {
+        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
+        goto cleanup;
+    }
+
+    if (args->maxnames > REMOTE_NODE_DEVICE_NAME_LIST_MAX) {
+        virNetError(VIR_ERR_INTERNAL_ERROR,
+                    "%s", _("maxnames > REMOTE_NODE_DEVICE_NAME_LIST_MAX"));
+        goto cleanup;
+    }
+
+    cap = args->cap ? *args->cap : NULL;
+
+    /* Allocate return buffer. */
+    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
+        virReportOOMError();
+        goto cleanup;
+    }
+
+    if ((len = virNodeListDevices(conn, cap, ret->names.names_val, args->maxnames, args->flags)) < 0)
+        goto cleanup;
+
+    ret->names.names_len = len;
+    rv = 0;
+
+cleanup:
+    if (rv < 0)
+        remoteDispatchError(rerr);
+    if (rv < 0)
+        VIR_FREE(ret->names.names_val);
+    return rv;
+}
 
 static int
 remoteDispatchNodeNumOfDevices(
@@ -4316,7 +4919,55 @@ cleanup:
     return rv;
 }
 
-/* remoteDispatchStoragePoolListVolumes has to be implemented manually */
+static int
+remoteDispatchStoragePoolListVolumes(
+    struct qemud_server *server ATTRIBUTE_UNUSED,
+    struct qemud_client *client ATTRIBUTE_UNUSED,
+    virConnectPtr conn,
+    remote_message_header *hdr ATTRIBUTE_UNUSED,
+    remote_error *rerr,
+    remote_storage_pool_list_volumes_args *args,
+    remote_storage_pool_list_volumes_ret *ret)
+{
+    int rv = -1;
+    virStoragePoolPtr pool = NULL;
+    int len;
+
+    if (!conn) {
+        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
+        goto cleanup;
+    }
+
+    if (args->maxnames > REMOTE_STORAGE_VOL_NAME_LIST_MAX) {
+        virNetError(VIR_ERR_INTERNAL_ERROR,
+                    "%s", _("maxnames > REMOTE_STORAGE_VOL_NAME_LIST_MAX"));
+        goto cleanup;
+    }
+
+    if (!(pool = get_nonnull_storage_pool(conn, args->pool)))
+        goto cleanup;
+
+    /* Allocate return buffer. */
+    if (VIR_ALLOC_N(ret->names.names_val, args->maxnames) < 0) {
+        virReportOOMError();
+        goto cleanup;
+    }
+
+    if ((len = virStoragePoolListVolumes(pool, ret->names.names_val, args->maxnames)) < 0)
+        goto cleanup;
+
+    ret->names.names_len = len;
+    rv = 0;
+
+cleanup:
+    if (rv < 0)
+        remoteDispatchError(rerr);
+    if (pool)
+        virStoragePoolFree(pool);
+    if (rv < 0)
+        VIR_FREE(ret->names.names_val);
+    return rv;
+}
 
 static int
 remoteDispatchStoragePoolLookupByName(
diff --git a/daemon/remote_generator.pl b/daemon/remote_generator.pl
index b3cb9b5..e9a60bc 100755
--- a/daemon/remote_generator.pl
+++ b/daemon/remote_generator.pl
@@ -278,27 +278,12 @@ elsif ($opt_b) {
                           "DomainMemoryStats",
                           "DomainMigratePrepare",
                           "DomainMigratePrepare2",
-                          "DomainSnapshotListNames",
                           "GetType",
-                          "ListDefinedDomains",
-                          "ListDefinedInterfaces",
-                          "ListDefinedNetworks",
-                          "ListDefinedStoragePools",
-                          "ListDomains",
-                          "ListInterfaces",
-                          "ListNetworks",
-                          "ListNWFilters",
-                          "ListSecrets",
-                          "ListStoragePools",
                           "NodeDeviceGetParent",
-                          "NodeDeviceListCaps",
-                          "NodeGetCellsFreeMemory",
                           "NodeGetInfo",
                           "NodeGetSecurityModel",
-                          "NodeListDevices",
                           "SecretGetValue",
                           "StoragePoolGetInfo",
-                          "StoragePoolListVolumes",
                           "StorageVolGetInfo");
     } elsif ($structprefix eq "qemu") {
         @ungeneratable = ("MonitorCommand");
@@ -480,12 +465,38 @@ elsif ($opt_b) {
         my $single_ret_var = "undefined";
         my $single_ret_by_ref = 0;
         my $single_ret_check = " == undefined";
+        my $single_ret_as_list = 0;
+        my $single_ret_list_name = "undefined";
+        my $single_ret_list_max_var = "undefined";
+        my $single_ret_list_max_define = "undefined";
 
         if ($calls{$_}->{ret} ne "void") {
             foreach my $ret_member (@{$calls{$_}->{ret_members}}) {
-                if ($ret_member =~ m/(\S+)<\S+>;/) {
-                    push(@ret_list, "ret->$1.$1_val");
-                    push(@ret_list, "ret->$1.$1_len");
+                if ($ret_member =~ m/remote_nonnull_string (\S+)<(\S+)>;/) {
+                    push(@vars_list, "int len");
+                    push(@ret_list, "ret->$1.$1_len = len;");
+                    push(@free_list,
+                         "    if (rv < 0)\n" .
+                         "        VIR_FREE(ret->$1.$1_val);");
+                    $single_ret_var = "len";
+                    $single_ret_by_ref = 0;
+                    $single_ret_check = " < 0";
+                    $single_ret_as_list = 1;
+                    $single_ret_list_name = $1;
+                    $single_ret_list_max_var = "max$1";
+                    $single_ret_list_max_define = $2;
+
+                    if ($calls{$_}->{ProcName} eq "NodeListDevices") {
+                        my $conn = shift(@args_list);
+                        my $cap = shift(@args_list);
+                        unshift(@args_list, "ret->$1.$1_val");
+                        unshift(@args_list, $cap);
+                        unshift(@args_list, $conn);
+                    } else {
+                        my $conn = shift(@args_list);
+                        unshift(@args_list, "ret->$1.$1_val");
+                        unshift(@args_list, $conn);
+                    }
                 } elsif ($ret_member =~ m/remote_nonnull_string (\S+);/) {
                     push(@vars_list, "char *$1");
                     push(@ret_list, "ret->$1 = $1;");
@@ -573,6 +584,23 @@ elsif ($opt_b) {
                     $single_ret_var = $1;
                     $single_ret_by_ref = 0;
                     $single_ret_check = " == NULL";
+                } elsif ($ret_member =~ m/int (\S+)<(\S+)>;/) {
+                    push(@vars_list, "int len");
+                    push(@ret_list, "ret->$1.$1_len = len;");
+                    push(@free_list,
+                         "    if (rv < 0)\n" .
+                         "        VIR_FREE(ret->$1.$1_val);");
+                    $single_ret_var = "len";
+                    $single_ret_by_ref = 0;
+                    $single_ret_check = " < 0";
+                    $single_ret_as_list = 1;
+                    $single_ret_list_name = $1;
+                    $single_ret_list_max_var = "max$1";
+                    $single_ret_list_max_define = $2;
+
+                    my $conn = shift(@args_list);
+                    unshift(@args_list, "ret->$1.$1_val");
+                    unshift(@args_list, $conn);
                 } elsif ($ret_member =~ m/int (\S+);/) {
                     push(@vars_list, "int $1");
                     push(@ret_list, "ret->$1 = $1;");
@@ -586,6 +614,31 @@ elsif ($opt_b) {
                         $single_ret_by_ref = 0;
                         $single_ret_check = " < 0";
                     }
+                } elsif ($ret_member =~ m/hyper (\S+)<(\S+)>;/) {
+                    push(@vars_list, "int len");
+                    push(@ret_list, "ret->$1.$1_len = len;");
+                    push(@free_list,
+                         "    if (rv < 0)\n" .
+                         "        VIR_FREE(ret->$1.$1_val);");
+                    $single_ret_var = "len";
+                    $single_ret_by_ref = 0;
+                    $single_ret_as_list = 1;
+                    $single_ret_list_name = $1;
+                    $single_ret_list_max_define = $2;
+
+                    my $conn = shift(@args_list);
+
+                    if ($calls{$_}->{ProcName} eq "NodeGetCellsFreeMemory") {
+                        $single_ret_check = " <= 0";
+                        $single_ret_list_max_var = "maxCells";
+                        unshift(@args_list, "(unsigned long long *)ret->$1.$1_val");
+                    } else {
+                        $single_ret_check = " < 0";
+                        $single_ret_list_max_var = "max$1";
+                        unshift(@args_list, "ret->$1.$1_val");
+                    }
+
+                    unshift(@args_list, $conn);
                 } elsif ($ret_member =~ m/hyper (\S+);/) {
                     push(@vars_list, "unsigned long $1");
                     push(@ret_list, "ret->$1 = $1;");
@@ -613,6 +666,15 @@ elsif ($opt_b) {
         print "    }\n";
         print "\n";
 
+        if ($single_ret_as_list) {
+            print "    if (args->$single_ret_list_max_var > $single_ret_list_max_define) {\n";
+            print "        virNetError(VIR_ERR_INTERNAL_ERROR,\n";
+            print "                    \"%s\", _(\"max$single_ret_list_name > $single_ret_list_max_define\"));\n";
+            print "        goto cleanup;\n";
+            print "    }\n";
+            print "\n";
+        }
+
         print join("\n", @getters_list);
 
         if (@getters_list) {
@@ -649,7 +711,8 @@ elsif ($opt_b) {
                 $calls{$_}->{ProcName} eq "GetMaxVcpus" or
                 $calls{$_}->{ProcName} eq "DomainXMLFromNative" or
                 $calls{$_}->{ProcName} eq "DomainXMLToNative" or
-                $calls{$_}->{ProcName} eq "FindStoragePoolSources") {
+                $calls{$_}->{ProcName} eq "FindStoragePoolSources" or
+                $calls{$_}->{ProcName} =~ m/^List/) {
                 $prefix = "Connect"
             } elsif ($calls{$_}->{ProcName} eq "SupportsFeature") {
                 $prefix = "Drv"
@@ -669,6 +732,16 @@ elsif ($opt_b) {
                 $proc_name = "DomainGetOSType"
             }
 
+            if ($single_ret_as_list) {
+                print "    /* Allocate return buffer. */\n";
+                print "    if (VIR_ALLOC_N(ret->$single_ret_list_name.${single_ret_list_name}_val," .
+                      " args->$single_ret_list_max_var) < 0) {\n";
+                print "        virReportOOMError();\n";
+                print "        goto cleanup;\n";
+                print "    }\n";
+                print "\n";
+            }
+
             if ($single_ret_by_ref) {
                 print "    if (vir$prefix$proc_name(";
                 print join(', ', @args_list);
-- 
1.7.0.4




More information about the libvir-list mailing list