diff options
author | Daniel P. Berrange <berrange@redhat.com> | 2012-12-21 13:15:19 +0000 |
---|---|---|
committer | Daniel P. Berrange <berrange@redhat.com> | 2013-01-14 13:58:34 +0000 |
commit | d18147940f8e330881681c7ef68505ac4463e652 (patch) | |
tree | 1553c58ac179ce3f1f2f6f06eabb20a5c9e04ad1 /libvirt-lxc-override.c | |
parent | 9ad1c7f711344550e971d365faf9987923bc671f (diff) | |
download | libvirt-python-d18147940f8e330881681c7ef68505ac4463e652.tar.gz |
Introduce an LXC specific public API & library
This patch introduces support for LXC specific public APIs. In
common with what was done for QEMU, this creates a libvirt_lxc.so
library and libvirt/libvirt-lxc.h header file.
The actual APIs are
int virDomainLxcOpenNamespace(virDomainPtr domain,
int **fdlist,
unsigned int flags);
int virDomainLxcEnterNamespace(virDomainPtr domain,
unsigned int nfdlist,
int *fdlist,
unsigned int *noldfdlist,
int **oldfdlist,
unsigned int flags);
which provide a way to use the setns() system call to move the
calling process into the container's namespace. It is not
practical to write in a generically applicable manner. The
nearest that we could get to such an API would be an API which
allows to pass a command + argv to be executed inside a
container. Even if we had such a generic API, this LXC specific
API is still useful, because it allows the caller to maintain
the current process context, in particular any I/O streams they
have open.
NB the virDomainLxcEnterNamespace() API is special in that it
runs client side, so does not involve the internal driver API.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
Diffstat (limited to 'libvirt-lxc-override.c')
-rw-r--r-- | libvirt-lxc-override.c | 141 |
1 files changed, 141 insertions, 0 deletions
diff --git a/libvirt-lxc-override.c b/libvirt-lxc-override.c new file mode 100644 index 0000000..c80668e --- /dev/null +++ b/libvirt-lxc-override.c @@ -0,0 +1,141 @@ +/* + * 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) 2012-2013 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-lxc.h" +#include "libvirt/virterror.h" +#include "typewrappers.h" +#include "libvirt-lxc.h" +#include "viralloc.h" +#include "virfile.h" + +#ifndef __CYGWIN__ +extern void initlibvirtmod_lxc(void); +#else +extern void initcygvirtmod_lxc(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)) + +/************************************************************************ + * * + * Statistics * + * * + ************************************************************************/ + +static PyObject * +libvirt_lxc_virDomainLxcOpenNamespace(PyObject *self ATTRIBUTE_UNUSED, + PyObject *args) { + PyObject *py_retval; + virDomainPtr domain; + PyObject *pyobj_domain; + unsigned int flags; + int c_retval; + int *fdlist = NULL; + int i; + + if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainLxcOpenNamespace", + &pyobj_domain, &flags)) + return NULL; + domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); + + if (domain == NULL) + return VIR_PY_NONE; + LIBVIRT_BEGIN_ALLOW_THREADS; + c_retval = virDomainLxcOpenNamespace(domain, &fdlist, flags); + LIBVIRT_END_ALLOW_THREADS; + + if (c_retval < 0) + return VIR_PY_NONE; + + py_retval = PyList_New(c_retval); + for (i = 0 ; i < c_retval ; i++) { + PyObject *item = NULL; + + if ((item = PyInt_FromLong(fdlist[i])) == NULL) + goto error; + + if (PyList_Append(py_retval, item) < 0) { + Py_DECREF(item); + goto error; + } + } + return py_retval; + +error: + for (i = 0 ; i < c_retval ; i++) { + VIR_FORCE_CLOSE(fdlist[i]); + } + VIR_FREE(fdlist); + return VIR_PY_NONE; +} +/************************************************************************ + * * + * The registration stuff * + * * + ************************************************************************/ +static PyMethodDef libvirtLxcMethods[] = { +#include "libvirt-lxc-export.c" + {(char *) "virDomainLxcOpenNamespace", libvirt_lxc_virDomainLxcOpenNamespace, METH_VARARGS, NULL}, + {NULL, NULL, 0, NULL} +}; + +void +#ifndef __CYGWIN__ +initlibvirtmod_lxc +#else +initcygvirtmod_lxc +#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_lxc" +#else + "cygvirtmod_lxc" +#endif + , libvirtLxcMethods); + + initialized = 1; +} |