[libvirt] [PATCHv2 3/9] remote: implement remote protocol for virConnectListAllDomains()

Eric Blake eblake at redhat.com
Sun Jun 10 01:42:16 UTC 2012


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.
> 
> 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.

I missed this in my earlier review:


> +++ b/daemon/remote.c
> @@ -996,6 +996,58 @@ no_memory:
>  }
> 
>  static int
> +remoteDispatchConnectListAllDomains(virNetServerPtr server ATTRIBUTE_UNUSED,

> +    } else {
> +        ret->domains.domains_len = 0;
> +        ret->domains.domains_val = NULL;
> +    }
> +
> +    rv = ndomains;

Here, you want:

ret->ret = ndomains;
rv = 0;

> +++ b/src/remote/remote_driver.c
> @@ -1265,6 +1265,68 @@ done:
>      return rv;
>  }
> 
> +static int
> +remoteConnectListAllDomains(virConnectPtr conn,

> +    if (call (conn,
> +              priv,
> +              0,
> +              REMOTE_PROC_CONNECT_LIST_ALL_DOMAINS,
> +              (xdrproc_t) xdr_remote_connect_list_all_domains_args,
> +              (char *) &args,
> +              (xdrproc_t) xdr_remote_connect_list_all_domains_ret,
> +              (char *) &ret) == -1)
> +        goto done;
> +
> +    if (domains) {
> +        if (VIR_ALLOC_N(doms, ret.domains.domains_len + 1) < 0) {
> +            virReportOOMError();
> +            goto cleanup;
> +        }
> +        for (i = 0; i < ret.domains.domains_len; i++) {
> +            doms[i] = get_nonnull_domain(conn, ret.domains.domains_val[i]);
> +            if (!doms[i]) {
> +                virReportOOMError();
> +                goto cleanup;
> +            }
> +        }
> +        *domains = doms;
> +        doms = NULL;
> +    }
> +
> +    rv = ret.domains.domains_len;

and here, you want:

rv = ret.ret;

> +++ 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;
> +    unsigned int flags;
> +};
> +
> +struct remote_connect_list_all_domains_ret {
> +    remote_nonnull_domain domains<>;
> +    unsigned int ret;

That's because the daemon/remote.c doesn't do any special treatment for
positive return values; to specifically pass a positive count, you have
to pass it through the remote_*_ret.ret member.  If need_results was 0
in _args, then ret.domains.domains_len will be 0 in reply, even though
ret should be non-zero for the count of domains.

-- 
Eric Blake   eblake at redhat.com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 620 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20120609/cea2426b/attachment-0001.sig>


More information about the libvir-list mailing list