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>
2012-12-21 13:15:19 +00:00
/*
* 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>
2013-04-17 18:19:19 +08:00
# include <libvirt/libvirt-lxc.h>
# include <libvirt/virterror.h>
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>
2012-12-21 13:15:19 +00:00
# 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 ;
Convert 'int i' to 'size_t i' in python/ files
Convert the type of loop iterators named 'i', 'j', k',
'ii', 'jj', 'kk', to be 'size_t' instead of 'int' or
'unsigned int', also santizing 'ii', 'jj', 'kk' to use
the normal 'i', 'j', 'k' naming
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
2013-07-08 15:09:33 +01:00
size_t i ;
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>
2012-12-21 13:15:19 +00:00
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 ) ;
2013-05-21 16:05:06 +08:00
for ( i = 0 ; i < c_retval ; i + + ) {
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>
2012-12-21 13:15:19 +00:00
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 :
2013-05-21 16:05:06 +08:00
for ( i = 0 ; i < c_retval ; i + + ) {
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>
2012-12-21 13:15:19 +00:00
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 ;
}