summaryrefslogtreecommitdiffstats
path: root/libvirt-lxc-override.c
diff options
context:
space:
mode:
authorDaniel P. Berrange <berrange@redhat.com>2012-12-21 13:15:19 +0000
committerDaniel P. Berrange <berrange@redhat.com>2013-01-14 13:58:34 +0000
commitd18147940f8e330881681c7ef68505ac4463e652 (patch)
tree1553c58ac179ce3f1f2f6f06eabb20a5c9e04ad1 /libvirt-lxc-override.c
parent9ad1c7f711344550e971d365faf9987923bc671f (diff)
downloadlibvirt-python-v9-d18147940f8e330881681c7ef68505ac4463e652.tar.gz
libvirt-python-v9-d18147940f8e330881681c7ef68505ac4463e652.tar.xz
libvirt-python-v9-d18147940f8e330881681c7ef68505ac4463e652.zip
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.c141
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;
+}