[libvirt] [PATCH 4/8] admin: Introduce virAdmConnectGetLoggingOutputs

John Ferlan jferlan at redhat.com
Wed Nov 9 16:23:44 UTC 2016



On 11/01/2016 06:27 AM, Erik Skultety wrote:
> Enable libvirt users to query logging output settings.
> 
> Signed-off-by: Erik Skultety <eskultet at redhat.com>
> ---
>  daemon/admin.c                  | 52 +++++++++++++++++++++++++++++++++++++++++
>  include/libvirt/libvirt-admin.h |  4 ++++
>  src/admin/admin_protocol.x      | 16 ++++++++++++-
>  src/admin/admin_remote.c        | 43 ++++++++++++++++++++++++++++++++++
>  src/admin_protocol-structs      |  8 +++++++
>  src/libvirt-admin.c             | 39 +++++++++++++++++++++++++++++++
>  src/libvirt_admin_private.syms  |  2 ++
>  src/libvirt_admin_public.syms   |  1 +
>  8 files changed, 164 insertions(+), 1 deletion(-)
> 
> diff --git a/daemon/admin.c b/daemon/admin.c
> index a3c8b89..b31b125 100644
> --- a/daemon/admin.c
> +++ b/daemon/admin.c
> @@ -383,4 +383,56 @@ adminDispatchServerSetClientLimits(virNetServerPtr server ATTRIBUTE_UNUSED,
>      virObjectUnref(srv);
>      return rv;
>  }
> +

/* Returns: Count of outputs? */

> +static int
> +adminConnectGetLoggingOutputs(char **outputs, unsigned int flags)
> +{
> +    char *tmp = NULL;
> +    int ret = -1;
> +
> +    virCheckFlags(0, -1);
> +
> +    if ((ret = virLogGetNbOutputs()) > 0) {
> +        if (!(tmp = virLogGetOutputs()))
> +            return -1;
> +    } else {
> +        /* there were no outputs defined, return an empty string */
> +        if (!tmp) {

How would tmp have anything?

> +            if (VIR_ALLOC(tmp) < 0)
> +                return -1;
> +            memset(tmp, 0, 1);

           if (VIR_STRDUP(tmp, "") < 0)
               return -1;
           ret = 1;

> +        }
> +    }
> +
> +    *outputs = tmp;
> +    return ret;
> +}
> +
> +static int
> +adminDispatchConnectGetLoggingOutputs(virNetServerPtr server ATTRIBUTE_UNUSED,
> +                                      virNetServerClientPtr client ATTRIBUTE_UNUSED,
> +                                      virNetMessagePtr msg ATTRIBUTE_UNUSED,
> +                                      virNetMessageErrorPtr rerr ATTRIBUTE_UNUSED,
> +                                      admin_connect_get_logging_outputs_args *args,
> +                                      admin_connect_get_logging_outputs_ret *ret)
> +{
> +    char *outputs = NULL;
> +    int noutputs = 0;
> +    int rv = -1;
> +
> +    if ((noutputs = adminConnectGetLoggingOutputs(&outputs, args->flags) < 0))
> +        goto cleanup;
> +
> +    if (VIR_STRDUP(ret->outputs, outputs) < 0)
> +        goto cleanup;

Would this be better served as VIR_STEAL_PTR(ret->outputs, outputs);

> +
> +    ret->noutputs = noutputs;
> +    rv = 0;
> +
> + cleanup:
> +    if (rv < 0)
> +        virNetMessageSaveError(rerr);

rerr not really UNUSED then?

The failure path could just be inlined thus removing need for cleanup
label and local rv

> +    VIR_FREE(outputs);
> +    return rv;
> +}
>  #include "admin_dispatch.h"
> diff --git a/include/libvirt/libvirt-admin.h b/include/libvirt/libvirt-admin.h
> index c810be3..46d2155 100644
> --- a/include/libvirt/libvirt-admin.h
> +++ b/include/libvirt/libvirt-admin.h
> @@ -404,6 +404,10 @@ int virAdmServerSetClientLimits(virAdmServerPtr srv,
>                                  int nparams,
>                                  unsigned int flags);
>  
> +int virAdmConnectGetLoggingOutputs(virAdmConnectPtr conn,
> +                                   char **outputs,
> +                                   unsigned int flags);
> +
>  # ifdef __cplusplus
>  }
>  # endif
> diff --git a/src/admin/admin_protocol.x b/src/admin/admin_protocol.x
> index 5963233..237632a 100644
> --- a/src/admin/admin_protocol.x
> +++ b/src/admin/admin_protocol.x
> @@ -183,6 +183,15 @@ struct admin_server_set_client_limits_args {
>      unsigned int flags;
>  };
>  
> +struct admin_connect_get_logging_outputs_args {
> +    unsigned int flags;
> +};
> +
> +struct admin_connect_get_logging_outputs_ret {
> +    admin_nonnull_string outputs;
> +    unsigned int noutputs;
> +};
> +
>  /* Define the program number, protocol version and procedure numbers here. */
>  const ADMIN_PROGRAM = 0x06900690;
>  const ADMIN_PROTOCOL_VERSION = 1;
> @@ -268,5 +277,10 @@ enum admin_procedure {
>      /**
>       * @generate: none
>       */
> -    ADMIN_PROC_SERVER_SET_CLIENT_LIMITS = 13
> +    ADMIN_PROC_SERVER_SET_CLIENT_LIMITS = 13,
> +
> +    /**
> +     * @generate: none
> +     */
> +    ADMIN_PROC_CONNECT_GET_LOGGING_OUTPUTS = 14
>  };
> diff --git a/src/admin/admin_remote.c b/src/admin/admin_remote.c
> index 10a3b18..de3662c 100644
> --- a/src/admin/admin_remote.c
> +++ b/src/admin/admin_remote.c
> @@ -429,3 +429,46 @@ remoteAdminServerSetClientLimits(virAdmServerPtr srv,
>      virObjectUnlock(priv);
>      return rv;
>  }
> +
> +static int
> +remoteAdminConnectGetLoggingOutputs(virAdmConnectPtr conn,
> +                                    char **outputs,
> +                                    unsigned int flags)
> +{
> +    int rv = -1;
> +    char *tmp_outputs = NULL;
> +    remoteAdminPrivPtr priv = conn->privateData;
> +    admin_connect_get_logging_outputs_args args;
> +    admin_connect_get_logging_outputs_ret ret;
> +
> +    args.flags = flags;
> +
> +    memset(&ret, 0, sizeof(ret));
> +    virObjectLock(priv);
> +
> +    if (call(conn,
> +             0,
> +             ADMIN_PROC_CONNECT_GET_LOGGING_OUTPUTS,
> +             (xdrproc_t) xdr_admin_connect_get_logging_outputs_args,
> +             (char *) &args,
> +             (xdrproc_t) xdr_admin_connect_get_logging_outputs_ret,
> +             (char *) &ret) == -1)
> +        goto done;
> +
> +    if (outputs) {

virAdmConnectGetLoggingOutputs checks for NonNullArg(outputs)

So this doesn't seem necessary...

> +        if (VIR_STRDUP(tmp_outputs, ret.outputs) < 0)
> +            goto cleanup;

Similar - VIR_STEAL_PTR(*outputs, ret.outputs); should work, right?

> +
> +        *outputs = tmp_outputs;
> +        tmp_outputs = NULL;
> +    }
> +
> +    rv = ret.noutputs;
> +
> + cleanup:
> +    xdr_free((xdrproc_t) xdr_admin_connect_get_logging_outputs_ret, (char *) &ret);
> +
> + done:
> +    virObjectUnlock(priv);
> +    return rv;
> +}
> diff --git a/src/admin_protocol-structs b/src/admin_protocol-structs
> index 1437d9e..096bf5a 100644
> --- a/src/admin_protocol-structs
> +++ b/src/admin_protocol-structs
> @@ -127,6 +127,13 @@ struct admin_server_set_client_limits_args {
>          } params;
>          u_int                      flags;
>  };
> +struct admin_connect_get_logging_outputs_args {
> +        u_int                      flags;
> +};
> +struct admin_connect_get_logging_outputs_ret {
> +        admin_nonnull_string       outputs;
> +        u_int                      noutputs;
> +};
>  enum admin_procedure {
>          ADMIN_PROC_CONNECT_OPEN = 1,
>          ADMIN_PROC_CONNECT_CLOSE = 2,
> @@ -141,4 +148,5 @@ enum admin_procedure {
>          ADMIN_PROC_CLIENT_CLOSE = 11,
>          ADMIN_PROC_SERVER_GET_CLIENT_LIMITS = 12,
>          ADMIN_PROC_SERVER_SET_CLIENT_LIMITS = 13,
> +        ADMIN_PROC_CONNECT_GET_LOGGING_OUTPUTS = 14,
>  };
> diff --git a/src/libvirt-admin.c b/src/libvirt-admin.c
> index 88eef54..264411f 100644
> --- a/src/libvirt-admin.c
> +++ b/src/libvirt-admin.c
> @@ -1106,3 +1106,42 @@ virAdmServerSetClientLimits(virAdmServerPtr srv,
>      virDispatchError(NULL);
>      return ret;
>  }
> +
> +/**
> + * virAdmConnectGetLoggingOutputs:
> + * @conn: pointer to an active admin connection
> + * @outputs: pointer to a variable to store a string containing all currently
> + *           defined logging outputs on daemon (allocated automatically)
> + * @flags: extra flags; not used yet, so callers should always pass 0
> + *
> + * Retrieves a list of currently installed logging outputs. Outputs returned
> + * are contained within an automatically allocated string and delimited by
> + * spaces. The format of each output conforms to the format described in
> + * daemon's configuration file (e.g. libvirtd.conf).

space between paragraphs

> + * To retrieve individual outputs, additional parsing needs to be done by the
> + * caller. Caller is also responsible for freeing @outputs correctly.
> + *
> + * Returns the count of outputs in @outputs, or -1 in case of an error.
> + */
> +int
> +virAdmConnectGetLoggingOutputs(virAdmConnectPtr conn,
> +                               char **outputs,
> +                               unsigned int flags)
> +{
> +    int ret = -1;
> +
> +    VIR_DEBUG("conn=%p, flags=%x", conn, flags);
> +
> +    virResetLastError();
> +    virCheckAdmConnectReturn(conn, -1);
> +    virCheckNonNullArgGoto(outputs, error);

So this seems to go against the remoteAdminConnectGetLoggingOutputs "if
(outputs)" needs/check.

> +
> +    if ((ret = remoteAdminConnectGetLoggingOutputs(conn, outputs,
> +                                                   flags)) < 0)
> +        goto error;
> +
> +    return ret;
> + error:
> +    virDispatchError(NULL);
> +    return -1;
> +}
> diff --git a/src/libvirt_admin_private.syms b/src/libvirt_admin_private.syms
> index 8c173ab..c95aa3c 100644
> --- a/src/libvirt_admin_private.syms
> +++ b/src/libvirt_admin_private.syms
> @@ -10,6 +10,8 @@ xdr_admin_client_close_args;
>  xdr_admin_client_get_info_args;
>  xdr_admin_client_get_info_ret;
>  xdr_admin_connect_get_lib_version_ret;
> +xdr_admin_connect_get_logging_outputs_args;
> +xdr_admin_connect_get_logging_outputs_ret;
>  xdr_admin_connect_list_servers_args;
>  xdr_admin_connect_list_servers_ret;
>  xdr_admin_connect_lookup_server_args;
> diff --git a/src/libvirt_admin_public.syms b/src/libvirt_admin_public.syms
> index 2de28e9..c1420ee 100644
> --- a/src/libvirt_admin_public.syms
> +++ b/src/libvirt_admin_public.syms
> @@ -38,4 +38,5 @@ LIBVIRT_ADMIN_2.0.0 {
>          virAdmClientClose;
>          virAdmServerGetClientLimits;
>          virAdmServerSetClientLimits;
> +        virAdmConnectGetLoggingOutputs;
>  };

Doesn't this need to be a new stanza similar to libvirt_public.syms, e.g.:

LIBVIRT_ADMIN_2.5.0 {
    global:
        virAdmConnectGetLoggingOutputs;
} LIBVIRT_ADMIN_2.0.0;

with obvious additions for the next 3 patches.

John




More information about the libvir-list mailing list