By the way, I am trying to re-write to move some functions to libvirt-qemu as you adviced. But the result is not good not to print Guest Agent's command response... In addition, VIR_DEBUG() in src/libvirt-qemu.c also does not output to log file.

Though I minded much before, I think that 'qemu-monitor-command' does not work correctly. Does anyone can get good result with its command ?

Regards
MATSUDA Daiki

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



--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to