[libvirt] [PATCH] qemu_agent: support guest-info command

Daniel P. Berrange berrange at redhat.com
Fri Jun 29 14:55:24 UTC 2012


On Fri, Jun 29, 2012 at 01:58:05PM +0900, MATSUDA, Daiki wrote:

> diff -uNrp libvirt-0.9.13.orig/daemon/remote.c libvirt-0.9.13/daemon/remote.c
> --- libvirt-0.9.13.orig/daemon/remote.c	2012-06-25 16:06:18.000000000 +0900
> +++ libvirt-0.9.13/daemon/remote.c	2012-06-29 12:50:03.752806682 +0900
> @@ -3923,6 +3923,42 @@ cleanup:
>      return rv;
>  }
>  
> +
> +static int
> +remoteDispatchDomainQemuAgentCommand(virNetServerPtr server ATTRIBUTE_UNUSED,
> +                                     virNetServerClientPtr client ATTRIBUTE_UNUSED,
> +                                     virNetMessagePtr msg ATTRIBUTE_UNUSED,
> +                                     virNetMessageErrorPtr rerr,
> +                                     remote_domain_qemu_agent_command_args *args,
> +                                     remote_domain_qemu_agent_command_ret *ret)
> +{
> +    virDomainPtr dom = NULL;
> +    int rv = -1;
> +    struct daemonClientPrivate *priv =
> +        virNetServerClientGetPrivateData(client);
> +
> +    if (!priv->conn) {
> +        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("connection not open"));
> +        goto cleanup;
> +    }
> +
> +    if (!(dom = get_nonnull_domain(priv->conn, args->dom)))
> +        goto cleanup;
> +
> +    if (virDomainQemuAgentCommand(dom, args->cmd, &ret->result, args->flags) <0) {
> +        virNetError(VIR_ERR_INTERNAL_ERROR, "%s", _("Guest Agent Error"));
> +        goto cleanup;
> +    }
> +
> +    rv = 0;
> +cleanup:
> +    if (rv < 0)
> +        virNetMessageSaveError(rerr);
> +    if (dom)
> +        virDomainFree(dom);
> +    return rv;
> +}
> +
>  /*----- Helpers. -----*/
>  
>  /* get_nonnull_domain and get_nonnull_network turn an on-wire
> diff -uNrp libvirt-0.9.13.orig/daemon/remote_dispatch.h libvirt-0.9.13/daemon/remote_dispatch.h
> --- libvirt-0.9.13.orig/daemon/remote_dispatch.h	2012-06-25 19:48:08.000000000 +0900
> +++ libvirt-0.9.13/daemon/remote_dispatch.h	2012-06-29 10:21:21.460454579 +0900
> @@ -12889,6 +12889,28 @@ static int remoteDispatchSupportsFeature
>  
>  
>  
> +static int remoteDispatchDomainQemuAgentCommand(
> +    virNetServerPtr server,
> +    virNetServerClientPtr client,
> +    virNetMessagePtr msg,
> +    virNetMessageErrorPtr rerr,
> +    remote_domain_qemu_agent_command_args *args,
> +    remote_domain_qemu_agent_command_ret *ret);
> +static int remoteDispatchDomainQemuAgentCommandHelper(
> +    virNetServerPtr server,
> +    virNetServerClientPtr client,
> +    virNetMessagePtr msg,
> +    virNetMessageErrorPtr rerr,
> +    void *args,
> +    void *ret)
> +{
> +  VIR_DEBUG("server=%p client=%p msg=%p rerr=%p args=%p ret=%p", server, client, msg, rerr, args, ret);
> +  return remoteDispatchDomainQemuAgentCommand(server, client, msg, rerr, args, ret);
> +}
> +/* remoteDispatchDomainQemuAgentCommand body has to be implemented manually */
> +
> +
> +
>  virNetServerProgramProc remoteProcs[] = {
>  { /* Unused 0 */
>     NULL,
> @@ -15374,5 +15396,14 @@ virNetServerProgramProc remoteProcs[] = 
>     true,
>     1
>  },
> +{ /* Method DomainQemuAgentCommand => 276 */
> +   remoteDispatchDomainQemuAgentCommandHelper,
> +   sizeof(remote_domain_qemu_agent_command_args),
> +   (xdrproc_t)xdr_remote_qemu_agent_command_args,
> +   sizeof(remote_domain_qemu_agent_command_ret),
> +   (xdrproc_t)remote_domain_qemu_agent_command_ret,
> +   true,
> +   0
> +},
>  };
>  size_t remoteNProcs = ARRAY_CARDINALITY(remoteProcs);

This is an auto-generated file. Instead of doing a diff against
two unpacked tar.gz archives, developer against a git checkout,
and use GIT to produce the patch without the auto-generated
cruft.

> diff -uNrp libvirt-0.9.13.orig/include/libvirt/libvirt.h.in libvirt-0.9.13/include/libvirt/libvirt.h.in
> --- libvirt-0.9.13.orig/include/libvirt/libvirt.h.in	2012-06-25 21:42:32.000000000 +0900
> +++ libvirt-0.9.13/include/libvirt/libvirt.h.in	2012-06-29 11:22:38.113455058 +0900
> @@ -4132,6 +4132,9 @@ typedef struct _virTypedParameter virMem
>   */
>  typedef virMemoryParameter *virMemoryParameterPtr;
>  
> +int virDomainQemuAgentCommand(virDomainPtr domain, const char *cmd,
> +                              char **result, unsigned int flags);
> +
>  #ifdef __cplusplus
>  }
>  #endif


This should be in libvirt-qemu.h



> diff -uNrp libvirt-0.9.13.orig/src/libvirt.c libvirt-0.9.13/src/libvirt.c
> --- libvirt-0.9.13.orig/src/libvirt.c	2012-06-28 12:05:04.000000000 +0900
> +++ libvirt-0.9.13/src/libvirt.c	2012-06-29 12:51:51.336454508 +0900
> @@ -18973,3 +18973,44 @@ error:
>      virDispatchError(dom->conn);
>      return -1;
>  }
> +
> +/**
> + * virDomainQemuAgentCommand:
> + * @domain: a domain object
> + * @cmd: execution command on domain's guest agent
> + * @result: returning strings
> + * @flags: execution flags
> + *
> + * Provide a list of Guest Agent's support command.
> + * Returns 0 if succeeded, -1 in failing.
> + */
> +int
> +virDomainQemuAgentCommand(virDomainPtr domain,
> +                          const char *cmd,
> +                          char **result,
> +                          unsigned int flags)
> +{
> +    virConnectPtr conn;
> +    int ret = -1;
> +
> +    if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
> +        virLibDomainError(VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
> +        return ret;
> +    }
> +
> +    conn = domain->conn;
> +
> +    if (conn->driver->domainQemuAgentCommand) {
> +        ret = conn->driver->domainQemuAgentCommand(domain, cmd, result, flags);
> +        if (ret < 0)
> +            goto error;
> +        return ret;
> +    }
> +
> +    virLibDomainError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
> +
> +error:
> +    /* Copy to connection error object for back compatability */
> +    virDispatchError(domain->conn);
> +    return ret;
> +}

Should be in libvirt-qemu.c


> diff -uNrp libvirt-0.9.13.orig/src/libvirt_public.syms libvirt-0.9.13/src/libvirt_public.syms
> --- libvirt-0.9.13.orig/src/libvirt_public.syms	2012-06-25 16:06:18.000000000 +0900
> +++ libvirt-0.9.13/src/libvirt_public.syms	2012-06-29 09:07:00.357580129 +0900
> @@ -542,6 +542,7 @@ LIBVIRT_0.9.13 {
>          virDomainSnapshotIsCurrent;
>          virDomainSnapshotListAllChildren;
>          virDomainSnapshotRef;
> +        virDomainQemuAgentCommand;
>  } LIBVIRT_0.9.11;
>  


Should be in libvirt_qemu.syms

>  static virNetworkDriver network_driver = {
> diff -uNrp libvirt-0.9.13.orig/src/remote/remote_protocol.x libvirt-0.9.13/src/remote/remote_protocol.x
> --- libvirt-0.9.13.orig/src/remote/remote_protocol.x	2012-06-25 16:06:18.000000000 +0900
> +++ libvirt-0.9.13/src/remote/remote_protocol.x	2012-06-29 12:55:43.752580212 +0900
> @@ -2513,6 +2513,16 @@ struct remote_connect_list_all_domains_r
>      unsigned int ret;
>  };
>  
> +struct remote_domain_qemu_agent_command_args {
> +    remote_nonnull_domain dom;
> +    remote_nonnull_string cmd;
> +    u_int flags;
> +};
> +
> +struct remote_domain_qemu_agent_command_ret {
> +    remote_nonnull_string result;
> +};
> +
>  
>  /*----- Protocol. -----*/
>  
> @@ -2838,7 +2848,8 @@ enum remote_procedure {
>      REMOTE_PROC_DOMAIN_SNAPSHOT_HAS_METADATA = 272, /* autogen autogen */
>      REMOTE_PROC_CONNECT_LIST_ALL_DOMAINS = 273, /* skipgen skipgen priority:high */
>      REMOTE_PROC_DOMAIN_LIST_ALL_SNAPSHOTS = 274, /* skipgen skipgen priority:high */
> -    REMOTE_PROC_DOMAIN_SNAPSHOT_LIST_ALL_CHILDREN = 275 /* skipgen skipgen priority:high */
> +    REMOTE_PROC_DOMAIN_SNAPSHOT_LIST_ALL_CHILDREN = 275, /* skipgen skipgen priority:high */
> +    REMOTE_PROC_DOMAIN_QEMU_AGENT_COMMAND = 276 /* skipgen skipgen */
>  
>      /*
>       * Notice how the entries are grouped in sets of 10 ?


This should bein  qemu_protocol.x

Regards,
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