On 06/05/2012 07:19 AM, Peter Krempa wrote:
This patch wires up the RPC protocol handlers for
virConnectListAllDomains(). The RPC generator has no support for the way
how virConnectListAllDomains() returns the results so the handler code
had to be done manually.
We might end up teaching the generator how to do this, as we add more
ListAll* commands (for example, I'm in the middle of writing the series
for virDomainListAllSnapshots, using this series as my template), but
updating the generator is a story for another day.
The new api is handled by REMOTE_PROC_CONNECT_LIST_ALL_DOMAINS, with
number 271 and marked with high priority.
---
Diff to v1:
Add the NULL element at the end of the list.
---
daemon/remote.c | 52 ++++++++++++++++++++++++++++++++++
src/remote/remote_driver.c | 63 ++++++++++++++++++++++++++++++++++++++++++
src/remote/remote_protocol.x | 14 ++++++++-
src/remote_protocol-structs | 12 ++++++++
4 files changed, 140 insertions(+), 1 deletions(-)
+++ b/daemon/remote.c
@@ -996,6 +996,58 @@ no_memory:
}
static int
+remoteDispatchConnectListAllDomains(virNetServerPtr server ATTRIBUTE_UNUSED,
+ virNetServerClientPtr client,
+ virNetMessagePtr msg ATTRIBUTE_UNUSED,
+ virNetMessageErrorPtr rerr,
+ remote_connect_list_all_domains_args *args,
+ remote_connect_list_all_domains_ret *ret)
+{
+ if ((ndomains = virConnectListAllDomains(priv->conn,
+ args->need_results ? &doms : NULL,
+ args->flags)) < 0)
+ goto cleanup;
+
+ if (doms) {
Use 'if (doms && ndomains)' to avoid a pointless 0-length array
allocation.
+ if (VIR_ALLOC_N(ret->domains.domains_val, ndomains) <
0) {
+ virReportOOMError();
+ goto cleanup;
+ }
+
+ ret->domains.domains_len = ndomains;
+
+ for (i = 0; i < ndomains; i++)
+ make_nonnull_domain(ret->domains.domains_val+i, doms[i]);
Style nit - spaces around '+'.
Ouch - we have a latent bug. make_nonnull_domain and friends do
strdup() without checking for NULL. Not your fault, but we should
really clean that up to trigger the OOM handler instead.
+ } else {
+ ret->domains.domains_len = 0;
+ ret->domains.domains_val = NULL;
+ }
+
+ rv = ndomains;
+
+cleanup:
+ if (rv < 0)
+ virNetMessageSaveError(rerr);
+ if (doms) {
+ for (i = 0; i < ndomains;i++)
Style nit - space after second ';'.
+++ b/src/remote/remote_protocol.x
@@ -2463,6 +2463,16 @@ struct remote_domain_get_disk_errors_ret {
int nerrors;
};
+struct remote_connect_list_all_domains_args {
+ bool need_results;
s/bool/int/ - I'm not sure that rpcgen will gracefully handle 'bool' on
all platforms (just because glibc supports it doesn't make it valid XDR
notation everywhere else).
+++ b/src/remote_protocol-structs
@@ -1921,6 +1921,17 @@ struct remote_domain_get_disk_errors_ret {
} errors;
int nerrors;
};
+struct remote_connect_list_all_domains_args {
+ bool need_results;
If you have dwarves-1.9 installed, it's broken, hence you were not
actually testing this file. Upgrade to dwarves-1.10.
If you have dwarves-1.10 installed, you will notice that this shows up
as 'bool_t' and not bool (don't know why the debug information encodes
things that way, but that's what we have to live with). All the more
reason to use int, not bool, in the .x file.
I'll go ahead and prepare a patch for the OOM bug in daemon/remote.c,
but meanwhile, I think I can ACK this patch with nits fixed, without
having to see a v3, since the changes are pretty small.
--
Eric Blake eblake(a)redhat.com +1-919-301-3266
Libvirt virtualization library
http://libvirt.org