[libvirt] [PATCH v2 2/5] cpu_models: implement the remote protocol

Daniel P. Berrange berrange at redhat.com
Tue Sep 10 14:41:56 UTC 2013


On Sat, Sep 07, 2013 at 01:11:23AM +0200, Giuseppe Scrivano wrote:
> Signed-off-by: Giuseppe Scrivano <gscrivan at redhat.com>
> ---
>  daemon/remote.c              | 47 +++++++++++++++++++++++++++++++++++
>  src/remote/remote_driver.c   | 59 ++++++++++++++++++++++++++++++++++++++++++++
>  src/remote/remote_protocol.x | 20 ++++++++++++++-
>  src/remote_protocol-structs  | 11 +++++++++
>  4 files changed, 136 insertions(+), 1 deletion(-)
> 
> diff --git a/daemon/remote.c b/daemon/remote.c
> index 2aff7c1..4846ccb 100644
> --- a/daemon/remote.c
> +++ b/daemon/remote.c
> @@ -5037,6 +5037,53 @@ cleanup:
>  
>  
>  static int
> +remoteDispatchConnectGetCPUModelNames(virNetServerPtr server ATTRIBUTE_UNUSED,
> +                                      virNetServerClientPtr client ATTRIBUTE_UNUSED,
> +                                      virNetMessagePtr msg ATTRIBUTE_UNUSED,
> +                                      virNetMessageErrorPtr rerr,
> +                                      remote_connect_get_cpu_model_names_args *args,
> +                                      remote_connect_get_cpu_model_names_ret *ret)
> +{
> +    int rv = -1;
> +    char **models;
> +    struct daemonClientPrivate *priv =
> +        virNetServerClientGetPrivateData(client);
> +
> +    if (!priv->conn) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
> +        goto cleanup;
> +    }
> +
> +    if (virConnectGetCPUModelNames(priv->conn, args->arch, &models,
> +                                   args->flags) < 0)
> +        goto cleanup;
> +
> +    ret->models.models_val = models;
> +    ret->models.models_len = 0;
> +    while (*models++)
> +        ret->models.models_len++;

You can avoid this if you make the API return value indicate the number
of models.

> +
> +    if (ret->models.models_len > REMOTE_CONNECT_CPU_MODELS_MAX) {
> +        virReportError(VIR_ERR_RPC,
> +                       _("Too many CPU models '%d' for limit '%d'"),
> +                       ret->models.models_len, REMOTE_CONNECT_CPU_MODELS_MAX);
> +
> +        for (models = ret->models.models_val; *models; models++)
> +            VIR_FREE(*models);
> +        VIR_FREE(ret->models.models_val);

virStringFeeList(models)

> +        goto cleanup;
> +    }
> +
> +    rv = 0;
> +
> +cleanup:
> +    if (rv < 0)
> +        virNetMessageSaveError(rerr);
> +    return rv;
> +}
> +
> +
> +static int
>  remoteDispatchDomainCreateXMLWithFiles(virNetServerPtr server ATTRIBUTE_UNUSED,
>                                         virNetServerClientPtr client,
>                                         virNetMessagePtr msg ATTRIBUTE_UNUSED,
> diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
> index 62e77a5..1b6635f 100644
> --- a/src/remote/remote_driver.c
> +++ b/src/remote/remote_driver.c
> @@ -5541,6 +5541,64 @@ done:
>  
>  
>  static int
> +remoteConnectGetCPUModelNames(virConnectPtr conn,
> +                              const char *arch,
> +                              char ***models,
> +                              unsigned int flags)
> +{
> +    int rv = -1;
> +    size_t i;
> +    char **retmodels;
> +    remote_connect_get_cpu_model_names_args args;
> +    remote_connect_get_cpu_model_names_ret ret;
> +    struct private_data *priv = conn->privateData;
> +    remoteDriverLock(priv);
> +
> +    memset(&args, 0, sizeof(args));
> +    memset(&ret, 0, sizeof(ret));
> +
> +    args.arch = (char *) arch;
> +    args.flags = flags;
> +
> +    if (call(conn, priv, 0, REMOTE_PROC_CONNECT_GET_CPU_MODEL_NAMES,
> +             (xdrproc_t) xdr_remote_connect_get_cpu_model_names_args,
> +             (char *) &args,
> +             (xdrproc_t) xdr_remote_connect_get_cpu_model_names_ret,
> +             (char *) &ret) < 0)
> +        goto error;
> +
> +    /* Check the length of the returned list carefully. */
> +    if (ret.models.models_len > REMOTE_CONNECT_CPU_MODELS_MAX) {
> +        virReportError(VIR_ERR_RPC, "%s",
> +                       _("remoteConnectGetCPUModelNames: "
> +                         "returned number of CPU models exceeds limit"));
> +        goto error;
> +    }
> +
> +    if (VIR_ALLOC_N(retmodels, ret.models.models_len + 1) < 0)
> +        goto error;
> +
> +    for (i = 0; i < ret.models.models_len; i++)
> +        retmodels[i] = ret.models.models_val[i];
> +
> +    /* Caller frees MODELS.  */
> +    *models = retmodels;
> +    rv = 0;
> +
> +done:
> +    remoteDriverUnlock(priv);
> +    return rv;
> +
> +error:
> +    rv = -1;
> +    for (i = 0; i < ret.models.models_len; i++)
> +        VIR_FREE(ret.models.models_val[i]);
> +    VIR_FREE(ret.models.models_val);




Daniel
-- 
|: http://berrange.com      -o-    http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org              -o-             http://virt-manager.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org       -o-       http://live.gnome.org/gtk-vnc :|




More information about the libvir-list mailing list