[libvirt] [PATCH v4 4/8] Qemu Monitor API entry point.

Chris Lalancette clalance at redhat.com
Wed Jul 7 21:33:29 UTC 2010


Add the library entry point for the new virDomainQemuMonitorCommand()
entry point.  Because this is not part of the "normal" libvirt API,
it gets its own header file, library file, and will eventually
get its own over-the-wire protocol later in the series.

Changes since v1:
 - Go back to using the virDriver table for qemuDomainMonitorCommand, due to
   linking issues
 - Added versioning information to the libvirt-qemu.so

Changes since v2:
 - None

Changes since v3:
 - Add LGPL header to libvirt-qemu.c
 - Make virLibConnError and virLibDomainError macros instead of function calls

Signed-off-by: Chris Lalancette <clalance at redhat.com>
---
 include/libvirt/Makefile.am    |    1 +
 include/libvirt/libvirt-qemu.h |   30 +++++++++++++++
 src/Makefile.am                |    8 +++-
 src/driver.h                   |    6 +++
 src/esx/esx_driver.c           |    1 +
 src/libvirt-qemu.c             |   81 ++++++++++++++++++++++++++++++++++++++++
 src/libvirt_private.syms       |    1 +
 src/libvirt_public.syms        |    6 +++
 src/lxc/lxc_driver.c           |    1 +
 src/opennebula/one_driver.c    |    1 +
 src/openvz/openvz_driver.c     |    1 +
 src/phyp/phyp_driver.c         |    1 +
 src/qemu/qemu_driver.c         |    1 +
 src/remote/remote_driver.c     |    1 +
 src/test/test_driver.c         |    1 +
 src/uml/uml_driver.c           |    1 +
 src/vbox/vbox_tmpl.c           |    1 +
 src/xen/xen_driver.c           |    1 +
 src/xenapi/xenapi_driver.c     |    1 +
 19 files changed, 144 insertions(+), 1 deletions(-)
 create mode 100644 include/libvirt/libvirt-qemu.h
 create mode 100644 src/libvirt-qemu.c

diff --git a/include/libvirt/Makefile.am b/include/libvirt/Makefile.am
index 8589dc5..b2c2b76 100644
--- a/include/libvirt/Makefile.am
+++ b/include/libvirt/Makefile.am
@@ -3,6 +3,7 @@
 virincdir = $(includedir)/libvirt
 
 virinc_HEADERS = libvirt.h		\
+		 libvirt-qemu.h		\
 		 virterror.h
 
 install-exec-hook:
diff --git a/include/libvirt/libvirt-qemu.h b/include/libvirt/libvirt-qemu.h
new file mode 100644
index 0000000..d21fd92
--- /dev/null
+++ b/include/libvirt/libvirt-qemu.h
@@ -0,0 +1,30 @@
+/* -*- c -*-
+ * libvirt-qemu.h:
+ * Summary: qemu specific interfaces
+ * Description: Provides the interfaces of the libvirt library to handle
+ *              qemu specific methods
+ *
+ * Copy:  Copyright (C) 2010 Red Hat, Inc.
+ *
+ * See COPYING.LIB for the License of this software
+ *
+ * Author: Chris Lalancette <clalance at redhat.com>
+ */
+
+#ifndef __VIR_QEMU_H__
+# define __VIR_QEMU_H__
+
+# include "libvirt.h"
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+int virDomainQemuMonitorCommand(virDomainPtr domain, const char *cmd,
+                                char **result, unsigned int flags);
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif /* __VIR_QEMU_H__ */
diff --git a/src/Makefile.am b/src/Makefile.am
index ece18a6..9cf9d67 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -32,7 +32,7 @@ if WITH_NETWORK
 UUID=$(shell uuidgen 2>/dev/null)
 endif
 
-lib_LTLIBRARIES = libvirt.la
+lib_LTLIBRARIES = libvirt.la libvirt-qemu.la
 
 moddir = $(libdir)/libvirt/drivers
 mod_LTLIBRARIES =
@@ -1028,6 +1028,12 @@ libvirt_test_la_LIBADD = $(libvirt_la_LIBADD)
 libvirt_test_la_LDFLAGS = $(test_LDFLAGS)
 libvirt_test_la_CFLAGS = $(COVERAGE_CFLAGS)
 
+libvirt_qemu_la_SOURCES = libvirt-qemu.c
+libvirt_qemu_la_LDFLAGS = $(VERSION_SCRIPT_FLAGS)$(LIBVIRT_SYMBOL_FILE) \
+                          -version-info $(LIBVIRT_VERSION_INFO) \
+                          $(CYGWIN_EXTRA_LDFLAGS) $(MINGW_EXTRA_LDFLAGS)
+libvirt_qemu_la_CFLAGS = $(COVERAGE_CFLAGS)
+libvirt_qemu_la_LIBADD = libvirt.la $(CYGWIN_EXTRA_LIBADD)
 
 libexec_PROGRAMS =
 
diff --git a/src/driver.h b/src/driver.h
index 22e3db6..e443c1c 100644
--- a/src/driver.h
+++ b/src/driver.h
@@ -457,6 +457,11 @@ typedef int
     (*virDrvDomainSnapshotDelete)(virDomainSnapshotPtr snapshot,
                                   unsigned int flags);
 
+typedef int
+    (*virDrvQemuDomainMonitorCommand)(virDomainPtr domain, const char *cmd,
+                                      char **result, unsigned int flags);
+
+
 
 /**
  * _virDriver:
@@ -569,6 +574,7 @@ struct _virDriver {
     virDrvDomainSnapshotCurrent domainSnapshotCurrent;
     virDrvDomainRevertToSnapshot domainRevertToSnapshot;
     virDrvDomainSnapshotDelete domainSnapshotDelete;
+    virDrvQemuDomainMonitorCommand qemuDomainMonitorCommand;
 };
 
 typedef int
diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
index acf8908..227e6a9 100644
--- a/src/esx/esx_driver.c
+++ b/src/esx/esx_driver.c
@@ -3759,6 +3759,7 @@ static virDriver esxDriver = {
     esxDomainSnapshotCurrent,        /* domainSnapshotCurrent */
     esxDomainRevertToSnapshot,       /* domainRevertToSnapshot */
     esxDomainSnapshotDelete,         /* domainSnapshotDelete */
+    NULL,                            /* qemuDomainMonitorCommand */
 };
 
 
diff --git a/src/libvirt-qemu.c b/src/libvirt-qemu.c
new file mode 100644
index 0000000..2c418f8
--- /dev/null
+++ b/src/libvirt-qemu.c
@@ -0,0 +1,81 @@
+/*
+ * libvirt-qemu.c: Interfaces for the libvirt library to handle qemu-specific
+ *                 APIs.
+ *
+ * Copyright (C) 2010 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA
+ *
+ * Author: Chris Lalancette <clalance at redhat.com>
+ */
+
+#include <config.h>
+
+#include "virterror_internal.h"
+#include "logging.h"
+#include "datatypes.h"
+#include "libvirt/libvirt-qemu.h"
+
+#define virLibConnError(conn, error, info)                               \
+    virReportErrorHelper(conn, VIR_FROM_NONE, error, NULL, __FUNCTION__, \
+                         __LINE__, info)
+
+#define virLibDomainError(domain, error, info)                          \
+    virReportErrorHelper(NULL, VIR_FROM_DOM, error, NULL, __FUNCTION__, \
+                         __LINE__, info)
+
+int
+virDomainQemuMonitorCommand(virDomainPtr domain, const char *cmd,
+                            char **result, unsigned int flags)
+{
+    virConnectPtr conn;
+
+    DEBUG("domain=%p, cmd=%s, result=%p, flags=%u", domain, cmd, result, flags);
+
+    virResetLastError();
+
+    if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
+        virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
+        virDispatchError(NULL);
+        return -1;
+    }
+
+    conn = domain->conn;
+
+    if (result == NULL) {
+        virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
+        goto error;
+    }
+
+    if (conn->flags & VIR_CONNECT_RO) {
+        virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
+        goto error;
+    }
+
+    if (conn->driver->qemuDomainMonitorCommand) {
+        int ret;
+        ret = conn->driver->qemuDomainMonitorCommand(domain, cmd, result,
+                                                     flags);
+        if (ret < 0)
+            goto error;
+        return ret;
+    }
+
+    virLibConnError(conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
+
+error:
+    virDispatchError(conn);
+    return -1;
+}
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 778ceb1..fe8f4c9 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -731,6 +731,7 @@ virReportSystemErrorFull;
 virReportOOMErrorFull;
 virStrerror;
 virSetError;
+virDispatchError;
 
 
 # xml.h
diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
index 849c163..302b012 100644
--- a/src/libvirt_public.syms
+++ b/src/libvirt_public.syms
@@ -405,4 +405,10 @@ LIBVIRT_0.8.2 {
         virDomainCreateWithFlags;
 } LIBVIRT_0.8.1;
 
+
+LIBVIRT_0.8.3 {
+    global:
+        virDomainQemuMonitorCommand;
+} LIBVIRT_0.8.2;
+
 # .... define new API here using predicted next version number ....
diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
index 462bc9c..4fc1ecd 100644
--- a/src/lxc/lxc_driver.c
+++ b/src/lxc/lxc_driver.c
@@ -2635,6 +2635,7 @@ static virDriver lxcDriver = {
     NULL, /* domainSnapshotCurrent */
     NULL, /* domainRevertToSnapshot */
     NULL, /* domainSnapshotDelete */
+    NULL, /* qemuDomainMonitorCommand */
 };
 
 static virStateDriver lxcStateDriver = {
diff --git a/src/opennebula/one_driver.c b/src/opennebula/one_driver.c
index 9d7b415..e70f17b 100644
--- a/src/opennebula/one_driver.c
+++ b/src/opennebula/one_driver.c
@@ -817,6 +817,7 @@ static virDriver oneDriver = {
     NULL, /* domainSnapshotCurrent */
     NULL, /* domainRevertToSnapshot */
     NULL, /* domainSnapshotDelete */
+    NULL, /* qemuDomainMonitorCommand */
 };
 
 static virStateDriver oneStateDriver = {
diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
index f7da1be..98381fb 100644
--- a/src/openvz/openvz_driver.c
+++ b/src/openvz/openvz_driver.c
@@ -1570,6 +1570,7 @@ static virDriver openvzDriver = {
     NULL, /* domainSnapshotCurrent */
     NULL, /* domainRevertToSnapshot */
     NULL, /* domainSnapshotDelete */
+    NULL, /* qemuDomainMonitorCommand */
 };
 
 int openvzRegister(void) {
diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
index ee1e21b..e4afc5a 100644
--- a/src/phyp/phyp_driver.c
+++ b/src/phyp/phyp_driver.c
@@ -3990,6 +3990,7 @@ static virDriver phypDriver = {
     NULL,                       /* domainSnapshotCurrent */
     NULL,                       /* domainRevertToSnapshot */
     NULL,                       /* domainSnapshotDelete */
+    NULL,                       /* qemuMonitorCommand */
 };
 
 static virStorageDriver phypStorageDriver = {
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 2abdbc4..e2b28a4 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -12542,6 +12542,7 @@ static virDriver qemuDriver = {
     qemuDomainSnapshotCurrent, /* domainSnapshotCurrent */
     qemuDomainRevertToSnapshot, /* domainRevertToSnapshot */
     qemuDomainSnapshotDelete, /* domainSnapshotDelete */
+    NULL, /* qemuDomainMonitorCommand */
 };
 
 
diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
index 7052bf1..18d2320 100644
--- a/src/remote/remote_driver.c
+++ b/src/remote/remote_driver.c
@@ -10302,6 +10302,7 @@ static virDriver remote_driver = {
     remoteDomainSnapshotCurrent, /* domainSnapshotCurrent */
     remoteDomainRevertToSnapshot, /* domainRevertToSnapshot */
     remoteDomainSnapshotDelete, /* domainSnapshotDelete */
+    NULL, /* qemuDomainMonitorCommand */
 };
 
 static virNetworkDriver network_driver = {
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index 5b6f47e..6c06cbc 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -5322,6 +5322,7 @@ static virDriver testDriver = {
     NULL, /* domainSnapshotCurrent */
     NULL, /* domainRevertToSnapshot */
     NULL, /* domainSnapshotDelete */
+    NULL, /* qemuDomainMonitorCommand */
 };
 
 static virNetworkDriver testNetworkDriver = {
diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
index 110179e..90bf1b5 100644
--- a/src/uml/uml_driver.c
+++ b/src/uml/uml_driver.c
@@ -1952,6 +1952,7 @@ static virDriver umlDriver = {
     NULL, /* domainSnapshotCurrent */
     NULL, /* domainRevertToSnapshot */
     NULL, /* domainSnapshotDelete */
+    NULL, /* qemuDomainMonitorCommand */
 };
 
 
diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
index 0e0013b..edc7a72 100644
--- a/src/vbox/vbox_tmpl.c
+++ b/src/vbox/vbox_tmpl.c
@@ -8248,6 +8248,7 @@ virDriver NAME(Driver) = {
     vboxDomainSnapshotCurrent, /* domainSnapshotCurrent */
     vboxDomainRevertToSnapshot, /* domainRevertToSnapshot */
     vboxDomainSnapshotDelete, /* domainSnapshotDelete */
+    NULL, /* qemuDomainMonitorCommand */
 };
 
 virNetworkDriver NAME(NetworkDriver) = {
diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
index 3dd673b..b55e494 100644
--- a/src/xen/xen_driver.c
+++ b/src/xen/xen_driver.c
@@ -2004,6 +2004,7 @@ static virDriver xenUnifiedDriver = {
     NULL, /* domainSnapshotCurrent */
     NULL, /* domainRevertToSnapshot */
     NULL, /* domainSnapshotDelete */
+    NULL, /* qemuDomainMonitorCommand */
 };
 
 /**
diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c
index cefcf3b..e385648 100644
--- a/src/xenapi/xenapi_driver.c
+++ b/src/xenapi/xenapi_driver.c
@@ -1814,6 +1814,7 @@ static virDriver xenapiDriver = {
     NULL, /* domainSnapshotCurrent */
     NULL, /* domainRevertToSnapshot */
     NULL, /* domainSnapshotDelete */
+    NULL, /* qemuDomainMonitorCommand */
 };
 
 /**
-- 
1.6.6.1




More information about the libvir-list mailing list