summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOsier Yang <jyang@redhat.com>2011-09-09 19:07:56 +0800
committerOsier Yang <jyang@redhat.com>2011-09-14 11:38:51 +0800
commit6d0e34c14fe965299c28053f2b85223db519d94b (patch)
treef5c8cef7b5aeb29dfef4fb4eeb43c19c181fb747
parent8cebfbb2f5855c970b1c642bcfd1f547b0ef41de (diff)
downloadlibvirt-python-split-6d0e34c14fe965299c28053f2b85223db519d94b.tar.gz
libvirt-python-split-6d0e34c14fe965299c28053f2b85223db519d94b.tar.xz
libvirt-python-split-6d0e34c14fe965299c28053f2b85223db519d94b.zip
qemu_api: Add override XML and C files for QEMU APIs
There is only one function (virDomainQemuMonitorCommand) need to be hand-craft.
-rw-r--r--libvirt-qemu-override-api.xml12
-rw-r--r--libvirt-qemu-override.c136
2 files changed, 148 insertions, 0 deletions
diff --git a/libvirt-qemu-override-api.xml b/libvirt-qemu-override-api.xml
new file mode 100644
index 0000000..d69acea
--- /dev/null
+++ b/libvirt-qemu-override-api.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<api name='libvir-qemu-python'>
+ <symbols>
+ <function name='virDomainQemuMonitorCommand' file='python-qemu'>
+ <info>Send an arbitrary monitor command through qemu monitor of domain</info>
+ <return type='str *' info='the command output or None in case of error'/>
+ <arg name='domain' type='virDomainPtr' info='pointer to domain object'/>
+ <arg name='cmd' type='const char *' info='the command which will be passed to QEMU monitor'/>
+ <arg name='flags' type='unsigned int' info='an OR&apos;ed set of virDomainQemuMonitorCommandFlags'/>
+ </function>
+ </symbols>
+</api>
diff --git a/libvirt-qemu-override.c b/libvirt-qemu-override.c
new file mode 100644
index 0000000..485c809
--- /dev/null
+++ b/libvirt-qemu-override.c
@@ -0,0 +1,136 @@
+/*
+ * libvir.c: this modules implements the main part of the glue of the
+ * libvir library and the Python interpreter. It provides the
+ * entry points where an automatically generated stub is
+ * unpractical
+ *
+ * Copyright (C) 2011 Red Hat, Inc.
+ *
+ * Daniel Veillard <veillard@redhat.com>
+ */
+
+#include <config.h>
+
+/* Horrible kludge to work around even more horrible name-space pollution
+ via Python.h. That file includes /usr/include/python2.5/pyconfig*.h,
+ which has over 180 autoconf-style HAVE_* definitions. Shame on them. */
+#undef HAVE_PTHREAD_H
+
+#include <Python.h>
+#include "libvirt/libvirt-qemu.h"
+#include "libvirt/virterror.h"
+#include "typewrappers.h"
+#include "libvirt-qemu.h"
+
+#ifndef __CYGWIN__
+extern void initlibvirtmod_qemu(void);
+#else
+extern void initcygvirtmod_qemu(void);
+#endif
+
+#if 0
+# define DEBUG_ERROR 1
+#endif
+
+#if DEBUG_ERROR
+# define DEBUG(fmt, ...) \
+ printf(fmt, __VA_ARGS__)
+#else
+# define DEBUG(fmt, ...) \
+ do {} while (0)
+#endif
+
+/* The two-statement sequence "Py_INCREF(Py_None); return Py_None;"
+ is so common that we encapsulate it here. Now, each use is simply
+ return VIR_PY_NONE; */
+#define VIR_PY_NONE (Py_INCREF (Py_None), Py_None)
+#define VIR_PY_INT_FAIL (libvirt_intWrap(-1))
+#define VIR_PY_INT_SUCCESS (libvirt_intWrap(0))
+
+/* We don't want to free() returned value. As written in doc:
+ * PyString_AsString returns pointer to 'internal buffer of string,
+ * not a copy' and 'It must not be deallocated'. */
+static char *py_str(PyObject *obj)
+{
+ PyObject *str = PyObject_Str(obj);
+ if (!str) {
+ PyErr_Print();
+ PyErr_Clear();
+ return NULL;
+ };
+ return PyString_AsString(str);
+}
+
+/************************************************************************
+ * *
+ * Statistics *
+ * *
+ ************************************************************************/
+
+static PyObject *
+libvirt_qemu_virDomainQemuMonitorCommand(PyObject *self ATTRIBUTE_UNUSED,
+ PyObject *args) {
+ PyObject *py_retval;
+ char *result = NULL;
+ virDomainPtr domain;
+ PyObject *pyobj_domain;
+ unsigned int flags;
+ char *cmd;
+ int c_retval;
+
+ if (!PyArg_ParseTuple(args, (char *)"Ozi:virDomainQemuMonitorCommand",
+ &pyobj_domain, &cmd, &flags))
+ return(NULL);
+ domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
+
+ if (domain == NULL)
+ return VIR_PY_NONE;
+ LIBVIRT_BEGIN_ALLOW_THREADS;
+ c_retval = virDomainQemuMonitorCommand(domain, cmd, &result, flags);
+ LIBVIRT_END_ALLOW_THREADS;
+
+ if (c_retval < 0)
+ return VIR_PY_NONE;
+
+ py_retval = PyString_FromString(result);
+ return(py_retval);
+}
+
+/************************************************************************
+ * *
+ * The registration stuff *
+ * *
+ ************************************************************************/
+static PyMethodDef libvirtQemuMethods[] = {
+#include "libvirt-qemu-export.c"
+ {(char *) "virDomainQemuMonitorCommand", libvirt_qemu_virDomainQemuMonitorCommand, METH_VARARGS, NULL},
+ {NULL, NULL, 0, NULL}
+};
+
+void
+#ifndef __CYGWIN__
+initlibvirtmod_qemu
+#else
+initcygvirtmod_qemu
+#endif
+ (void)
+{
+ static int initialized = 0;
+
+ if (initialized != 0)
+ return;
+
+ if (virInitialize() < 0)
+ return;
+
+ /* initialize the python extension module */
+ Py_InitModule((char *)
+#ifndef __CYGWIN__
+ "libvirtmod_qemu"
+#else
+ "cygvirtmod_qemu"
+#endif
+ , libvirtQemuMethods);
+
+ initialized = 1;
+}