diff options
author | Osier Yang <jyang@redhat.com> | 2011-09-09 19:07:56 +0800 |
---|---|---|
committer | Osier Yang <jyang@redhat.com> | 2011-09-14 11:38:51 +0800 |
commit | 6d0e34c14fe965299c28053f2b85223db519d94b (patch) | |
tree | f5c8cef7b5aeb29dfef4fb4eeb43c19c181fb747 | |
parent | 8cebfbb2f5855c970b1c642bcfd1f547b0ef41de (diff) | |
download | libvirt-python-6d0e34c14fe965299c28053f2b85223db519d94b.tar.gz |
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.xml | 12 | ||||
-rw-r--r-- | libvirt-qemu-override.c | 136 |
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'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; +} |