[libvirt] [PATCH 5/9] admin: Introduce virAdmConnectGetLibVersion

Michal Privoznik mprivozn at redhat.com
Wed Oct 14 11:25:31 UTC 2015


On 13.10.2015 15:38, Erik Skultety wrote:
> Introduce a new API to get libvirt version. It is worth noting, that
> libvirt-admin and libvirt share the same version number. Unfortunately,
> our existing API isn't generic enough to be used with virAdmConnectPtr
> as well. Also this patch wires up this API to the virt-admin client
> as a generic cmdVersion command.
> ---
>  daemon/admin_server.c           |  9 ++++++
>  include/libvirt/libvirt-admin.h |  3 ++
>  po/POTFILES.in                  |  1 +
>  src/admin/admin_protocol.x      | 11 ++++++-
>  src/libvirt-admin.c             | 31 +++++++++++++++++++
>  src/libvirt_admin_private.syms  |  1 +
>  src/libvirt_admin_public.syms   |  1 +
>  src/rpc/gendispatch.pl          | 11 +++++--
>  tools/virt-admin.c              | 67 +++++++++++++++++++++++++++++++++++++++++
>  9 files changed, 132 insertions(+), 3 deletions(-)

You forgot to update src/admin_protocol-structs.

> 
> diff --git a/daemon/admin_server.c b/daemon/admin_server.c
> index 712a44b..189091e 100644
> --- a/daemon/admin_server.c
> +++ b/daemon/admin_server.c
> @@ -114,4 +114,13 @@ adminDispatchConnectClose(virNetServerPtr server ATTRIBUTE_UNUSED,
>      return 0;
>  }
>  
> +static int
> +adminConnectGetLibVersion(virNetDaemonPtr dmn ATTRIBUTE_UNUSED,
> +                          unsigned long long *libVer)
> +{
> +    if (libVer)
> +        *libVer = LIBVIR_VERSION_NUMBER;
> +    return 0;
> +}
> +
>  #include "admin_dispatch.h"
> diff --git a/include/libvirt/libvirt-admin.h b/include/libvirt/libvirt-admin.h
> index 4539ac6..2358173 100644
> --- a/include/libvirt/libvirt-admin.h
> +++ b/include/libvirt/libvirt-admin.h
> @@ -73,6 +73,9 @@ int virAdmConnectRegisterCloseCallback(virAdmConnectPtr conn,
>  int virAdmConnectUnregisterCloseCallback(virAdmConnectPtr conn,
>                                           virAdmConnectCloseFunc cb);
>  
> +int virAdmConnectGetLibVersion(virAdmConnectPtr conn,
> +                               unsigned long long *libVer);
> +
>  # ifdef __cplusplus
>  }
>  # endif
> diff --git a/po/POTFILES.in b/po/POTFILES.in
> index d0840f4..e165a08 100644
> --- a/po/POTFILES.in
> +++ b/po/POTFILES.in
> @@ -1,3 +1,4 @@
> +daemon/admin_dispatch.h
>  daemon/admin_server.c
>  daemon/libvirtd-config.c
>  daemon/libvirtd.c
> diff --git a/src/admin/admin_protocol.x b/src/admin/admin_protocol.x
> index d0ca1a3..878983d 100644
> --- a/src/admin/admin_protocol.x
> +++ b/src/admin/admin_protocol.x
> @@ -41,6 +41,10 @@ struct admin_connect_open_args {
>      unsigned int flags;
>  };
>  
> +struct admin_connect_get_lib_version_ret {
> +    unsigned hyper libVer;
> +};
> +
>  /* Define the program number, protocol version and procedure numbers here. */
>  const ADMIN_PROGRAM = 0x06900690;
>  const ADMIN_PROTOCOL_VERSION = 1;
> @@ -71,5 +75,10 @@ enum admin_procedure {
>      /**
>       * @generate: none
>       */
> -    ADMIN_PROC_CONNECT_CLOSE = 2
> +    ADMIN_PROC_CONNECT_CLOSE = 2,
> +
> +    /**
> +     * @generate: both
> +     */
> +    ADMIN_PROC_CONNECT_GET_LIB_VERSION = 3
>  };
> diff --git a/src/libvirt-admin.c b/src/libvirt-admin.c
> index 9ad124e..2da3d43 100644
> --- a/src/libvirt-admin.c
> +++ b/src/libvirt-admin.c
> @@ -604,3 +604,34 @@ int virAdmConnectUnregisterCloseCallback(virAdmConnectPtr conn,
>      virDispatchError(NULL);
>      return -1;
>  }
> +
> +/**
> + * virAdmConnectGetLibVersion:
> + * @conn: pointer to an active admin connection
> + * @libVer: stores the current remote libvirt version number
> + *
> + * Retrieves the remote side libvirt version used by the daemon. Format
> + * returned in @libVer is of a following pattern:
> + * major * 1,000,000 + minor * 1,000 + release.
> + *
> + * Returns 0 on success, -1 on failure and @libVer follows this format:
> + */
> +int virAdmConnectGetLibVersion(virAdmConnectPtr conn,
> +                               unsigned long long *libVer)
> +{
> +    VIR_DEBUG("conn=%p, libVir=%p", conn, libVer);
> +
> +    virResetLastError();
> +
> +    virCheckAdmConnectReturn(conn, -1);
> +    virCheckNonNullArgReturn(libVer, -1);
> +
> +    if (remoteAdminConnectGetLibVersion(conn, libVer) < 0)
> +        goto error;
> +
> +    return 0;
> +
> + error:
> +    virDispatchError(NULL);
> +    return -1;
> +}
> diff --git a/src/libvirt_admin_private.syms b/src/libvirt_admin_private.syms
> index 401cd4e..85380dc 100644
> --- a/src/libvirt_admin_private.syms
> +++ b/src/libvirt_admin_private.syms
> @@ -6,6 +6,7 @@
>  #
>  
>  # admin/admin_protocol.x
> +xdr_admin_connect_get_lib_version_ret;
>  xdr_admin_connect_open_args;
>  
>  # Let emacs know we want case-insensitive sorting
> diff --git a/src/libvirt_admin_public.syms b/src/libvirt_admin_public.syms
> index 5b9ba51..273af4d 100644
> --- a/src/libvirt_admin_public.syms
> +++ b/src/libvirt_admin_public.syms
> @@ -18,4 +18,5 @@ LIBVIRT_ADMIN_1.3.0 {
>          virAdmConnectIsAlive;
>          virAdmConnectRegisterCloseCallback;
>          virAdmConnectUnregisterCloseCallback;
> +        virAdmConnectGetLibVersion;
>  };
> diff --git a/src/rpc/gendispatch.pl b/src/rpc/gendispatch.pl
> index b6d50f3..d5be6e8 100755
> --- a/src/rpc/gendispatch.pl
> +++ b/src/rpc/gendispatch.pl
> @@ -50,7 +50,7 @@ my $protocol = shift or die "missing protocol argument";
>  my @autogen;
>  
>  my $connect_ptr = $structprefix eq "admin" ? "virAdmConnectPtr" : "virConnectPtr";
> -my $prefix = ($structprefix eq "admin") ? "adm" : "vir";
> +my $prefix = ($structprefix eq "admin") ? "admin" : "vir";
>  
>  sub fixup_name {
>      my $name = shift;
> @@ -125,7 +125,9 @@ sub push_privconn {
>  # Read the input file (usually remote_protocol.x) and form an
>  # opinion about the name, args and return type of each RPC.
>  my ($name, $ProcName, $id, $flags, %calls, @calls, %opts);
> -
> +#print "procprefix $procprefix\n";
> +#print "structprefix $structprefix\n";
> +#print "protocol $protocol\n";

Looks like a leftover from some debugging?

>  my $collect_args_members = 0;
>  my $collect_ret_members = 0;
>  my $collect_opts = 0;
> @@ -1401,8 +1403,13 @@ elsif ($mode eq "client") {
>                      my $ret_name = $1;
>  
>                      if ($call->{ProcName} =~ m/Get(Lib)?Version/) {
> +                        if ($structprefix eq "admin") {
> +                            push(@args_list, "unsigned long long *$ret_name");
> +                            push(@ret_list, "*$ret_name = ret.$ret_name;");
> +                    } else {
>                          push(@args_list, "unsigned long *$ret_name");
>                          push(@ret_list, "if ($ret_name) HYPER_TO_ULONG(*$ret_name, ret.$ret_name);");
> +                    }


Do you plan to indent these ^^ lines?

>                          push(@ret_list, "rv = 0;");
>                          $single_ret_var = "int rv = -1";
>                          $single_ret_type = "int";
> diff --git a/tools/virt-admin.c b/tools/virt-admin.c
> index 679ae99..0c807f2 100644
> --- a/tools/virt-admin.c
> +++ b/tools/virt-admin.c
> @@ -143,6 +143,67 @@ vshAdmReconnect(vshControl *ctl)
>      disconnected = 0;
>  }
>  
> +/*
> + * "version" command
> + */
> +static const vshCmdInfo info_version[] = {
> +    {.name = "help",
> +     .data = N_("show version")
> +    },
> +    {.name = "desc",
> +     .data = N_("Display the system and also the daemon version information.")
> +    },
> +    {.name = NULL}
> +};
> +
> +static bool
> +cmdVersion(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED)
> +{
> +    unsigned long libVersion;
> +    unsigned long long includeVersion;
> +    unsigned long long daemonVersion;
> +    int ret;
> +    unsigned int major;
> +    unsigned int minor;
> +    unsigned int rel;
> +    vshAdmControlPtr priv = ctl->privData;
> +
> +    includeVersion = LIBVIR_VERSION_NUMBER;
> +    major = includeVersion / 1000000;
> +    includeVersion %= 1000000;
> +    minor = includeVersion / 1000;
> +    rel = includeVersion % 1000;
> +    vshPrint(ctl, _("Compiled against library: libvirt %d.%d.%d\n"),
> +             major, minor, rel);
> +
> +    ret = virGetVersion(&libVersion, NULL, NULL);
> +    if (ret < 0) {
> +        vshError(ctl, "%s", _("failed to get the library version"));
> +        return false;
> +    }
> +    major = libVersion / 1000000;
> +    libVersion %= 1000000;
> +    minor = libVersion / 1000;
> +    rel = libVersion % 1000;
> +    vshPrint(ctl, _("Using library: libvirt %d.%d.%d\n"),
> +             major, minor, rel);
> +
> +    ret = virAdmConnectGetLibVersion(priv->conn, &daemonVersion);
> +    if (ret < 0) {
> +        vshError(ctl, "%s", _("failed to get the daemon version"));
> +    } else {
> +        major = daemonVersion / 1000000;
> +        daemonVersion %= 1000000;
> +        minor = daemonVersion / 1000;
> +        rel = daemonVersion % 1000;
> +        vshPrint(ctl, _("Running against daemon: %d.%d.%d\n"),
> +                 major, minor, rel);
> +    }
> +
> +    return true;
> +}
> +
> +
>  /* ---------------
>   * Command Connect
>   * ---------------
> @@ -480,6 +541,12 @@ static const vshCmdDef vshAdmCmds[] = {
>      VSH_CMD_HELP,
>      VSH_CMD_PWD,
>      VSH_CMD_QUIT,
> +    {.name = "version",
> +     .handler = cmdVersion,
> +     .opts = NULL,
> +     .info = info_version,
> +     .flags = 0
> +    },
>      {.name = "connect",
>       .handler = cmdConnect,
>       .opts = opts_connect,
> 

Otherwise looking good.

Michal




More information about the libvir-list mailing list