2005-12-19 16:34:11 +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
*
2011-02-22 13:30:33 +08:00
* Copyright ( C ) 2005 , 2007 - 2011 Red Hat , Inc .
2005-12-19 16:34:11 +00:00
*
* Daniel Veillard < veillard @ redhat . com >
*/
2008-01-29 18:15:54 +00:00
# include <config.h>
2007-12-07 10:08:06 +00:00
2008-04-18 18:07:40 +00:00
/* 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
2005-12-19 16:34:11 +00:00
# include <Python.h>
Wed Dec 5 13:48:00 UTC 2007 Richard W.M. Jones <rjones@redhat.com>
* python/libvir.c, python/libvirt_wrap.h, qemud/qemud.c,
qemud/remote.c, src/internal.h, src/openvz_conf.c,
src/openvz_driver.c, src/proxy_internal.h, src/qemu_conf.c,
src/qemu_driver.c, src/remote_internal.h, src/test.h, src/util.c,
src/xen_unified.c, src/xen_unified.h, tests/nodeinfotest.c,
tests/qemuxml2argvtest.c, tests/qemuxml2xmltest.c, tests/reconnect.c,
tests/sexpr2xmltest.c, tests/virshtest.c, tests/xencapstest.c,
tests/xmconfigtest.c, tests/xml2sexprtest.c:
Change #include <> to #include "" for local includes.
Removed many includes from src/internal.h and put them in
the C files which actually use them.
Removed <ansidecl.h> - unused.
Added a comment around __func__.
Removed a clashing redefinition of VERSION symbol.
All limits (PATH_MAX etc) now done in src/internal.h, so we
don't need to include those headers in other files.
2007-12-05 13:56:22 +00:00
# include "libvirt/libvirt.h"
# include "libvirt/virterror.h"
2009-09-16 14:03:53 +01:00
# include "typewrappers.h"
# include "libvirt.h"
2005-12-19 16:34:11 +00:00
2007-11-30 11:10:53 +00:00
# ifndef __CYGWIN__
2007-03-06 21:55:44 +00:00
extern void initlibvirtmod ( void ) ;
2007-11-30 11:10:53 +00:00
# else
extern void initcygvirtmod ( void ) ;
# endif
2005-12-19 16:34:11 +00:00
2011-06-14 12:59:44 -04:00
#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
2008-01-17 22:13:55 +00:00
/* 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)
2008-02-07 09:49:13 +00:00
# define VIR_PY_INT_FAIL (libvirt_intWrap(-1))
# define VIR_PY_INT_SUCCESS (libvirt_intWrap(0))
2008-01-17 22:13:55 +00:00
2011-05-23 14:41:00 +02:00
/* 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 ' . */
2008-11-24 19:28:12 +00:00
static char * py_str ( PyObject * obj )
{
PyObject * str = PyObject_Str ( obj ) ;
if ( ! str ) {
PyErr_Print ( ) ;
PyErr_Clear ( ) ;
return NULL ;
} ;
return PyString_AsString ( str ) ;
}
2007-09-30 20:52:13 +00:00
/************************************************************************
* *
* Statistics *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2008-01-21 15:55:53 +00:00
static PyObject *
2007-09-30 20:52:13 +00:00
libvirt_virDomainBlockStats ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
virDomainPtr domain ;
PyObject * pyobj_domain ;
char * path ;
int c_retval ;
virDomainBlockStatsStruct stats ;
PyObject * info ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Oz:virDomainBlockStats " ,
& pyobj_domain , & path ) )
2008-01-17 22:13:55 +00:00
return ( NULL ) ;
2007-09-30 20:52:13 +00:00
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2007-09-30 20:52:13 +00:00
c_retval = virDomainBlockStats ( domain , path , & stats , sizeof ( stats ) ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-01-17 22:13:55 +00:00
if ( c_retval < 0 )
return VIR_PY_NONE ;
2006-10-24 20:28:16 +00:00
2008-01-17 22:14:57 +00:00
/* convert to a Python tuple of long objects */
if ( ( info = PyTuple_New ( 5 ) ) = = NULL )
return VIR_PY_NONE ;
2007-09-30 20:52:13 +00:00
PyTuple_SetItem ( info , 0 , PyLong_FromLongLong ( stats . rd_req ) ) ;
PyTuple_SetItem ( info , 1 , PyLong_FromLongLong ( stats . rd_bytes ) ) ;
PyTuple_SetItem ( info , 2 , PyLong_FromLongLong ( stats . wr_req ) ) ;
PyTuple_SetItem ( info , 3 , PyLong_FromLongLong ( stats . wr_bytes ) ) ;
PyTuple_SetItem ( info , 4 , PyLong_FromLongLong ( stats . errs ) ) ;
return ( info ) ;
}
2011-09-05 16:24:21 +08:00
static PyObject *
libvirt_virDomainBlockStatsFlags ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
virDomainPtr domain ;
PyObject * pyobj_domain , * info ;
int i_retval ;
int nparams = 0 , i ;
unsigned int flags ;
virTypedParameterPtr params ;
const char * path ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Ozi:virDomainBlockStatsFlags " ,
& pyobj_domain , & path , & flags ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainBlockStatsFlags ( domain , path , NULL , & nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 )
return VIR_PY_NONE ;
if ( ( params = malloc ( sizeof ( * params ) * nparams ) ) = = NULL )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainBlockStatsFlags ( domain , path , params , & nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 ) {
free ( params ) ;
return VIR_PY_NONE ;
}
/* convert to a Python tuple of long objects */
if ( ( info = PyDict_New ( ) ) = = NULL ) {
free ( params ) ;
return VIR_PY_NONE ;
}
for ( i = 0 ; i < nparams ; i + + ) {
PyObject * key , * val ;
switch ( params [ i ] . type ) {
case VIR_TYPED_PARAM_INT :
val = PyInt_FromLong ( ( long ) params [ i ] . value . i ) ;
break ;
case VIR_TYPED_PARAM_UINT :
val = PyInt_FromLong ( ( long ) params [ i ] . value . ui ) ;
break ;
case VIR_TYPED_PARAM_LLONG :
val = PyLong_FromLongLong ( ( long long ) params [ i ] . value . l ) ;
break ;
case VIR_TYPED_PARAM_ULLONG :
val = PyLong_FromLongLong ( ( long long ) params [ i ] . value . ul ) ;
break ;
case VIR_TYPED_PARAM_DOUBLE :
val = PyFloat_FromDouble ( ( double ) params [ i ] . value . d ) ;
break ;
case VIR_TYPED_PARAM_BOOLEAN :
val = PyBool_FromLong ( ( long ) params [ i ] . value . b ) ;
break ;
default :
free ( params ) ;
Py_DECREF ( info ) ;
return VIR_PY_NONE ;
}
key = libvirt_constcharPtrWrap ( params [ i ] . field ) ;
PyDict_SetItem ( info , key , val ) ;
}
free ( params ) ;
return ( info ) ;
}
2008-01-21 15:55:53 +00:00
static PyObject *
2007-09-30 20:52:13 +00:00
libvirt_virDomainInterfaceStats ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
virDomainPtr domain ;
PyObject * pyobj_domain ;
char * path ;
int c_retval ;
virDomainInterfaceStatsStruct stats ;
PyObject * info ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Oz:virDomainInterfaceStats " ,
& pyobj_domain , & path ) )
2008-04-10 16:54:54 +00:00
return ( NULL ) ;
2007-09-30 20:52:13 +00:00
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2007-09-30 20:52:13 +00:00
c_retval = virDomainInterfaceStats ( domain , path , & stats , sizeof ( stats ) ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-01-17 22:13:55 +00:00
if ( c_retval < 0 )
return VIR_PY_NONE ;
2007-09-30 20:52:13 +00:00
2008-01-17 22:14:57 +00:00
/* convert to a Python tuple of long objects */
if ( ( info = PyTuple_New ( 8 ) ) = = NULL )
return VIR_PY_NONE ;
2007-09-30 20:52:13 +00:00
PyTuple_SetItem ( info , 0 , PyLong_FromLongLong ( stats . rx_bytes ) ) ;
PyTuple_SetItem ( info , 1 , PyLong_FromLongLong ( stats . rx_packets ) ) ;
PyTuple_SetItem ( info , 2 , PyLong_FromLongLong ( stats . rx_errs ) ) ;
PyTuple_SetItem ( info , 3 , PyLong_FromLongLong ( stats . rx_drop ) ) ;
PyTuple_SetItem ( info , 4 , PyLong_FromLongLong ( stats . tx_bytes ) ) ;
PyTuple_SetItem ( info , 5 , PyLong_FromLongLong ( stats . tx_packets ) ) ;
PyTuple_SetItem ( info , 6 , PyLong_FromLongLong ( stats . tx_errs ) ) ;
PyTuple_SetItem ( info , 7 , PyLong_FromLongLong ( stats . tx_drop ) ) ;
return ( info ) ;
}
2008-01-21 15:41:15 +00:00
2009-12-20 13:48:37 +01:00
static PyObject *
libvirt_virDomainMemoryStats ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
virDomainPtr domain ;
PyObject * pyobj_domain ;
unsigned int nr_stats , i ;
virDomainMemoryStatStruct stats [ VIR_DOMAIN_MEMORY_STAT_NR ] ;
PyObject * info ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virDomainMemoryStats " , & pyobj_domain ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
nr_stats = virDomainMemoryStats ( domain , stats ,
VIR_DOMAIN_MEMORY_STAT_NR , 0 ) ;
if ( nr_stats = = - 1 )
return VIR_PY_NONE ;
/* convert to a Python dictionary */
if ( ( info = PyDict_New ( ) ) = = NULL )
return VIR_PY_NONE ;
for ( i = 0 ; i < nr_stats ; i + + ) {
if ( stats [ i ] . tag = = VIR_DOMAIN_MEMORY_STAT_SWAP_IN )
PyDict_SetItem ( info , libvirt_constcharPtrWrap ( " swap_in " ) ,
PyLong_FromUnsignedLongLong ( stats [ i ] . val ) ) ;
else if ( stats [ i ] . tag = = VIR_DOMAIN_MEMORY_STAT_SWAP_OUT )
PyDict_SetItem ( info , libvirt_constcharPtrWrap ( " swap_out " ) ,
PyLong_FromUnsignedLongLong ( stats [ i ] . val ) ) ;
else if ( stats [ i ] . tag = = VIR_DOMAIN_MEMORY_STAT_MAJOR_FAULT )
PyDict_SetItem ( info , libvirt_constcharPtrWrap ( " major_fault " ) ,
PyLong_FromUnsignedLongLong ( stats [ i ] . val ) ) ;
else if ( stats [ i ] . tag = = VIR_DOMAIN_MEMORY_STAT_MINOR_FAULT )
PyDict_SetItem ( info , libvirt_constcharPtrWrap ( " minor_fault " ) ,
PyLong_FromUnsignedLongLong ( stats [ i ] . val ) ) ;
else if ( stats [ i ] . tag = = VIR_DOMAIN_MEMORY_STAT_UNUSED )
PyDict_SetItem ( info , libvirt_constcharPtrWrap ( " unused " ) ,
PyLong_FromUnsignedLongLong ( stats [ i ] . val ) ) ;
else if ( stats [ i ] . tag = = VIR_DOMAIN_MEMORY_STAT_AVAILABLE )
PyDict_SetItem ( info , libvirt_constcharPtrWrap ( " available " ) ,
PyLong_FromUnsignedLongLong ( stats [ i ] . val ) ) ;
}
return info ;
}
2008-01-21 15:41:15 +00:00
static PyObject *
libvirt_virDomainGetSchedulerType ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
virDomainPtr domain ;
PyObject * pyobj_domain , * info ;
char * c_retval ;
int nparams ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virDomainGetScedulerType " ,
& pyobj_domain ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2008-01-21 15:41:15 +00:00
c_retval = virDomainGetSchedulerType ( domain , & nparams ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-01-21 15:41:15 +00:00
if ( c_retval = = NULL )
return VIR_PY_NONE ;
2008-02-29 12:53:10 +00:00
/* convert to a Python tuple of long objects */
2008-01-21 15:41:15 +00:00
if ( ( info = PyTuple_New ( 2 ) ) = = NULL ) {
free ( c_retval ) ;
return VIR_PY_NONE ;
}
PyTuple_SetItem ( info , 0 , libvirt_constcharPtrWrap ( c_retval ) ) ;
PyTuple_SetItem ( info , 1 , PyInt_FromLong ( ( long ) nparams ) ) ;
free ( c_retval ) ;
return ( info ) ;
}
static PyObject *
libvirt_virDomainGetSchedulerParameters ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
virDomainPtr domain ;
PyObject * pyobj_domain , * info ;
char * c_retval ;
2009-11-25 12:04:47 +00:00
int i_retval ;
2008-01-21 15:41:15 +00:00
int nparams , i ;
2011-05-29 18:24:20 +08:00
virTypedParameterPtr params ;
2008-01-21 15:41:15 +00:00
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virDomainGetScedulerParameters " ,
& pyobj_domain ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2008-01-21 15:41:15 +00:00
c_retval = virDomainGetSchedulerType ( domain , & nparams ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-01-21 15:41:15 +00:00
if ( c_retval = = NULL )
return VIR_PY_NONE ;
free ( c_retval ) ;
if ( ( params = malloc ( sizeof ( * params ) * nparams ) ) = = NULL )
return VIR_PY_NONE ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainGetSchedulerParameters ( domain , params , & nparams ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 ) {
2008-01-21 15:41:15 +00:00
free ( params ) ;
return VIR_PY_NONE ;
}
2008-02-29 12:53:10 +00:00
/* convert to a Python tuple of long objects */
2008-01-21 15:41:15 +00:00
if ( ( info = PyDict_New ( ) ) = = NULL ) {
free ( params ) ;
return VIR_PY_NONE ;
}
for ( i = 0 ; i < nparams ; i + + ) {
PyObject * key , * val ;
switch ( params [ i ] . type ) {
2011-05-29 18:24:20 +08:00
case VIR_TYPED_PARAM_INT :
2008-01-21 15:41:15 +00:00
val = PyInt_FromLong ( ( long ) params [ i ] . value . i ) ;
break ;
2011-05-29 18:24:20 +08:00
case VIR_TYPED_PARAM_UINT :
2008-01-21 15:41:15 +00:00
val = PyInt_FromLong ( ( long ) params [ i ] . value . ui ) ;
break ;
2011-05-29 18:24:20 +08:00
case VIR_TYPED_PARAM_LLONG :
2008-01-21 15:41:15 +00:00
val = PyLong_FromLongLong ( ( long long ) params [ i ] . value . l ) ;
break ;
2011-05-29 18:24:20 +08:00
case VIR_TYPED_PARAM_ULLONG :
2008-01-21 15:41:15 +00:00
val = PyLong_FromLongLong ( ( long long ) params [ i ] . value . ul ) ;
break ;
2011-05-29 18:24:20 +08:00
case VIR_TYPED_PARAM_DOUBLE :
2008-01-21 15:41:15 +00:00
val = PyFloat_FromDouble ( ( double ) params [ i ] . value . d ) ;
break ;
2011-05-29 18:24:20 +08:00
case VIR_TYPED_PARAM_BOOLEAN :
2008-01-21 15:41:15 +00:00
val = PyBool_FromLong ( ( long ) params [ i ] . value . b ) ;
break ;
default :
free ( params ) ;
Py_DECREF ( info ) ;
return VIR_PY_NONE ;
}
key = libvirt_constcharPtrWrap ( params [ i ] . field ) ;
PyDict_SetItem ( info , key , val ) ;
}
free ( params ) ;
return ( info ) ;
}
2011-07-25 14:54:34 +08:00
static PyObject *
libvirt_virDomainGetSchedulerParametersFlags ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
virDomainPtr domain ;
PyObject * pyobj_domain , * info ;
char * c_retval ;
int i_retval ;
int nparams , i ;
unsigned int flags ;
virTypedParameterPtr params ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Oi:virDomainGetScedulerParametersFlags " ,
& pyobj_domain , & flags ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virDomainGetSchedulerType ( domain , & nparams ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval = = NULL )
return VIR_PY_NONE ;
free ( c_retval ) ;
if ( ( params = malloc ( sizeof ( * params ) * nparams ) ) = = NULL )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainGetSchedulerParametersFlags ( domain , params , & nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 ) {
free ( params ) ;
return VIR_PY_NONE ;
}
/* convert to a Python tuple of long objects */
if ( ( info = PyDict_New ( ) ) = = NULL ) {
free ( params ) ;
return VIR_PY_NONE ;
}
for ( i = 0 ; i < nparams ; i + + ) {
PyObject * key , * val ;
switch ( params [ i ] . type ) {
case VIR_TYPED_PARAM_INT :
val = PyInt_FromLong ( ( long ) params [ i ] . value . i ) ;
break ;
case VIR_TYPED_PARAM_UINT :
val = PyInt_FromLong ( ( long ) params [ i ] . value . ui ) ;
break ;
case VIR_TYPED_PARAM_LLONG :
val = PyLong_FromLongLong ( ( long long ) params [ i ] . value . l ) ;
break ;
case VIR_TYPED_PARAM_ULLONG :
val = PyLong_FromLongLong ( ( long long ) params [ i ] . value . ul ) ;
break ;
case VIR_TYPED_PARAM_DOUBLE :
val = PyFloat_FromDouble ( ( double ) params [ i ] . value . d ) ;
break ;
case VIR_TYPED_PARAM_BOOLEAN :
val = PyBool_FromLong ( ( long ) params [ i ] . value . b ) ;
break ;
default :
free ( params ) ;
Py_DECREF ( info ) ;
return VIR_PY_NONE ;
}
key = libvirt_constcharPtrWrap ( params [ i ] . field ) ;
PyDict_SetItem ( info , key , val ) ;
}
free ( params ) ;
return ( info ) ;
}
2008-01-21 15:41:15 +00:00
static PyObject *
libvirt_virDomainSetSchedulerParameters ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
virDomainPtr domain ;
PyObject * pyobj_domain , * info ;
char * c_retval ;
2009-11-25 12:04:47 +00:00
int i_retval ;
2008-01-21 15:41:15 +00:00
int nparams , i ;
2011-05-29 18:24:20 +08:00
virTypedParameterPtr params ;
2008-01-21 15:41:15 +00:00
if ( ! PyArg_ParseTuple ( args , ( char * ) " OO:virDomainSetScedulerParameters " ,
& pyobj_domain , & info ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2008-01-21 15:41:15 +00:00
c_retval = virDomainGetSchedulerType ( domain , & nparams ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-01-21 15:41:15 +00:00
if ( c_retval = = NULL )
2008-02-07 09:49:13 +00:00
return VIR_PY_INT_FAIL ;
2008-01-21 15:41:15 +00:00
free ( c_retval ) ;
if ( ( params = malloc ( sizeof ( * params ) * nparams ) ) = = NULL )
2008-02-07 09:49:13 +00:00
return VIR_PY_INT_FAIL ;
2008-01-21 15:41:15 +00:00
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainGetSchedulerParameters ( domain , params , & nparams ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 ) {
2008-01-21 15:41:15 +00:00
free ( params ) ;
2008-02-07 09:49:13 +00:00
return VIR_PY_INT_FAIL ;
2008-01-21 15:41:15 +00:00
}
2008-02-29 12:53:10 +00:00
/* convert to a Python tuple of long objects */
2008-01-21 15:41:15 +00:00
for ( i = 0 ; i < nparams ; i + + ) {
PyObject * key , * val ;
key = libvirt_constcharPtrWrap ( params [ i ] . field ) ;
val = PyDict_GetItem ( info , key ) ;
Py_DECREF ( key ) ;
if ( val = = NULL )
continue ;
switch ( params [ i ] . type ) {
2011-05-29 18:24:20 +08:00
case VIR_TYPED_PARAM_INT :
2008-01-21 15:41:15 +00:00
params [ i ] . value . i = ( int ) PyInt_AS_LONG ( val ) ;
break ;
2011-05-29 18:24:20 +08:00
case VIR_TYPED_PARAM_UINT :
2008-01-21 15:41:15 +00:00
params [ i ] . value . ui = ( unsigned int ) PyInt_AS_LONG ( val ) ;
break ;
2011-05-29 18:24:20 +08:00
case VIR_TYPED_PARAM_LLONG :
2008-01-21 15:41:15 +00:00
params [ i ] . value . l = ( long long ) PyLong_AsLongLong ( val ) ;
break ;
2011-05-29 18:24:20 +08:00
case VIR_TYPED_PARAM_ULLONG :
2008-01-21 15:41:15 +00:00
params [ i ] . value . ul = ( unsigned long long ) PyLong_AsLongLong ( val ) ;
break ;
2011-05-29 18:24:20 +08:00
case VIR_TYPED_PARAM_DOUBLE :
2008-01-21 15:41:15 +00:00
params [ i ] . value . d = ( double ) PyFloat_AsDouble ( val ) ;
break ;
2011-05-29 18:24:20 +08:00
case VIR_TYPED_PARAM_BOOLEAN :
2008-01-21 15:41:15 +00:00
{
/* Hack - Python's definition of Py_True breaks strict
* aliasing rules , so can ' t directly compare : - (
*/
PyObject * hacktrue = PyBool_FromLong ( 1 ) ;
params [ i ] . value . b = hacktrue = = val ? 1 : 0 ;
Py_DECREF ( hacktrue ) ;
}
break ;
default :
free ( params ) ;
2008-02-07 09:49:13 +00:00
return VIR_PY_INT_FAIL ;
2008-01-21 15:41:15 +00:00
}
}
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainSetSchedulerParameters ( domain , params , nparams ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 ) {
2008-01-21 15:41:15 +00:00
free ( params ) ;
2008-02-07 09:49:13 +00:00
return VIR_PY_INT_FAIL ;
2008-01-21 15:41:15 +00:00
}
free ( params ) ;
2008-02-07 09:49:13 +00:00
return VIR_PY_INT_SUCCESS ;
2008-01-21 15:41:15 +00:00
}
2011-07-25 14:57:33 +08:00
static PyObject *
libvirt_virDomainSetSchedulerParametersFlags ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
virDomainPtr domain ;
PyObject * pyobj_domain , * info ;
char * c_retval ;
int i_retval ;
int nparams , i ;
unsigned int flags ;
virTypedParameterPtr params ;
if ( ! PyArg_ParseTuple ( args ,
( char * ) " OOi:virDomainSetScedulerParametersFlags " ,
& pyobj_domain , & info , & flags ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virDomainGetSchedulerType ( domain , & nparams ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval = = NULL )
return VIR_PY_INT_FAIL ;
free ( c_retval ) ;
if ( ( params = malloc ( sizeof ( * params ) * nparams ) ) = = NULL )
return VIR_PY_INT_FAIL ;
2011-02-22 13:30:33 +08:00
2011-07-25 14:57:33 +08:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainGetSchedulerParametersFlags ( domain , params , & nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 ) {
free ( params ) ;
return VIR_PY_INT_FAIL ;
}
/* convert to a Python tuple of long objects */
for ( i = 0 ; i < nparams ; i + + ) {
PyObject * key , * val ;
key = libvirt_constcharPtrWrap ( params [ i ] . field ) ;
val = PyDict_GetItem ( info , key ) ;
Py_DECREF ( key ) ;
if ( val = = NULL )
continue ;
switch ( params [ i ] . type ) {
case VIR_TYPED_PARAM_INT :
params [ i ] . value . i = ( int ) PyInt_AS_LONG ( val ) ;
break ;
case VIR_TYPED_PARAM_UINT :
params [ i ] . value . ui = ( unsigned int ) PyInt_AS_LONG ( val ) ;
break ;
case VIR_TYPED_PARAM_LLONG :
params [ i ] . value . l = ( long long ) PyLong_AsLongLong ( val ) ;
break ;
case VIR_TYPED_PARAM_ULLONG :
params [ i ] . value . ul = ( unsigned long long ) PyLong_AsLongLong ( val ) ;
break ;
case VIR_TYPED_PARAM_DOUBLE :
params [ i ] . value . d = ( double ) PyFloat_AsDouble ( val ) ;
break ;
case VIR_TYPED_PARAM_BOOLEAN :
{
/* Hack - Python's definition of Py_True breaks strict
* aliasing rules , so can ' t directly compare : - (
*/
PyObject * hacktrue = PyBool_FromLong ( 1 ) ;
params [ i ] . value . b = hacktrue = = val ? 1 : 0 ;
Py_DECREF ( hacktrue ) ;
}
break ;
default :
free ( params ) ;
return VIR_PY_INT_FAIL ;
}
}
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainSetSchedulerParametersFlags ( domain , params , nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 ) {
free ( params ) ;
return VIR_PY_INT_FAIL ;
}
free ( params ) ;
return VIR_PY_INT_SUCCESS ;
}
2011-02-22 13:30:33 +08:00
static PyObject *
libvirt_virDomainSetBlkioParameters ( PyObject * self ATTRIBUTE_UNUSED ,
2011-07-27 10:13:09 +08:00
PyObject * args ) {
virDomainPtr domain ;
PyObject * pyobj_domain , * info ;
int i_retval ;
int nparams = 0 , i ;
unsigned int flags ;
virTypedParameterPtr params ;
if ( ! PyArg_ParseTuple ( args ,
( char * ) " OOi:virDomainSetBlkioParameters " ,
& pyobj_domain , & info , & flags ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainGetBlkioParameters ( domain , NULL , & nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 )
return VIR_PY_INT_FAIL ;
if ( ( params = malloc ( sizeof ( * params ) * nparams ) ) = = NULL )
return VIR_PY_INT_FAIL ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainGetBlkioParameters ( domain , params , & nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 ) {
free ( params ) ;
return VIR_PY_INT_FAIL ;
}
/* convert to a Python tuple of long objects */
for ( i = 0 ; i < nparams ; i + + ) {
PyObject * key , * val ;
key = libvirt_constcharPtrWrap ( params [ i ] . field ) ;
val = PyDict_GetItem ( info , key ) ;
Py_DECREF ( key ) ;
if ( val = = NULL )
continue ;
switch ( params [ i ] . type ) {
case VIR_TYPED_PARAM_INT :
params [ i ] . value . i = ( int ) PyInt_AS_LONG ( val ) ;
break ;
case VIR_TYPED_PARAM_UINT :
params [ i ] . value . ui = ( unsigned int ) PyInt_AS_LONG ( val ) ;
break ;
case VIR_TYPED_PARAM_LLONG :
params [ i ] . value . l = ( long long ) PyLong_AsLongLong ( val ) ;
break ;
case VIR_TYPED_PARAM_ULLONG :
params [ i ] . value . ul = ( unsigned long long ) PyLong_AsLongLong ( val ) ;
break ;
case VIR_TYPED_PARAM_DOUBLE :
params [ i ] . value . d = ( double ) PyFloat_AsDouble ( val ) ;
break ;
case VIR_TYPED_PARAM_BOOLEAN :
{
/* Hack - Python's definition of Py_True breaks strict
* aliasing rules , so can ' t directly compare : - (
*/
PyObject * hacktrue = PyBool_FromLong ( 1 ) ;
params [ i ] . value . b = hacktrue = = val ? 1 : 0 ;
Py_DECREF ( hacktrue ) ;
}
break ;
default :
free ( params ) ;
return VIR_PY_INT_FAIL ;
}
}
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainSetBlkioParameters ( domain , params , nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 ) {
free ( params ) ;
return VIR_PY_INT_FAIL ;
}
free ( params ) ;
return VIR_PY_INT_SUCCESS ;
2011-02-22 13:30:33 +08:00
}
static PyObject *
libvirt_virDomainGetBlkioParameters ( PyObject * self ATTRIBUTE_UNUSED ,
2011-07-27 10:13:08 +08:00
PyObject * args ) {
virDomainPtr domain ;
PyObject * pyobj_domain , * info ;
int i_retval ;
int nparams = 0 , i ;
unsigned int flags ;
virTypedParameterPtr params ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Oi:virDomainGetBlkioParameters " ,
& pyobj_domain , & flags ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainGetBlkioParameters ( domain , NULL , & nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 )
return VIR_PY_NONE ;
if ( ( params = malloc ( sizeof ( * params ) * nparams ) ) = = NULL )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainGetBlkioParameters ( domain , params , & nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 ) {
free ( params ) ;
return VIR_PY_NONE ;
}
/* convert to a Python tuple of long objects */
if ( ( info = PyDict_New ( ) ) = = NULL ) {
free ( params ) ;
return VIR_PY_NONE ;
}
for ( i = 0 ; i < nparams ; i + + ) {
PyObject * key , * val ;
switch ( params [ i ] . type ) {
case VIR_TYPED_PARAM_INT :
val = PyInt_FromLong ( ( long ) params [ i ] . value . i ) ;
break ;
case VIR_TYPED_PARAM_UINT :
val = PyInt_FromLong ( ( long ) params [ i ] . value . ui ) ;
break ;
case VIR_TYPED_PARAM_LLONG :
val = PyLong_FromLongLong ( ( long long ) params [ i ] . value . l ) ;
break ;
case VIR_TYPED_PARAM_ULLONG :
val = PyLong_FromLongLong ( ( long long ) params [ i ] . value . ul ) ;
break ;
case VIR_TYPED_PARAM_DOUBLE :
val = PyFloat_FromDouble ( ( double ) params [ i ] . value . d ) ;
break ;
case VIR_TYPED_PARAM_BOOLEAN :
val = PyBool_FromLong ( ( long ) params [ i ] . value . b ) ;
break ;
default :
free ( params ) ;
Py_DECREF ( info ) ;
return VIR_PY_NONE ;
}
key = libvirt_constcharPtrWrap ( params [ i ] . field ) ;
PyDict_SetItem ( info , key , val ) ;
}
free ( params ) ;
return ( info ) ;
2011-02-22 13:30:33 +08:00
}
2010-10-12 15:43:27 +02:00
static PyObject *
libvirt_virDomainSetMemoryParameters ( PyObject * self ATTRIBUTE_UNUSED ,
2011-07-27 10:13:11 +08:00
PyObject * args ) {
virDomainPtr domain ;
PyObject * pyobj_domain , * info ;
int i_retval ;
int nparams = 0 , i ;
unsigned int flags ;
virTypedParameterPtr params ;
if ( ! PyArg_ParseTuple ( args ,
( char * ) " OOi:virDomainSetMemoryParameters " ,
& pyobj_domain , & info , & flags ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainGetMemoryParameters ( domain , NULL , & nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 )
return VIR_PY_INT_FAIL ;
if ( ( params = malloc ( sizeof ( * params ) * nparams ) ) = = NULL )
return VIR_PY_INT_FAIL ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainGetMemoryParameters ( domain , params , & nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 ) {
free ( params ) ;
return VIR_PY_INT_FAIL ;
}
/* convert to a Python tuple of long objects */
for ( i = 0 ; i < nparams ; i + + ) {
PyObject * key , * val ;
key = libvirt_constcharPtrWrap ( params [ i ] . field ) ;
val = PyDict_GetItem ( info , key ) ;
Py_DECREF ( key ) ;
if ( val = = NULL )
continue ;
switch ( params [ i ] . type ) {
case VIR_TYPED_PARAM_INT :
params [ i ] . value . i = ( int ) PyInt_AS_LONG ( val ) ;
break ;
case VIR_TYPED_PARAM_UINT :
params [ i ] . value . ui = ( unsigned int ) PyInt_AS_LONG ( val ) ;
break ;
case VIR_TYPED_PARAM_LLONG :
params [ i ] . value . l = ( long long ) PyLong_AsLongLong ( val ) ;
break ;
case VIR_TYPED_PARAM_ULLONG :
params [ i ] . value . ul = ( unsigned long long ) PyLong_AsLongLong ( val ) ;
break ;
case VIR_TYPED_PARAM_DOUBLE :
params [ i ] . value . d = ( double ) PyFloat_AsDouble ( val ) ;
break ;
case VIR_TYPED_PARAM_BOOLEAN :
{
/* Hack - Python's definition of Py_True breaks strict
* aliasing rules , so can ' t directly compare : - (
*/
PyObject * hacktrue = PyBool_FromLong ( 1 ) ;
params [ i ] . value . b = hacktrue = = val ? 1 : 0 ;
Py_DECREF ( hacktrue ) ;
}
break ;
default :
free ( params ) ;
return VIR_PY_INT_FAIL ;
}
}
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainSetMemoryParameters ( domain , params , nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 ) {
free ( params ) ;
return VIR_PY_INT_FAIL ;
}
free ( params ) ;
return VIR_PY_INT_SUCCESS ;
2010-10-12 15:43:27 +02:00
}
static PyObject *
libvirt_virDomainGetMemoryParameters ( PyObject * self ATTRIBUTE_UNUSED ,
2011-07-27 10:13:10 +08:00
PyObject * args ) {
virDomainPtr domain ;
PyObject * pyobj_domain , * info ;
int i_retval ;
int nparams = 0 , i ;
unsigned int flags ;
virTypedParameterPtr params ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Oi:virDomainGetMemoryParameters " ,
& pyobj_domain , & flags ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainGetMemoryParameters ( domain , NULL , & nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 )
return VIR_PY_NONE ;
if ( ( params = malloc ( sizeof ( * params ) * nparams ) ) = = NULL )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainGetMemoryParameters ( domain , params , & nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 ) {
free ( params ) ;
return VIR_PY_NONE ;
}
/* convert to a Python tuple of long objects */
if ( ( info = PyDict_New ( ) ) = = NULL ) {
free ( params ) ;
return VIR_PY_NONE ;
}
for ( i = 0 ; i < nparams ; i + + ) {
PyObject * key , * val ;
switch ( params [ i ] . type ) {
case VIR_TYPED_PARAM_INT :
val = PyInt_FromLong ( ( long ) params [ i ] . value . i ) ;
break ;
case VIR_TYPED_PARAM_UINT :
val = PyInt_FromLong ( ( long ) params [ i ] . value . ui ) ;
break ;
case VIR_TYPED_PARAM_LLONG :
val = PyLong_FromLongLong ( ( long long ) params [ i ] . value . l ) ;
break ;
case VIR_TYPED_PARAM_ULLONG :
val = PyLong_FromLongLong ( ( long long ) params [ i ] . value . ul ) ;
break ;
case VIR_TYPED_PARAM_DOUBLE :
val = PyFloat_FromDouble ( ( double ) params [ i ] . value . d ) ;
break ;
case VIR_TYPED_PARAM_BOOLEAN :
val = PyBool_FromLong ( ( long ) params [ i ] . value . b ) ;
break ;
default :
free ( params ) ;
Py_DECREF ( info ) ;
return VIR_PY_NONE ;
}
key = libvirt_constcharPtrWrap ( params [ i ] . field ) ;
PyDict_SetItem ( info , key , val ) ;
}
free ( params ) ;
return ( info ) ;
2010-10-12 15:43:27 +02:00
}
2008-01-21 15:41:15 +00:00
static PyObject *
libvirt_virDomainGetVcpus ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
virDomainPtr domain ;
PyObject * pyobj_domain , * pyretval = NULL , * pycpuinfo = NULL , * pycpumap = NULL ;
virNodeInfo nodeinfo ;
virDomainInfo dominfo ;
virVcpuInfoPtr cpuinfo = NULL ;
unsigned char * cpumap = NULL ;
2011-06-03 13:53:26 -06:00
size_t cpumaplen , i ;
2009-11-25 12:04:47 +00:00
int i_retval ;
2008-01-21 15:41:15 +00:00
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virDomainGetVcpus " ,
& pyobj_domain ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virNodeGetInfo ( virDomainGetConnect ( domain ) , & nodeinfo ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 )
2008-01-21 15:41:15 +00:00
return VIR_PY_NONE ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainGetInfo ( domain , & dominfo ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 )
2008-01-21 15:41:15 +00:00
return VIR_PY_NONE ;
if ( ( cpuinfo = malloc ( sizeof ( * cpuinfo ) * dominfo . nrVirtCpu ) ) = = NULL )
return VIR_PY_NONE ;
cpumaplen = VIR_CPU_MAPLEN ( VIR_NODEINFO_MAXCPUS ( nodeinfo ) ) ;
if ( ( cpumap = malloc ( dominfo . nrVirtCpu * cpumaplen ) ) = = NULL )
goto cleanup ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainGetVcpus ( domain ,
cpuinfo , dominfo . nrVirtCpu ,
cpumap , cpumaplen ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 )
2008-01-21 15:41:15 +00:00
goto cleanup ;
2008-02-29 12:53:10 +00:00
/* convert to a Python tuple of long objects */
2008-01-21 15:41:15 +00:00
if ( ( pyretval = PyTuple_New ( 2 ) ) = = NULL )
goto cleanup ;
if ( ( pycpuinfo = PyList_New ( dominfo . nrVirtCpu ) ) = = NULL )
goto cleanup ;
if ( ( pycpumap = PyList_New ( dominfo . nrVirtCpu ) ) = = NULL )
goto cleanup ;
for ( i = 0 ; i < dominfo . nrVirtCpu ; i + + ) {
PyObject * info = PyTuple_New ( 4 ) ;
if ( info = = NULL )
goto cleanup ;
PyTuple_SetItem ( info , 0 , PyInt_FromLong ( ( long ) cpuinfo [ i ] . number ) ) ;
PyTuple_SetItem ( info , 1 , PyInt_FromLong ( ( long ) cpuinfo [ i ] . state ) ) ;
PyTuple_SetItem ( info , 2 , PyLong_FromLongLong ( ( long long ) cpuinfo [ i ] . cpuTime ) ) ;
PyTuple_SetItem ( info , 3 , PyInt_FromLong ( ( long ) cpuinfo [ i ] . cpu ) ) ;
PyList_SetItem ( pycpuinfo , i , info ) ;
}
for ( i = 0 ; i < dominfo . nrVirtCpu ; i + + ) {
PyObject * info = PyTuple_New ( VIR_NODEINFO_MAXCPUS ( nodeinfo ) ) ;
int j ;
if ( info = = NULL )
goto cleanup ;
for ( j = 0 ; j < VIR_NODEINFO_MAXCPUS ( nodeinfo ) ; j + + ) {
PyTuple_SetItem ( info , j , PyBool_FromLong ( VIR_CPU_USABLE ( cpumap , cpumaplen , i , j ) ) ) ;
}
PyList_SetItem ( pycpumap , i , info ) ;
}
PyTuple_SetItem ( pyretval , 0 , pycpuinfo ) ;
PyTuple_SetItem ( pyretval , 1 , pycpumap ) ;
free ( cpuinfo ) ;
free ( cpumap ) ;
return ( pyretval ) ;
cleanup :
free ( cpuinfo ) ;
free ( cpumap ) ;
/* NB, Py_DECREF is a badly defined macro, so we require
* braces here to avoid ' ambiguous else ' warnings from
* the compiler .
* NB . this comment is true at of time of writing wrt to
* at least python2 .5 .
*/
if ( pyretval ) { Py_DECREF ( pyretval ) ; }
if ( pycpuinfo ) { Py_DECREF ( pycpuinfo ) ; }
if ( pycpumap ) { Py_DECREF ( pycpumap ) ; }
return VIR_PY_NONE ;
}
static PyObject *
libvirt_virDomainPinVcpu ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
virDomainPtr domain ;
PyObject * pyobj_domain , * pycpumap , * truth ;
virNodeInfo nodeinfo ;
unsigned char * cpumap ;
int cpumaplen , i , vcpu ;
2009-11-25 12:04:47 +00:00
int i_retval ;
2008-01-21 15:41:15 +00:00
if ( ! PyArg_ParseTuple ( args , ( char * ) " OiO:virDomainPinVcpu " ,
& pyobj_domain , & vcpu , & pycpumap ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virNodeGetInfo ( virDomainGetConnect ( domain ) , & nodeinfo ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 )
2008-02-07 09:49:13 +00:00
return VIR_PY_INT_FAIL ;
2008-01-21 15:41:15 +00:00
cpumaplen = VIR_CPU_MAPLEN ( VIR_NODEINFO_MAXCPUS ( nodeinfo ) ) ;
if ( ( cpumap = malloc ( cpumaplen ) ) = = NULL )
2008-02-07 09:49:13 +00:00
return VIR_PY_INT_FAIL ;
2008-01-21 15:41:15 +00:00
memset ( cpumap , 0 , cpumaplen ) ;
truth = PyBool_FromLong ( 1 ) ;
for ( i = 0 ; i < VIR_NODEINFO_MAXCPUS ( nodeinfo ) ; i + + ) {
PyObject * flag = PyTuple_GetItem ( pycpumap , i ) ;
if ( flag = = truth )
VIR_USE_CPU ( cpumap , i ) ;
else
VIR_UNUSE_CPU ( cpumap , i ) ;
}
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainPinVcpu ( domain , vcpu , cpumap , cpumaplen ) ;
LIBVIRT_END_ALLOW_THREADS ;
2008-01-21 15:41:15 +00:00
Py_DECREF ( truth ) ;
free ( cpumap ) ;
2009-11-25 12:04:47 +00:00
if ( i_retval < 0 )
return VIR_PY_INT_FAIL ;
2008-02-07 09:49:13 +00:00
return VIR_PY_INT_SUCCESS ;
2008-01-21 15:41:15 +00:00
}
2011-07-25 15:00:11 +08:00
static PyObject *
libvirt_virDomainPinVcpuFlags ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
virDomainPtr domain ;
PyObject * pyobj_domain , * pycpumap , * truth ;
virNodeInfo nodeinfo ;
unsigned char * cpumap ;
int cpumaplen , i , vcpu ;
unsigned int flags ;
int i_retval ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " OiOi:virDomainPinVcpuFlags " ,
& pyobj_domain , & vcpu , & pycpumap , & flags ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virNodeGetInfo ( virDomainGetConnect ( domain ) , & nodeinfo ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 )
return VIR_PY_INT_FAIL ;
cpumaplen = VIR_CPU_MAPLEN ( VIR_NODEINFO_MAXCPUS ( nodeinfo ) ) ;
if ( ( cpumap = malloc ( cpumaplen ) ) = = NULL )
return VIR_PY_INT_FAIL ;
memset ( cpumap , 0 , cpumaplen ) ;
truth = PyBool_FromLong ( 1 ) ;
for ( i = 0 ; i < VIR_NODEINFO_MAXCPUS ( nodeinfo ) ; i + + ) {
PyObject * flag = PyTuple_GetItem ( pycpumap , i ) ;
if ( flag = = truth )
VIR_USE_CPU ( cpumap , i ) ;
else
VIR_UNUSE_CPU ( cpumap , i ) ;
}
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainPinVcpuFlags ( domain , vcpu , cpumap , cpumaplen , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
Py_DECREF ( truth ) ;
free ( cpumap ) ;
if ( i_retval < 0 )
return VIR_PY_INT_FAIL ;
return VIR_PY_INT_SUCCESS ;
}
2008-01-21 15:41:15 +00:00
2011-07-25 15:04:50 +08:00
static PyObject *
libvirt_virDomainGetVcpuPinInfo ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
virDomainPtr domain ;
PyObject * pyobj_domain , * pycpumaps = NULL ;
virNodeInfo nodeinfo ;
virDomainInfo dominfo ;
unsigned char * cpumaps ;
2011-08-02 10:03:41 -06:00
size_t cpumaplen , vcpu , pcpu ;
2011-07-25 15:04:50 +08:00
unsigned int flags ;
int i_retval ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Oi:virDomainGetVcpuPinInfo " ,
& pyobj_domain , & flags ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virNodeGetInfo ( virDomainGetConnect ( domain ) , & nodeinfo ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainGetInfo ( domain , & dominfo ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 )
return VIR_PY_NONE ;
cpumaplen = VIR_CPU_MAPLEN ( VIR_NODEINFO_MAXCPUS ( nodeinfo ) ) ;
if ( ( cpumaps = malloc ( dominfo . nrVirtCpu * cpumaplen ) ) = = NULL )
goto cleanup ;
memset ( cpumaps , 0 , dominfo . nrVirtCpu * cpumaplen ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
i_retval = virDomainGetVcpuPinInfo ( domain , dominfo . nrVirtCpu ,
cpumaps , cpumaplen , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( i_retval < 0 )
goto cleanup ;
if ( ( pycpumaps = PyList_New ( dominfo . nrVirtCpu ) ) = = NULL )
goto cleanup ;
for ( vcpu = 0 ; vcpu < dominfo . nrVirtCpu ; vcpu + + ) {
PyObject * mapinfo = PyTuple_New ( VIR_NODEINFO_MAXCPUS ( nodeinfo ) ) ;
if ( mapinfo = = NULL )
goto cleanup ;
for ( pcpu = 0 ; pcpu < VIR_NODEINFO_MAXCPUS ( nodeinfo ) ; pcpu + + ) {
PyTuple_SetItem ( mapinfo , pcpu ,
PyBool_FromLong ( VIR_CPU_USABLE ( cpumaps , cpumaplen , vcpu , pcpu ) ) ) ;
}
PyList_SetItem ( pycpumaps , vcpu , mapinfo ) ;
}
free ( cpumaps ) ;
return pycpumaps ;
cleanup :
free ( cpumaps ) ;
if ( pycpumaps ) { Py_DECREF ( pycpumaps ) ; }
return VIR_PY_NONE ;
}
2006-02-28 12:17:00 +00:00
/************************************************************************
* *
* Global error handler at the Python level *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static PyObject * libvirt_virPythonErrorFuncHandler = NULL ;
static PyObject * libvirt_virPythonErrorFuncCtxt = NULL ;
2008-01-21 15:55:53 +00:00
static PyObject *
2006-11-07 23:18:56 +00:00
libvirt_virGetLastError ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ATTRIBUTE_UNUSED )
{
2009-01-20 22:10:52 +00:00
virError * err ;
2006-11-07 23:18:56 +00:00
PyObject * info ;
2009-01-20 22:10:52 +00:00
if ( ( err = virGetLastError ( ) ) = = NULL )
2008-01-17 22:13:55 +00:00
return VIR_PY_NONE ;
2006-11-07 23:18:56 +00:00
2008-01-17 22:14:57 +00:00
if ( ( info = PyTuple_New ( 9 ) ) = = NULL )
return VIR_PY_NONE ;
2009-01-20 22:10:52 +00:00
PyTuple_SetItem ( info , 0 , PyInt_FromLong ( ( long ) err - > code ) ) ;
PyTuple_SetItem ( info , 1 , PyInt_FromLong ( ( long ) err - > domain ) ) ;
PyTuple_SetItem ( info , 2 , libvirt_constcharPtrWrap ( err - > message ) ) ;
PyTuple_SetItem ( info , 3 , PyInt_FromLong ( ( long ) err - > level ) ) ;
PyTuple_SetItem ( info , 4 , libvirt_constcharPtrWrap ( err - > str1 ) ) ;
PyTuple_SetItem ( info , 5 , libvirt_constcharPtrWrap ( err - > str2 ) ) ;
PyTuple_SetItem ( info , 6 , libvirt_constcharPtrWrap ( err - > str3 ) ) ;
PyTuple_SetItem ( info , 7 , PyInt_FromLong ( ( long ) err - > int1 ) ) ;
PyTuple_SetItem ( info , 8 , PyInt_FromLong ( ( long ) err - > int2 ) ) ;
2006-11-07 23:18:56 +00:00
return info ;
}
2008-01-21 15:55:53 +00:00
static PyObject *
2006-11-07 23:18:56 +00:00
libvirt_virConnGetLastError ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args )
{
2009-01-20 22:10:52 +00:00
virError * err ;
2006-11-07 23:18:56 +00:00
PyObject * info ;
virConnectPtr conn ;
PyObject * pyobj_conn ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virConGetLastError " , & pyobj_conn ) )
return ( NULL ) ;
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
err = virConnGetLastError ( conn ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( err = = NULL )
2008-01-17 22:13:55 +00:00
return VIR_PY_NONE ;
2006-11-07 23:18:56 +00:00
2008-01-17 22:14:57 +00:00
if ( ( info = PyTuple_New ( 9 ) ) = = NULL )
return VIR_PY_NONE ;
2009-01-20 22:10:52 +00:00
PyTuple_SetItem ( info , 0 , PyInt_FromLong ( ( long ) err - > code ) ) ;
PyTuple_SetItem ( info , 1 , PyInt_FromLong ( ( long ) err - > domain ) ) ;
PyTuple_SetItem ( info , 2 , libvirt_constcharPtrWrap ( err - > message ) ) ;
PyTuple_SetItem ( info , 3 , PyInt_FromLong ( ( long ) err - > level ) ) ;
PyTuple_SetItem ( info , 4 , libvirt_constcharPtrWrap ( err - > str1 ) ) ;
PyTuple_SetItem ( info , 5 , libvirt_constcharPtrWrap ( err - > str2 ) ) ;
PyTuple_SetItem ( info , 6 , libvirt_constcharPtrWrap ( err - > str3 ) ) ;
PyTuple_SetItem ( info , 7 , PyInt_FromLong ( ( long ) err - > int1 ) ) ;
PyTuple_SetItem ( info , 8 , PyInt_FromLong ( ( long ) err - > int2 ) ) ;
2006-11-07 23:18:56 +00:00
return info ;
}
2006-02-28 12:17:00 +00:00
static void
libvirt_virErrorFuncHandler ( ATTRIBUTE_UNUSED void * ctx , virErrorPtr err )
{
PyObject * list , * info ;
PyObject * result ;
2011-06-14 12:59:44 -04:00
DEBUG ( " libvirt_virErrorFuncHandler(%p, %s, ...) called \n " , ctx ,
err - > message ) ;
2006-02-28 12:17:00 +00:00
if ( ( err = = NULL ) | | ( err - > code = = VIR_ERR_OK ) )
return ;
2006-10-24 20:28:16 +00:00
LIBVIRT_ENSURE_THREAD_STATE ;
2006-02-28 12:17:00 +00:00
if ( ( libvirt_virPythonErrorFuncHandler = = NULL ) | |
( libvirt_virPythonErrorFuncHandler = = Py_None ) ) {
virDefaultErrorFunc ( err ) ;
} else {
list = PyTuple_New ( 2 ) ;
info = PyTuple_New ( 9 ) ;
PyTuple_SetItem ( list , 0 , libvirt_virPythonErrorFuncCtxt ) ;
PyTuple_SetItem ( list , 1 , info ) ;
Py_XINCREF ( libvirt_virPythonErrorFuncCtxt ) ;
PyTuple_SetItem ( info , 0 , PyInt_FromLong ( ( long ) err - > code ) ) ;
PyTuple_SetItem ( info , 1 , PyInt_FromLong ( ( long ) err - > domain ) ) ;
2008-04-10 16:54:54 +00:00
PyTuple_SetItem ( info , 2 , libvirt_constcharPtrWrap ( err - > message ) ) ;
2006-02-28 12:17:00 +00:00
PyTuple_SetItem ( info , 3 , PyInt_FromLong ( ( long ) err - > level ) ) ;
2008-04-10 16:54:54 +00:00
PyTuple_SetItem ( info , 4 , libvirt_constcharPtrWrap ( err - > str1 ) ) ;
PyTuple_SetItem ( info , 5 , libvirt_constcharPtrWrap ( err - > str2 ) ) ;
PyTuple_SetItem ( info , 6 , libvirt_constcharPtrWrap ( err - > str3 ) ) ;
2006-02-28 12:17:00 +00:00
PyTuple_SetItem ( info , 7 , PyInt_FromLong ( ( long ) err - > int1 ) ) ;
PyTuple_SetItem ( info , 8 , PyInt_FromLong ( ( long ) err - > int2 ) ) ;
2008-04-10 16:54:54 +00:00
/* TODO pass conn and dom if available */
2006-02-28 12:17:00 +00:00
result = PyEval_CallObject ( libvirt_virPythonErrorFuncHandler , list ) ;
Py_XDECREF ( list ) ;
Py_XDECREF ( result ) ;
}
2006-10-24 20:28:16 +00:00
LIBVIRT_RELEASE_THREAD_STATE ;
2006-02-28 12:17:00 +00:00
}
static PyObject *
libvirt_virRegisterErrorHandler ( ATTRIBUTE_UNUSED PyObject * self ,
PyObject * args )
{
PyObject * py_retval ;
PyObject * pyobj_f ;
PyObject * pyobj_ctx ;
if ( ! PyArg_ParseTuple
( args , ( char * ) " OO:xmlRegisterErrorHandler " , & pyobj_f ,
& pyobj_ctx ) )
return ( NULL ) ;
2011-06-14 12:59:44 -04:00
DEBUG ( " libvirt_virRegisterErrorHandler(%p, %p) called \n " , pyobj_ctx ,
pyobj_f ) ;
2006-02-28 12:17:00 +00:00
virSetErrorFunc ( NULL , libvirt_virErrorFuncHandler ) ;
if ( libvirt_virPythonErrorFuncHandler ! = NULL ) {
Py_XDECREF ( libvirt_virPythonErrorFuncHandler ) ;
}
if ( libvirt_virPythonErrorFuncCtxt ! = NULL ) {
Py_XDECREF ( libvirt_virPythonErrorFuncCtxt ) ;
}
if ( ( pyobj_f = = Py_None ) & & ( pyobj_ctx = = Py_None ) ) {
libvirt_virPythonErrorFuncHandler = NULL ;
2008-04-10 16:54:54 +00:00
libvirt_virPythonErrorFuncCtxt = NULL ;
2006-02-28 12:17:00 +00:00
} else {
2008-04-10 16:54:54 +00:00
Py_XINCREF ( pyobj_ctx ) ;
Py_XINCREF ( pyobj_f ) ;
2006-02-28 12:17:00 +00:00
2008-04-10 16:54:54 +00:00
/* TODO: check f is a function ! */
libvirt_virPythonErrorFuncHandler = pyobj_f ;
libvirt_virPythonErrorFuncCtxt = pyobj_ctx ;
2006-02-28 12:17:00 +00:00
}
py_retval = libvirt_intWrap ( 1 ) ;
return ( py_retval ) ;
}
2007-12-05 19:09:23 +00:00
static int virConnectCredCallbackWrapper ( virConnectCredentialPtr cred ,
unsigned int ncred ,
void * cbdata ) {
PyObject * list ;
PyObject * pycred ;
PyObject * pyauth = ( PyObject * ) cbdata ;
PyObject * pycbdata ;
PyObject * pycb ;
PyObject * pyret ;
int ret = - 1 , i ;
LIBVIRT_ENSURE_THREAD_STATE ;
pycb = PyList_GetItem ( pyauth , 1 ) ;
pycbdata = PyList_GetItem ( pyauth , 2 ) ;
list = PyTuple_New ( 2 ) ;
pycred = PyTuple_New ( ncred ) ;
for ( i = 0 ; i < ncred ; i + + ) {
PyObject * pycreditem ;
pycreditem = PyList_New ( 5 ) ;
Py_INCREF ( Py_None ) ;
PyTuple_SetItem ( pycred , i , pycreditem ) ;
PyList_SetItem ( pycreditem , 0 , PyInt_FromLong ( ( long ) cred [ i ] . type ) ) ;
PyList_SetItem ( pycreditem , 1 , PyString_FromString ( cred [ i ] . prompt ) ) ;
if ( cred [ i ] . challenge ) {
PyList_SetItem ( pycreditem , 2 , PyString_FromString ( cred [ i ] . challenge ) ) ;
} else {
Py_INCREF ( Py_None ) ;
PyList_SetItem ( pycreditem , 2 , Py_None ) ;
}
if ( cred [ i ] . defresult ) {
PyList_SetItem ( pycreditem , 3 , PyString_FromString ( cred [ i ] . defresult ) ) ;
} else {
Py_INCREF ( Py_None ) ;
PyList_SetItem ( pycreditem , 3 , Py_None ) ;
}
PyList_SetItem ( pycreditem , 4 , Py_None ) ;
}
PyTuple_SetItem ( list , 0 , pycred ) ;
Py_XINCREF ( pycbdata ) ;
PyTuple_SetItem ( list , 1 , pycbdata ) ;
PyErr_Clear ( ) ;
pyret = PyEval_CallObject ( pycb , list ) ;
if ( PyErr_Occurred ( ) )
goto cleanup ;
ret = PyLong_AsLong ( pyret ) ;
if ( ret = = 0 ) {
for ( i = 0 ; i < ncred ; i + + ) {
PyObject * pycreditem ;
PyObject * pyresult ;
char * result = NULL ;
pycreditem = PyTuple_GetItem ( pycred , i ) ;
pyresult = PyList_GetItem ( pycreditem , 4 ) ;
if ( pyresult ! = Py_None )
result = PyString_AsString ( pyresult ) ;
if ( result ! = NULL ) {
cred [ i ] . result = strdup ( result ) ;
cred [ i ] . resultlen = strlen ( result ) ;
} else {
cred [ i ] . result = NULL ;
cred [ i ] . resultlen = 0 ;
}
}
}
cleanup :
Py_XDECREF ( list ) ;
Py_XDECREF ( pyret ) ;
LIBVIRT_RELEASE_THREAD_STATE ;
return ret ;
}
static PyObject *
libvirt_virConnectOpenAuth ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
PyObject * py_retval ;
virConnectPtr c_retval ;
char * name ;
2011-07-07 12:13:45 -06:00
unsigned int flags ;
2007-12-05 19:09:23 +00:00
PyObject * pyauth ;
PyObject * pycredcb ;
PyObject * pycredtype ;
virConnectAuth auth ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " zOi:virConnectOpenAuth " , & name , & pyauth , & flags ) )
return ( NULL ) ;
pycredtype = PyList_GetItem ( pyauth , 0 ) ;
pycredcb = PyList_GetItem ( pyauth , 1 ) ;
auth . ncredtype = PyList_Size ( pycredtype ) ;
if ( auth . ncredtype ) {
int i ;
2007-12-11 21:57:29 +00:00
auth . credtype = malloc ( sizeof ( * auth . credtype ) * auth . ncredtype ) ;
2008-01-17 22:13:55 +00:00
if ( auth . credtype = = NULL )
return VIR_PY_NONE ;
2007-12-05 19:09:23 +00:00
for ( i = 0 ; i < auth . ncredtype ; i + + ) {
PyObject * val ;
val = PyList_GetItem ( pycredtype , i ) ;
auth . credtype [ i ] = ( int ) PyLong_AsLong ( val ) ;
}
}
auth . cb = pycredcb ? virConnectCredCallbackWrapper : NULL ;
auth . cbdata = pyauth ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virConnectOpenAuth ( name , & auth , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
2011-12-19 16:12:19 +08:00
free ( auth . credtype ) ;
2007-12-05 19:09:23 +00:00
py_retval = libvirt_virConnectPtrWrap ( ( virConnectPtr ) c_retval ) ;
return ( py_retval ) ;
}
2006-02-28 12:17:00 +00:00
/************************************************************************
* *
* Wrappers for functions where generator fails *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2007-05-29 14:58:27 +00:00
static PyObject *
libvirt_virGetVersion ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args )
{
char * type = NULL ;
unsigned long libVer , typeVer = 0 ;
int c_retval ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " |s " , & type ) )
return NULL ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
if ( type = = NULL )
c_retval = virGetVersion ( & libVer , NULL , NULL ) ;
else
c_retval = virGetVersion ( & libVer , type , & typeVer ) ;
LIBVIRT_END_ALLOW_THREADS ;
2008-01-17 22:13:55 +00:00
if ( c_retval = = - 1 )
return VIR_PY_NONE ;
2007-05-29 14:58:27 +00:00
if ( type = = NULL )
return PyInt_FromLong ( libVer ) ;
else
return Py_BuildValue ( ( char * ) " kk " , libVer , typeVer ) ;
}
2010-01-22 11:01:09 +01:00
static PyObject *
libvirt_virConnectGetVersion ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args )
{
unsigned long hvVersion ;
int c_retval ;
virConnectPtr conn ;
PyObject * pyobj_conn ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virConnectGetVersion " ,
& pyobj_conn ) )
return ( NULL ) ;
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virConnectGetVersion ( conn , & hvVersion ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval = = - 1 )
return VIR_PY_INT_FAIL ;
return PyInt_FromLong ( hvVersion ) ;
}
2009-11-12 10:53:26 -05:00
static PyObject *
libvirt_virConnectGetLibVersion ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args )
{
unsigned long libVer ;
int c_retval ;
virConnectPtr conn ;
PyObject * pyobj_conn ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virConnectGetLibVersion " ,
& pyobj_conn ) )
return ( NULL ) ;
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virConnectGetLibVersion ( conn , & libVer ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval = = - 1 )
return VIR_PY_INT_FAIL ;
return PyInt_FromLong ( libVer ) ;
}
2006-01-28 20:24:55 +00:00
2006-01-31 10:24:12 +00:00
static PyObject *
2006-02-09 17:45:11 +00:00
libvirt_virConnectListDomainsID ( PyObject * self ATTRIBUTE_UNUSED ,
2006-01-31 10:24:12 +00:00
PyObject * args ) {
PyObject * py_retval ;
2011-12-29 16:20:00 +08:00
int * ids = NULL , c_retval , i ;
2006-01-31 10:24:12 +00:00
virConnectPtr conn ;
PyObject * pyobj_conn ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virConnectListDomains " , & pyobj_conn ) )
return ( NULL ) ;
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
2006-10-24 20:28:16 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2011-12-29 16:20:00 +08:00
c_retval = virConnectNumOfDomains ( conn ) ;
2006-10-24 20:28:16 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-01-17 22:13:55 +00:00
if ( c_retval < 0 )
return VIR_PY_NONE ;
2011-12-29 16:20:00 +08:00
if ( c_retval ) {
ids = malloc ( sizeof ( * ids ) * c_retval ) ;
if ( ! ids )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virConnectListDomains ( conn , ids , c_retval ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 ) {
free ( ids ) ;
return VIR_PY_NONE ;
}
}
2006-01-31 10:24:12 +00:00
py_retval = PyList_New ( c_retval ) ;
2011-12-29 16:20:00 +08:00
if ( ids ) {
for ( i = 0 ; i < c_retval ; i + + ) {
PyList_SetItem ( py_retval , i , libvirt_intWrap ( ids [ i ] ) ) ;
}
free ( ids ) ;
2006-01-31 10:24:12 +00:00
}
2011-12-29 16:20:00 +08:00
2006-01-31 10:24:12 +00:00
return ( py_retval ) ;
}
2006-11-16 00:17:10 +00:00
static PyObject *
libvirt_virConnectListDefinedDomains ( PyObject * self ATTRIBUTE_UNUSED ,
2008-04-10 16:54:54 +00:00
PyObject * args ) {
2006-11-16 00:17:10 +00:00
PyObject * py_retval ;
char * * names = NULL ;
int c_retval , i ;
virConnectPtr conn ;
PyObject * pyobj_conn ;
2007-03-09 15:42:50 +00:00
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virConnectListDefinedDomains " , & pyobj_conn ) )
2006-11-16 00:17:10 +00:00
return ( NULL ) ;
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2006-11-16 00:17:10 +00:00
c_retval = virConnectNumOfDefinedDomains ( conn ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-01-17 22:13:55 +00:00
if ( c_retval < 0 )
return VIR_PY_NONE ;
2008-02-05 19:27:37 +00:00
2006-11-16 00:17:10 +00:00
if ( c_retval ) {
2007-12-11 21:57:29 +00:00
names = malloc ( sizeof ( * names ) * c_retval ) ;
2008-01-17 22:13:55 +00:00
if ( ! names )
return VIR_PY_NONE ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2007-03-06 21:55:44 +00:00
c_retval = virConnectListDefinedDomains ( conn , names , c_retval ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2006-11-16 00:17:10 +00:00
if ( c_retval < 0 ) {
free ( names ) ;
2008-01-17 22:13:55 +00:00
return VIR_PY_NONE ;
2006-11-16 00:17:10 +00:00
}
}
py_retval = PyList_New ( c_retval ) ;
if ( names ) {
for ( i = 0 ; i < c_retval ; i + + ) {
PyList_SetItem ( py_retval , i , libvirt_constcharPtrWrap ( names [ i ] ) ) ;
free ( names [ i ] ) ;
}
free ( names ) ;
}
return ( py_retval ) ;
}
2010-04-20 11:49:27 +02:00
static PyObject *
libvirt_virDomainSnapshotListNames ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
PyObject * py_retval ;
char * * names = NULL ;
int c_retval , i ;
virDomainPtr dom ;
PyObject * pyobj_dom ;
2011-07-07 12:13:45 -06:00
unsigned int flags ;
2010-04-20 11:49:27 +02:00
if ( ! PyArg_ParseTuple ( args , ( char * ) " Oi:virDomainSnapshotListNames " , & pyobj_dom , & flags ) )
return ( NULL ) ;
dom = ( virDomainPtr ) PyvirDomain_Get ( pyobj_dom ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virDomainSnapshotNum ( dom , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
return VIR_PY_NONE ;
if ( c_retval ) {
names = malloc ( sizeof ( * names ) * c_retval ) ;
if ( ! names )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virDomainSnapshotListNames ( dom , names , c_retval , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 ) {
free ( names ) ;
return VIR_PY_NONE ;
}
}
py_retval = PyList_New ( c_retval ) ;
if ( names ) {
2011-09-24 19:56:26 -06:00
for ( i = 0 ; i < c_retval ; i + + ) {
PyList_SetItem ( py_retval , i , libvirt_constcharPtrWrap ( names [ i ] ) ) ;
free ( names [ i ] ) ;
}
free ( names ) ;
}
return ( py_retval ) ;
}
static PyObject *
libvirt_virDomainSnapshotListChildrenNames ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
PyObject * py_retval ;
char * * names = NULL ;
int c_retval , i ;
virDomainSnapshotPtr snap ;
PyObject * pyobj_snap ;
unsigned int flags ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Oi:virDomainSnapshotListChildrenNames " , & pyobj_snap , & flags ) )
return ( NULL ) ;
snap = ( virDomainSnapshotPtr ) PyvirDomainSnapshot_Get ( pyobj_snap ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virDomainSnapshotNumChildren ( snap , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
return VIR_PY_NONE ;
if ( c_retval ) {
names = malloc ( sizeof ( * names ) * c_retval ) ;
if ( ! names )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virDomainSnapshotListChildrenNames ( snap , names , c_retval , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 ) {
free ( names ) ;
return VIR_PY_NONE ;
}
}
py_retval = PyList_New ( c_retval ) ;
if ( names ) {
2010-04-20 11:49:27 +02:00
for ( i = 0 ; i < c_retval ; i + + ) {
PyList_SetItem ( py_retval , i , libvirt_constcharPtrWrap ( names [ i ] ) ) ;
free ( names [ i ] ) ;
}
free ( names ) ;
}
return ( py_retval ) ;
}
2010-05-19 09:02:30 -04:00
static PyObject *
libvirt_virDomainRevertToSnapshot ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
int c_retval ;
virDomainSnapshotPtr snap ;
PyObject * pyobj_snap ;
PyObject * pyobj_dom ;
2011-07-07 12:13:45 -06:00
unsigned int flags ;
2010-05-19 09:02:30 -04:00
if ( ! PyArg_ParseTuple ( args , ( char * ) " OOi:virDomainRevertToSnapshot " , & pyobj_dom , & pyobj_snap , & flags ) )
return ( NULL ) ;
snap = ( virDomainSnapshotPtr ) PyvirDomainSnapshot_Get ( pyobj_snap ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virDomainRevertToSnapshot ( snap , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
return VIR_PY_INT_FAIL ;
return PyInt_FromLong ( c_retval ) ;
}
2006-01-31 10:24:12 +00:00
static PyObject *
2006-02-09 17:45:11 +00:00
libvirt_virDomainGetInfo ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
2006-01-31 10:24:12 +00:00
PyObject * py_retval ;
int c_retval ;
virDomainPtr domain ;
PyObject * pyobj_domain ;
virDomainInfo info ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virDomainGetInfo " , & pyobj_domain ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
2006-10-24 20:28:16 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2006-01-31 10:24:12 +00:00
c_retval = virDomainGetInfo ( domain , & info ) ;
2006-10-24 20:28:16 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-01-17 22:13:55 +00:00
if ( c_retval < 0 )
return VIR_PY_NONE ;
2006-01-31 10:24:12 +00:00
py_retval = PyList_New ( 5 ) ;
2006-02-09 17:45:11 +00:00
PyList_SetItem ( py_retval , 0 , libvirt_intWrap ( ( int ) info . state ) ) ;
2006-11-15 19:40:00 +00:00
PyList_SetItem ( py_retval , 1 , libvirt_ulongWrap ( info . maxMem ) ) ;
PyList_SetItem ( py_retval , 2 , libvirt_ulongWrap ( info . memory ) ) ;
2006-02-09 17:45:11 +00:00
PyList_SetItem ( py_retval , 3 , libvirt_intWrap ( ( int ) info . nrVirtCpu ) ) ;
2006-01-31 10:24:12 +00:00
PyList_SetItem ( py_retval , 4 ,
2006-02-09 17:45:11 +00:00
libvirt_longlongWrap ( ( unsigned long long ) info . cpuTime ) ) ;
2006-01-31 10:24:12 +00:00
return ( py_retval ) ;
}
2011-04-22 13:31:35 +02:00
static PyObject *
libvirt_virDomainGetState ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args )
{
PyObject * py_retval ;
int c_retval ;
virDomainPtr domain ;
PyObject * pyobj_domain ;
int state ;
int reason ;
unsigned int flags ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Oi:virDomainGetState " ,
& pyobj_domain , & flags ) )
return NULL ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virDomainGetState ( domain , & state , & reason , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
return VIR_PY_NONE ;
py_retval = PyList_New ( 2 ) ;
PyList_SetItem ( py_retval , 0 , libvirt_intWrap ( state ) ) ;
PyList_SetItem ( py_retval , 1 , libvirt_intWrap ( reason ) ) ;
return py_retval ;
}
2011-05-24 11:28:50 +03:00
static PyObject *
libvirt_virDomainGetControlInfo ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
PyObject * py_retval ;
int c_retval ;
virDomainPtr domain ;
PyObject * pyobj_domain ;
virDomainControlInfo info ;
unsigned int flags ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Oi:virDomainGetControlInfo " ,
& pyobj_domain , & flags ) )
return NULL ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virDomainGetControlInfo ( domain , & info , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
return VIR_PY_NONE ;
py_retval = PyList_New ( 3 ) ;
PyList_SetItem ( py_retval , 0 , libvirt_intWrap ( info . state ) ) ;
PyList_SetItem ( py_retval , 1 , libvirt_intWrap ( info . details ) ) ;
PyList_SetItem ( py_retval , 2 , libvirt_longlongWrap ( info . stateTime ) ) ;
return py_retval ;
}
2010-04-28 13:42:13 +01:00
static PyObject *
libvirt_virDomainGetBlockInfo ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
PyObject * py_retval ;
int c_retval ;
virDomainPtr domain ;
PyObject * pyobj_domain ;
virDomainBlockInfo info ;
const char * path ;
unsigned int flags ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Ozi:virDomainGetInfo " , & pyobj_domain , & path , & flags ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virDomainGetBlockInfo ( domain , path , & info , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
return VIR_PY_NONE ;
py_retval = PyList_New ( 3 ) ;
PyList_SetItem ( py_retval , 0 , libvirt_ulonglongWrap ( info . capacity ) ) ;
PyList_SetItem ( py_retval , 1 , libvirt_ulonglongWrap ( info . allocation ) ) ;
PyList_SetItem ( py_retval , 2 , libvirt_ulonglongWrap ( info . physical ) ) ;
return ( py_retval ) ;
}
2006-03-29 12:46:03 +00:00
static PyObject *
libvirt_virNodeGetInfo ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
PyObject * py_retval ;
int c_retval ;
virConnectPtr conn ;
PyObject * pyobj_conn ;
virNodeInfo info ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virDomainGetInfo " , & pyobj_conn ) )
return ( NULL ) ;
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
2006-10-24 20:28:16 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2006-03-29 12:46:03 +00:00
c_retval = virNodeGetInfo ( conn , & info ) ;
2006-10-24 20:28:16 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-01-17 22:13:55 +00:00
if ( c_retval < 0 )
return VIR_PY_NONE ;
2006-03-29 12:46:03 +00:00
py_retval = PyList_New ( 8 ) ;
2006-03-29 13:33:37 +00:00
PyList_SetItem ( py_retval , 0 , libvirt_constcharPtrWrap ( & info . model [ 0 ] ) ) ;
PyList_SetItem ( py_retval , 1 , libvirt_longWrap ( ( long ) info . memory > > 10 ) ) ;
2006-03-29 12:46:03 +00:00
PyList_SetItem ( py_retval , 2 , libvirt_intWrap ( ( int ) info . cpus ) ) ;
PyList_SetItem ( py_retval , 3 , libvirt_intWrap ( ( int ) info . mhz ) ) ;
PyList_SetItem ( py_retval , 4 , libvirt_intWrap ( ( int ) info . nodes ) ) ;
PyList_SetItem ( py_retval , 5 , libvirt_intWrap ( ( int ) info . sockets ) ) ;
PyList_SetItem ( py_retval , 6 , libvirt_intWrap ( ( int ) info . cores ) ) ;
PyList_SetItem ( py_retval , 7 , libvirt_intWrap ( ( int ) info . threads ) ) ;
return ( py_retval ) ;
}
2008-01-21 15:55:53 +00:00
static PyObject *
2006-02-23 11:26:17 +00:00
libvirt_virDomainGetUUID ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
PyObject * py_retval ;
Mon Jan 23 14:36:18 IST 2007 Mark McLoughlin <markmc@redhat.com>
* include/libvirt/libvirt.h.in: add VIR_UUID_BUFLEN and
VIR_UUID_STRING_BUFLEN
* libvirt/proxy/libvirt_proxy.c, libvirt/src/hash.c,
libvirt/src/internal.h, libvirt/src/libvirt.c,
libvirt/src/proxy_internal.c, libvirt/src/test.c,
libvirt/src/virsh.c, libvirt/src/xend_internal.c,
libvirt/src/xm_internal.c, libvirt/src/xml.c,
libvirt/python/libvir.c: use them
2007-01-23 14:39:45 +00:00
unsigned char uuid [ VIR_UUID_BUFLEN ] ;
2006-02-23 11:26:17 +00:00
virDomainPtr domain ;
PyObject * pyobj_domain ;
2006-10-24 20:28:16 +00:00
int c_retval ;
2006-02-23 11:26:17 +00:00
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virDomainGetUUID " , & pyobj_domain ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
2008-01-17 22:13:55 +00:00
if ( domain = = NULL )
return VIR_PY_NONE ;
2006-10-24 20:28:16 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virDomainGetUUID ( domain , & uuid [ 0 ] ) ;
LIBVIRT_END_ALLOW_THREADS ;
2008-01-17 22:13:55 +00:00
if ( c_retval < 0 )
return VIR_PY_NONE ;
Mon Jan 23 14:36:18 IST 2007 Mark McLoughlin <markmc@redhat.com>
* include/libvirt/libvirt.h.in: add VIR_UUID_BUFLEN and
VIR_UUID_STRING_BUFLEN
* libvirt/proxy/libvirt_proxy.c, libvirt/src/hash.c,
libvirt/src/internal.h, libvirt/src/libvirt.c,
libvirt/src/proxy_internal.c, libvirt/src/test.c,
libvirt/src/virsh.c, libvirt/src/xend_internal.c,
libvirt/src/xm_internal.c, libvirt/src/xml.c,
libvirt/python/libvir.c: use them
2007-01-23 14:39:45 +00:00
py_retval = PyString_FromStringAndSize ( ( char * ) & uuid [ 0 ] , VIR_UUID_BUFLEN ) ;
2006-02-23 11:26:17 +00:00
return ( py_retval ) ;
}
2008-06-10 15:20:25 +00:00
static PyObject *
libvirt_virDomainGetUUIDString ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
PyObject * py_retval ;
char uuidstr [ VIR_UUID_STRING_BUFLEN ] ;
virDomainPtr dom ;
PyObject * pyobj_dom ;
int c_retval ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virDomainGetUUIDString " ,
& pyobj_dom ) )
return ( NULL ) ;
dom = ( virDomainPtr ) PyvirDomain_Get ( pyobj_dom ) ;
if ( dom = = NULL )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virDomainGetUUIDString ( dom , & uuidstr [ 0 ] ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
return VIR_PY_NONE ;
py_retval = PyString_FromString ( ( char * ) & uuidstr [ 0 ] ) ;
return ( py_retval ) ;
}
2007-03-06 21:55:44 +00:00
static PyObject *
2006-02-24 12:26:56 +00:00
libvirt_virDomainLookupByUUID ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
PyObject * py_retval ;
virDomainPtr c_retval ;
virConnectPtr conn ;
PyObject * pyobj_conn ;
unsigned char * uuid ;
int len ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Oz#:virDomainLookupByUUID " , & pyobj_conn , & uuid , & len ) )
return ( NULL ) ;
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
2008-01-17 22:13:55 +00:00
if ( ( uuid = = NULL ) | | ( len ! = VIR_UUID_BUFLEN ) )
return VIR_PY_NONE ;
2006-02-24 12:26:56 +00:00
2006-10-24 20:28:16 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2006-02-24 12:26:56 +00:00
c_retval = virDomainLookupByUUID ( conn , uuid ) ;
2006-10-24 20:28:16 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2006-02-24 12:26:56 +00:00
py_retval = libvirt_virDomainPtrWrap ( ( virDomainPtr ) c_retval ) ;
return ( py_retval ) ;
}
2007-03-09 15:42:50 +00:00
static PyObject *
libvirt_virConnectListNetworks ( PyObject * self ATTRIBUTE_UNUSED ,
2008-04-10 16:54:54 +00:00
PyObject * args ) {
2007-03-09 15:42:50 +00:00
PyObject * py_retval ;
char * * names = NULL ;
int c_retval , i ;
virConnectPtr conn ;
PyObject * pyobj_conn ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virConnectListNetworks " , & pyobj_conn ) )
return ( NULL ) ;
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2007-03-09 15:42:50 +00:00
c_retval = virConnectNumOfNetworks ( conn ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-01-17 22:13:55 +00:00
if ( c_retval < 0 )
return VIR_PY_NONE ;
2007-03-09 15:42:50 +00:00
if ( c_retval ) {
2007-12-11 21:57:29 +00:00
names = malloc ( sizeof ( * names ) * c_retval ) ;
2008-01-17 22:13:55 +00:00
if ( ! names )
return VIR_PY_NONE ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2007-03-09 15:42:50 +00:00
c_retval = virConnectListNetworks ( conn , names , c_retval ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2007-03-09 15:42:50 +00:00
if ( c_retval < 0 ) {
free ( names ) ;
2008-01-17 22:13:55 +00:00
return VIR_PY_NONE ;
2007-03-09 15:42:50 +00:00
}
}
py_retval = PyList_New ( c_retval ) ;
if ( names ) {
for ( i = 0 ; i < c_retval ; i + + ) {
PyList_SetItem ( py_retval , i , libvirt_constcharPtrWrap ( names [ i ] ) ) ;
free ( names [ i ] ) ;
}
free ( names ) ;
}
return ( py_retval ) ;
}
static PyObject *
libvirt_virConnectListDefinedNetworks ( PyObject * self ATTRIBUTE_UNUSED ,
2008-04-10 16:54:54 +00:00
PyObject * args ) {
2007-03-09 15:42:50 +00:00
PyObject * py_retval ;
char * * names = NULL ;
int c_retval , i ;
virConnectPtr conn ;
PyObject * pyobj_conn ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virConnectListDefinedNetworks " , & pyobj_conn ) )
return ( NULL ) ;
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2007-03-09 15:42:50 +00:00
c_retval = virConnectNumOfDefinedNetworks ( conn ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-01-17 22:13:55 +00:00
if ( c_retval < 0 )
return VIR_PY_NONE ;
2008-02-05 19:27:37 +00:00
2007-03-09 15:42:50 +00:00
if ( c_retval ) {
2007-12-11 21:57:29 +00:00
names = malloc ( sizeof ( * names ) * c_retval ) ;
2008-01-17 22:13:55 +00:00
if ( ! names )
return VIR_PY_NONE ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2007-03-09 15:42:50 +00:00
c_retval = virConnectListDefinedNetworks ( conn , names , c_retval ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2007-03-09 15:42:50 +00:00
if ( c_retval < 0 ) {
free ( names ) ;
2008-01-17 22:13:55 +00:00
return VIR_PY_NONE ;
2007-03-09 15:42:50 +00:00
}
}
py_retval = PyList_New ( c_retval ) ;
if ( names ) {
for ( i = 0 ; i < c_retval ; i + + ) {
PyList_SetItem ( py_retval , i , libvirt_constcharPtrWrap ( names [ i ] ) ) ;
free ( names [ i ] ) ;
}
free ( names ) ;
}
return ( py_retval ) ;
}
2008-01-21 15:55:53 +00:00
static PyObject *
2007-03-09 15:42:50 +00:00
libvirt_virNetworkGetUUID ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
PyObject * py_retval ;
unsigned char uuid [ VIR_UUID_BUFLEN ] ;
virNetworkPtr domain ;
PyObject * pyobj_domain ;
int c_retval ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virNetworkGetUUID " , & pyobj_domain ) )
return ( NULL ) ;
domain = ( virNetworkPtr ) PyvirNetwork_Get ( pyobj_domain ) ;
2008-01-17 22:13:55 +00:00
if ( domain = = NULL )
return VIR_PY_NONE ;
2007-03-09 15:42:50 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virNetworkGetUUID ( domain , & uuid [ 0 ] ) ;
LIBVIRT_END_ALLOW_THREADS ;
2008-01-17 22:13:55 +00:00
if ( c_retval < 0 )
return VIR_PY_NONE ;
2007-03-09 15:42:50 +00:00
py_retval = PyString_FromStringAndSize ( ( char * ) & uuid [ 0 ] , VIR_UUID_BUFLEN ) ;
return ( py_retval ) ;
}
2008-06-10 15:20:25 +00:00
static PyObject *
libvirt_virNetworkGetUUIDString ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
PyObject * py_retval ;
char uuidstr [ VIR_UUID_STRING_BUFLEN ] ;
virNetworkPtr net ;
PyObject * pyobj_net ;
int c_retval ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virNetworkGetUUIDString " ,
& pyobj_net ) )
return ( NULL ) ;
net = ( virNetworkPtr ) PyvirNetwork_Get ( pyobj_net ) ;
if ( net = = NULL )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virNetworkGetUUIDString ( net , & uuidstr [ 0 ] ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
return VIR_PY_NONE ;
py_retval = PyString_FromString ( ( char * ) & uuidstr [ 0 ] ) ;
return ( py_retval ) ;
}
2007-03-09 15:42:50 +00:00
static PyObject *
libvirt_virNetworkLookupByUUID ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
PyObject * py_retval ;
virNetworkPtr c_retval ;
virConnectPtr conn ;
PyObject * pyobj_conn ;
unsigned char * uuid ;
int len ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Oz#:virNetworkLookupByUUID " , & pyobj_conn , & uuid , & len ) )
return ( NULL ) ;
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
2008-01-17 22:13:55 +00:00
if ( ( uuid = = NULL ) | | ( len ! = VIR_UUID_BUFLEN ) )
return VIR_PY_NONE ;
2007-03-09 15:42:50 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virNetworkLookupByUUID ( conn , uuid ) ;
LIBVIRT_END_ALLOW_THREADS ;
py_retval = libvirt_virNetworkPtrWrap ( ( virNetworkPtr ) c_retval ) ;
return ( py_retval ) ;
}
2008-01-21 15:55:53 +00:00
static PyObject *
2007-04-10 23:15:58 +00:00
libvirt_virDomainGetAutostart ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
PyObject * py_retval ;
int c_retval , autostart ;
virDomainPtr domain ;
PyObject * pyobj_domain ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virDomainGetAutostart " , & pyobj_domain ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virDomainGetAutostart ( domain , & autostart ) ;
LIBVIRT_END_ALLOW_THREADS ;
2008-01-17 22:13:55 +00:00
if ( c_retval < 0 )
2008-02-07 09:49:13 +00:00
return VIR_PY_INT_FAIL ;
2007-04-10 23:15:58 +00:00
py_retval = libvirt_intWrap ( autostart ) ;
return ( py_retval ) ;
}
2008-01-21 15:55:53 +00:00
static PyObject *
2007-04-10 23:15:58 +00:00
libvirt_virNetworkGetAutostart ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
PyObject * py_retval ;
int c_retval , autostart ;
virNetworkPtr network ;
PyObject * pyobj_network ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virNetworkGetAutostart " , & pyobj_network ) )
return ( NULL ) ;
network = ( virNetworkPtr ) PyvirNetwork_Get ( pyobj_network ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virNetworkGetAutostart ( network , & autostart ) ;
LIBVIRT_END_ALLOW_THREADS ;
2008-01-17 22:13:55 +00:00
if ( c_retval < 0 )
2008-02-07 09:49:13 +00:00
return VIR_PY_INT_FAIL ;
2007-04-10 23:15:58 +00:00
py_retval = libvirt_intWrap ( autostart ) ;
return ( py_retval ) ;
}
2008-01-21 15:55:53 +00:00
static PyObject *
libvirt_virNodeGetCellsFreeMemory ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args )
2007-12-07 08:41:01 +00:00
{
PyObject * py_retval ;
PyObject * pyobj_conn ;
int startCell , maxCells , c_retval , i ;
virConnectPtr conn ;
unsigned long long * freeMems ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Oii:virNodeGetCellsFreeMemory " , & pyobj_conn , & startCell , & maxCells ) )
return ( NULL ) ;
2007-04-10 23:15:58 +00:00
2007-12-07 08:41:01 +00:00
if ( ( startCell < 0 ) | | ( maxCells < = 0 ) | | ( startCell + maxCells > 10000 ) )
2011-07-06 19:25:18 +02:00
return VIR_PY_NONE ;
2007-12-07 08:41:01 +00:00
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
2011-07-06 19:25:18 +02:00
freeMems = malloc ( maxCells * sizeof ( * freeMems ) ) ;
2007-12-07 08:41:01 +00:00
if ( freeMems = = NULL )
2011-07-06 19:25:18 +02:00
return VIR_PY_NONE ;
2007-12-07 08:41:01 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virNodeGetCellsFreeMemory ( conn , freeMems , startCell , maxCells ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 ) {
2008-01-17 22:13:55 +00:00
free ( freeMems ) ;
return VIR_PY_NONE ;
2007-12-07 08:41:01 +00:00
}
py_retval = PyList_New ( c_retval ) ;
for ( i = 0 ; i < c_retval ; i + + ) {
2008-04-10 16:54:54 +00:00
PyList_SetItem ( py_retval , i ,
libvirt_longlongWrap ( ( long long ) freeMems [ i ] ) ) ;
2007-12-07 08:41:01 +00:00
}
free ( freeMems ) ;
return ( py_retval ) ;
}
2007-03-09 15:42:50 +00:00
2011-11-28 18:19:27 +01:00
static PyObject *
libvirt_virNodeGetCPUStats ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args )
{
PyObject * ret ;
PyObject * pyobj_conn ;
virConnectPtr conn ;
unsigned int flags ;
int cpuNum , c_retval , i ;
int nparams = 0 ;
virNodeCPUStatsPtr stats = NULL ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Oii:virNodeGetCPUStats " , & pyobj_conn , & cpuNum , & flags ) )
return ( NULL ) ;
conn = ( virConnectPtr ) ( PyvirConnect_Get ( pyobj_conn ) ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virNodeGetCPUStats ( conn , cpuNum , NULL , & nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
return VIR_PY_NONE ;
if ( nparams ) {
if ( ! ( stats = malloc ( sizeof ( * stats ) * nparams ) ) )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virNodeGetCPUStats ( conn , cpuNum , stats , & nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 ) {
free ( stats ) ;
return VIR_PY_NONE ;
}
}
if ( ! ( ret = PyDict_New ( ) ) ) {
free ( stats ) ;
return VIR_PY_NONE ;
}
for ( i = 0 ; i < nparams ; i + + ) {
PyDict_SetItem ( ret ,
libvirt_constcharPtrWrap ( stats [ i ] . field ) ,
libvirt_ulonglongWrap ( stats [ i ] . value ) ) ;
}
free ( stats ) ;
return ret ;
}
2008-02-20 15:26:22 +00:00
2011-11-28 18:19:28 +01:00
static PyObject *
libvirt_virNodeGetMemoryStats ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args )
{
PyObject * ret ;
PyObject * pyobj_conn ;
virConnectPtr conn ;
unsigned int flags ;
int cellNum , c_retval , i ;
int nparams = 0 ;
virNodeMemoryStatsPtr stats = NULL ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Oii:virNodeGetMemoryStats " , & pyobj_conn , & cellNum , & flags ) )
return ( NULL ) ;
conn = ( virConnectPtr ) ( PyvirConnect_Get ( pyobj_conn ) ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virNodeGetMemoryStats ( conn , cellNum , NULL , & nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
return VIR_PY_NONE ;
if ( nparams ) {
if ( ! ( stats = malloc ( sizeof ( * stats ) * nparams ) ) )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virNodeGetMemoryStats ( conn , cellNum , stats , & nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 ) {
free ( stats ) ;
return VIR_PY_NONE ;
}
}
if ( ! ( ret = PyDict_New ( ) ) ) {
free ( stats ) ;
return VIR_PY_NONE ;
}
for ( i = 0 ; i < nparams ; i + + ) {
PyDict_SetItem ( ret ,
libvirt_constcharPtrWrap ( stats [ i ] . field ) ,
libvirt_ulonglongWrap ( stats [ i ] . value ) ) ;
}
free ( stats ) ;
return ret ;
}
2008-02-20 15:26:22 +00:00
static PyObject *
libvirt_virConnectListStoragePools ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
PyObject * py_retval ;
char * * names = NULL ;
int c_retval , i ;
virConnectPtr conn ;
PyObject * pyobj_conn ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virConnectListStoragePools " , & pyobj_conn ) )
return ( NULL ) ;
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2008-02-20 15:26:22 +00:00
c_retval = virConnectNumOfStoragePools ( conn ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-02-20 15:26:22 +00:00
if ( c_retval < 0 )
return VIR_PY_NONE ;
if ( c_retval ) {
names = malloc ( sizeof ( * names ) * c_retval ) ;
if ( ! names )
return VIR_PY_NONE ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2008-02-20 15:26:22 +00:00
c_retval = virConnectListStoragePools ( conn , names , c_retval ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-02-20 15:26:22 +00:00
if ( c_retval < 0 ) {
free ( names ) ;
return VIR_PY_NONE ;
}
}
py_retval = PyList_New ( c_retval ) ;
if ( py_retval = = NULL ) {
if ( names ) {
for ( i = 0 ; i < c_retval ; i + + )
free ( names [ i ] ) ;
free ( names ) ;
}
return VIR_PY_NONE ;
}
if ( names ) {
for ( i = 0 ; i < c_retval ; i + + ) {
PyList_SetItem ( py_retval , i , libvirt_constcharPtrWrap ( names [ i ] ) ) ;
free ( names [ i ] ) ;
}
free ( names ) ;
}
return ( py_retval ) ;
}
static PyObject *
libvirt_virConnectListDefinedStoragePools ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
PyObject * py_retval ;
char * * names = NULL ;
int c_retval , i ;
virConnectPtr conn ;
PyObject * pyobj_conn ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virConnectListDefinedStoragePools " , & pyobj_conn ) )
return ( NULL ) ;
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2008-02-20 15:26:22 +00:00
c_retval = virConnectNumOfDefinedStoragePools ( conn ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-02-20 15:26:22 +00:00
if ( c_retval < 0 )
return VIR_PY_NONE ;
if ( c_retval ) {
names = malloc ( sizeof ( * names ) * c_retval ) ;
if ( ! names )
return VIR_PY_NONE ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2008-02-20 15:26:22 +00:00
c_retval = virConnectListDefinedStoragePools ( conn , names , c_retval ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-02-20 15:26:22 +00:00
if ( c_retval < 0 ) {
free ( names ) ;
return VIR_PY_NONE ;
}
}
py_retval = PyList_New ( c_retval ) ;
if ( py_retval = = NULL ) {
if ( names ) {
for ( i = 0 ; i < c_retval ; i + + )
free ( names [ i ] ) ;
free ( names ) ;
}
return VIR_PY_NONE ;
}
if ( names ) {
for ( i = 0 ; i < c_retval ; i + + ) {
PyList_SetItem ( py_retval , i , libvirt_constcharPtrWrap ( names [ i ] ) ) ;
free ( names [ i ] ) ;
}
free ( names ) ;
}
return ( py_retval ) ;
}
static PyObject *
libvirt_virStoragePoolListVolumes ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
PyObject * py_retval ;
char * * names = NULL ;
int c_retval , i ;
virStoragePoolPtr pool ;
PyObject * pyobj_pool ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virStoragePoolListVolumes " , & pyobj_pool ) )
return ( NULL ) ;
pool = ( virStoragePoolPtr ) PyvirStoragePool_Get ( pyobj_pool ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2008-02-20 15:26:22 +00:00
c_retval = virStoragePoolNumOfVolumes ( pool ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-02-20 15:26:22 +00:00
if ( c_retval < 0 )
return VIR_PY_NONE ;
if ( c_retval ) {
names = malloc ( sizeof ( * names ) * c_retval ) ;
if ( ! names )
return VIR_PY_NONE ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2008-02-20 15:26:22 +00:00
c_retval = virStoragePoolListVolumes ( pool , names , c_retval ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-02-20 15:26:22 +00:00
if ( c_retval < 0 ) {
free ( names ) ;
return VIR_PY_NONE ;
}
}
py_retval = PyList_New ( c_retval ) ;
if ( py_retval = = NULL ) {
if ( names ) {
for ( i = 0 ; i < c_retval ; i + + )
free ( names [ i ] ) ;
free ( names ) ;
}
return VIR_PY_NONE ;
}
if ( names ) {
for ( i = 0 ; i < c_retval ; i + + ) {
PyList_SetItem ( py_retval , i , libvirt_constcharPtrWrap ( names [ i ] ) ) ;
free ( names [ i ] ) ;
}
free ( names ) ;
}
return ( py_retval ) ;
}
static PyObject *
libvirt_virStoragePoolGetAutostart ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
PyObject * py_retval ;
int c_retval , autostart ;
virStoragePoolPtr pool ;
PyObject * pyobj_pool ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virStoragePoolGetAutostart " , & pyobj_pool ) )
return ( NULL ) ;
pool = ( virStoragePoolPtr ) PyvirStoragePool_Get ( pyobj_pool ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virStoragePoolGetAutostart ( pool , & autostart ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
return VIR_PY_NONE ;
py_retval = libvirt_intWrap ( autostart ) ;
return ( py_retval ) ;
}
static PyObject *
libvirt_virStoragePoolGetInfo ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
PyObject * py_retval ;
int c_retval ;
virStoragePoolPtr pool ;
PyObject * pyobj_pool ;
virStoragePoolInfo info ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virStoragePoolGetInfo " , & pyobj_pool ) )
return ( NULL ) ;
pool = ( virStoragePoolPtr ) PyvirStoragePool_Get ( pyobj_pool ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virStoragePoolGetInfo ( pool , & info ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
return VIR_PY_NONE ;
if ( ( py_retval = PyList_New ( 4 ) ) = = NULL )
return VIR_PY_NONE ;
PyList_SetItem ( py_retval , 0 , libvirt_intWrap ( ( int ) info . state ) ) ;
PyList_SetItem ( py_retval , 1 ,
libvirt_longlongWrap ( ( unsigned long long ) info . capacity ) ) ;
PyList_SetItem ( py_retval , 2 ,
libvirt_longlongWrap ( ( unsigned long long ) info . allocation ) ) ;
PyList_SetItem ( py_retval , 3 ,
libvirt_longlongWrap ( ( unsigned long long ) info . available ) ) ;
return ( py_retval ) ;
}
static PyObject *
libvirt_virStorageVolGetInfo ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
PyObject * py_retval ;
int c_retval ;
virStorageVolPtr pool ;
PyObject * pyobj_pool ;
virStorageVolInfo info ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virStorageVolGetInfo " , & pyobj_pool ) )
return ( NULL ) ;
pool = ( virStorageVolPtr ) PyvirStorageVol_Get ( pyobj_pool ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virStorageVolGetInfo ( pool , & info ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
return VIR_PY_NONE ;
if ( ( py_retval = PyList_New ( 3 ) ) = = NULL )
return VIR_PY_NONE ;
PyList_SetItem ( py_retval , 0 , libvirt_intWrap ( ( int ) info . type ) ) ;
PyList_SetItem ( py_retval , 1 ,
libvirt_longlongWrap ( ( unsigned long long ) info . capacity ) ) ;
PyList_SetItem ( py_retval , 2 ,
libvirt_longlongWrap ( ( unsigned long long ) info . allocation ) ) ;
return ( py_retval ) ;
}
static PyObject *
libvirt_virStoragePoolGetUUID ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
PyObject * py_retval ;
unsigned char uuid [ VIR_UUID_BUFLEN ] ;
virStoragePoolPtr pool ;
PyObject * pyobj_pool ;
int c_retval ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virStoragePoolGetUUID " , & pyobj_pool ) )
return ( NULL ) ;
pool = ( virStoragePoolPtr ) PyvirStoragePool_Get ( pyobj_pool ) ;
if ( pool = = NULL )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virStoragePoolGetUUID ( pool , & uuid [ 0 ] ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
return VIR_PY_NONE ;
py_retval = PyString_FromStringAndSize ( ( char * ) & uuid [ 0 ] , VIR_UUID_BUFLEN ) ;
return ( py_retval ) ;
}
2008-06-10 15:20:25 +00:00
static PyObject *
libvirt_virStoragePoolGetUUIDString ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
PyObject * py_retval ;
char uuidstr [ VIR_UUID_STRING_BUFLEN ] ;
virStoragePoolPtr pool ;
PyObject * pyobj_pool ;
int c_retval ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virStoragePoolGetUUIDString " , & pyobj_pool ) )
return ( NULL ) ;
pool = ( virStoragePoolPtr ) PyvirStoragePool_Get ( pyobj_pool ) ;
if ( pool = = NULL )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virStoragePoolGetUUIDString ( pool , & uuidstr [ 0 ] ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
return VIR_PY_NONE ;
py_retval = PyString_FromString ( ( char * ) & uuidstr [ 0 ] ) ;
return ( py_retval ) ;
}
2008-02-20 15:26:22 +00:00
static PyObject *
libvirt_virStoragePoolLookupByUUID ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
PyObject * py_retval ;
virStoragePoolPtr c_retval ;
virConnectPtr conn ;
PyObject * pyobj_conn ;
unsigned char * uuid ;
int len ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Oz#:virStoragePoolLookupByUUID " , & pyobj_conn , & uuid , & len ) )
return ( NULL ) ;
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
if ( ( uuid = = NULL ) | | ( len ! = VIR_UUID_BUFLEN ) )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virStoragePoolLookupByUUID ( conn , uuid ) ;
LIBVIRT_END_ALLOW_THREADS ;
py_retval = libvirt_virStoragePoolPtrWrap ( ( virStoragePoolPtr ) c_retval ) ;
return ( py_retval ) ;
}
2008-11-21 12:41:15 +00:00
static PyObject *
libvirt_virNodeListDevices ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
PyObject * py_retval ;
char * * names = NULL ;
int c_retval , i ;
virConnectPtr conn ;
PyObject * pyobj_conn ;
char * cap ;
unsigned int flags ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Ozi:virNodeListDevices " ,
& pyobj_conn , & cap , & flags ) )
return ( NULL ) ;
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2008-11-21 12:41:15 +00:00
c_retval = virNodeNumOfDevices ( conn , cap , flags ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-11-21 12:41:15 +00:00
if ( c_retval < 0 )
return VIR_PY_NONE ;
if ( c_retval ) {
names = malloc ( sizeof ( * names ) * c_retval ) ;
if ( ! names )
return VIR_PY_NONE ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2008-11-21 12:41:15 +00:00
c_retval = virNodeListDevices ( conn , cap , names , c_retval , flags ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-11-21 12:41:15 +00:00
if ( c_retval < 0 ) {
free ( names ) ;
return VIR_PY_NONE ;
}
}
py_retval = PyList_New ( c_retval ) ;
if ( names ) {
for ( i = 0 ; i < c_retval ; i + + ) {
PyList_SetItem ( py_retval , i , libvirt_constcharPtrWrap ( names [ i ] ) ) ;
free ( names [ i ] ) ;
}
free ( names ) ;
}
return ( py_retval ) ;
}
static PyObject *
libvirt_virNodeDeviceListCaps ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
PyObject * py_retval ;
char * * names = NULL ;
int c_retval , i ;
virNodeDevicePtr dev ;
PyObject * pyobj_dev ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virNodeDeviceListCaps " , & pyobj_dev ) )
return ( NULL ) ;
dev = ( virNodeDevicePtr ) PyvirNodeDevice_Get ( pyobj_dev ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2008-11-21 12:41:15 +00:00
c_retval = virNodeDeviceNumOfCaps ( dev ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-11-21 12:41:15 +00:00
if ( c_retval < 0 )
return VIR_PY_NONE ;
if ( c_retval ) {
names = malloc ( sizeof ( * names ) * c_retval ) ;
if ( ! names )
return VIR_PY_NONE ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2008-11-21 12:41:15 +00:00
c_retval = virNodeDeviceListCaps ( dev , names , c_retval ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-11-21 12:41:15 +00:00
if ( c_retval < 0 ) {
free ( names ) ;
return VIR_PY_NONE ;
}
}
py_retval = PyList_New ( c_retval ) ;
if ( names ) {
for ( i = 0 ; i < c_retval ; i + + ) {
PyList_SetItem ( py_retval , i , libvirt_constcharPtrWrap ( names [ i ] ) ) ;
free ( names [ i ] ) ;
}
free ( names ) ;
}
return ( py_retval ) ;
}
Fix UUID handling in secrets/storage encryption APIs
Convert all the secret/storage encryption APIs / wire format to
handle UUIDs in raw format instead of non-canonical printable
format. Guarentees data format correctness.
* docs/schemas/storageencryption.rng: Make UUID mandatory for a secret
and validate fully
* docs/schemas/secret.rng: Fully validate UUID
* include/libvirt/libvirt.h, include/libvirt/libvirt.h.in, Add
virSecretLookupByUUID and virSecretGetUUID. Make
virSecretGetUUIDString follow normal API design pattern
* python/generator.py: Skip generation of virSecretGetUUID,
virSecretGetUUIDString and virSecretLookupByUUID
* python/libvir.c, python/libvirt-python-api.xml: Manual impl
of virSecretGetUUID,virSecretGetUUIDString and virSecretLookupByUUID
* qemud/remote.c: s/virSecretLookupByUUIDString/virSecretLookupByUUID/
Fix get_nonnull_secret/make_nonnull_secret to use unsigned char
* qemud/remote_protocol.x: Fix remote_nonnull_secret to use a
remote_uuid instead of remote_nonnull_string for UUID field.
Rename REMOTE_PROC_SECRET_LOOKUP_BY_UUID_STRING to
REMOTE_PROC_SECRET_LOOKUP_BY_UUID_STRING and make it take an
remote_uuid value
* qemud/remote_dispatch_args.h, qemud/remote_dispatch_prototypes.h,
qemud/remote_dispatch_ret.h, qemud/remote_dispatch_table.h,
qemud/remote_protocol.c, qemud/remote_protocol.h: Re-generate
* src/datatypes.h, src/datatypes.c: Store UUID in raw format instead
of printable. Change virGetSecret to use raw format UUID
* src/driver.h: Rename virDrvSecretLookupByUUIDString to
virDrvSecretLookupByUUID and use raw format UUID
* src/libvirt.c: Add virSecretLookupByUUID and virSecretGetUUID
and re-implement virSecretLookupByUUIDString and
virSecretGetUUIDString in terms of those
* src/libvirt_public.syms: Add virSecretLookupByUUID and
virSecretGetUUID
* src/remote_internal.c: Rename remoteSecretLookupByUUIDString
to remoteSecretLookupByUUID. Fix typo in args for
remoteSecretDefineXML impl. Use raw UUID format for
get_nonnull_secret and make_nonnull_secret
* src/storage_encryption_conf.c, src/storage_encryption_conf.h:
Storage UUID in raw format, and require it to be present in
XML. Use UUID parser to validate.
* secret_conf.h, secret_conf.c: Generate a UUID if none is provided.
Storage UUID in raw format.
* src/secret_driver.c: Adjust to deal with raw UUIDs. Save secrets
in a filed with printable UUID, instead of base64 UUID.
* src/virsh.c: Adjust for changed public API contract of
virSecretGetUUIDString.
* src/storage_Backend.c: DOn't undefine secret we just generated
upon successful volume creation. Fix to handle raw UUIDs. Generate
a non-clashing UUID
* src/qemu_driver.c: Change to use lookupByUUID instead of
lookupByUUIDString
2009-09-10 17:44:12 +01:00
static PyObject *
libvirt_virSecretGetUUID ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
PyObject * py_retval ;
unsigned char uuid [ VIR_UUID_BUFLEN ] ;
virSecretPtr secret ;
PyObject * pyobj_secret ;
int c_retval ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virSecretGetUUID " , & pyobj_secret ) )
return ( NULL ) ;
secret = ( virSecretPtr ) PyvirSecret_Get ( pyobj_secret ) ;
if ( secret = = NULL )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virSecretGetUUID ( secret , & uuid [ 0 ] ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
return VIR_PY_NONE ;
py_retval = PyString_FromStringAndSize ( ( char * ) & uuid [ 0 ] , VIR_UUID_BUFLEN ) ;
return ( py_retval ) ;
}
static PyObject *
libvirt_virSecretGetUUIDString ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
PyObject * py_retval ;
char uuidstr [ VIR_UUID_STRING_BUFLEN ] ;
virSecretPtr dom ;
PyObject * pyobj_dom ;
int c_retval ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virSecretGetUUIDString " ,
& pyobj_dom ) )
return ( NULL ) ;
dom = ( virSecretPtr ) PyvirSecret_Get ( pyobj_dom ) ;
if ( dom = = NULL )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virSecretGetUUIDString ( dom , & uuidstr [ 0 ] ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
return VIR_PY_NONE ;
py_retval = PyString_FromString ( ( char * ) & uuidstr [ 0 ] ) ;
return ( py_retval ) ;
}
static PyObject *
libvirt_virSecretLookupByUUID ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
PyObject * py_retval ;
virSecretPtr c_retval ;
virConnectPtr conn ;
PyObject * pyobj_conn ;
unsigned char * uuid ;
int len ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Oz#:virSecretLookupByUUID " , & pyobj_conn , & uuid , & len ) )
return ( NULL ) ;
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
if ( ( uuid = = NULL ) | | ( len ! = VIR_UUID_BUFLEN ) )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virSecretLookupByUUID ( conn , uuid ) ;
LIBVIRT_END_ALLOW_THREADS ;
py_retval = libvirt_virSecretPtrWrap ( ( virSecretPtr ) c_retval ) ;
return ( py_retval ) ;
}
Secret manipulation API docs refresh & wire up python generator
Sample session:
>>> import libvirt
>>> c = libvirt.open('qemu:///session')
>>> c.listSecrets()
['12247729-47d2-a783-88ce-b329d4781cd3', 'reee', 'abc']
>>> s = c.secretDefineXML("<secret ephemeral='no' private='no'>\n<description>Something for use</description>\n<volume>/foo/bar</volume>\n</secret>\n")
>>> s.UUIDString()
'340c2dfb-811b-eda8-da9e-25ccd7bfd650'
>>> s.XMLDesc()
"<secret ephemeral='no' private='no'>\n <uuid>340c2dfb-811b-eda8-da9e-25ccd7bfd650</uuid>\n <description>Something for use</description>\n <volume>/foo/bar</volume>\n</secret>\n"
>>> s.setValue('abc\0xx\xffx')
0
>>> s.value()
'abc\x00xx\xffx'
>>> s.undefine()
0
* python/generator.py: Add rules for virSecret APIs
* python/libvir.c, python/libvirt-python-api.xml: Manual impl of
virSecretSetValue, virSecretGetValue$ and virConnectListSecrets APIs
* python/libvirt_wrap.h, python/types.c: Wrapper for virSecret objects
* docs/libvirt-api.xml, docs/libvirt-refs.xml,
docs/html/libvirt-virterror.html, docs/html/libvirt-libvirt.html,
docs/devhelp/libvirt-virterror.html, docs/devhelp/libvirt-libvirt.html:
Re-generate with 'make api'
2009-08-04 20:38:21 +02:00
static PyObject *
libvirt_virConnectListSecrets ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
PyObject * py_retval ;
char * * uuids = NULL ;
virConnectPtr conn ;
int c_retval , i ;
PyObject * pyobj_conn ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virConnectListSecrets " , & pyobj_conn ) )
return NULL ;
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virConnectNumOfSecrets ( conn ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
return VIR_PY_NONE ;
if ( c_retval ) {
uuids = malloc ( sizeof ( * uuids ) * c_retval ) ;
if ( ! uuids )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virConnectListSecrets ( conn , uuids , c_retval ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 ) {
free ( uuids ) ;
return VIR_PY_NONE ;
}
}
py_retval = PyList_New ( c_retval ) ;
if ( uuids ) {
for ( i = 0 ; i < c_retval ; i + + ) {
PyList_SetItem ( py_retval , i , libvirt_constcharPtrWrap ( uuids [ i ] ) ) ;
free ( uuids [ i ] ) ;
}
free ( uuids ) ;
}
return py_retval ;
}
static PyObject *
libvirt_virSecretGetValue ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
PyObject * py_retval ;
unsigned char * c_retval ;
size_t size ;
virSecretPtr secret ;
PyObject * pyobj_secret ;
unsigned int flags ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Oi:virSecretGetValue " , & pyobj_secret ,
& flags ) )
return NULL ;
secret = ( virSecretPtr ) PyvirSecret_Get ( pyobj_secret ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virSecretGetValue ( secret , & size , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval = = NULL )
return VIR_PY_NONE ;
py_retval = PyString_FromStringAndSize ( ( const char * ) c_retval , size ) ;
memset ( c_retval , 0 , size ) ;
free ( c_retval ) ;
return py_retval ;
}
static PyObject *
libvirt_virSecretSetValue ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
PyObject * py_retval ;
int c_retval ;
virSecretPtr secret ;
PyObject * pyobj_secret ;
const char * value ;
int size ;
unsigned int flags ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Oz#i:virSecretSetValue " , & pyobj_secret ,
& value , & size , & flags ) )
return NULL ;
secret = ( virSecretPtr ) PyvirSecret_Get ( pyobj_secret ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virSecretSetValue ( secret , ( const unsigned char * ) value , size ,
flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
py_retval = libvirt_intWrap ( c_retval ) ;
return py_retval ;
}
2008-11-21 12:41:15 +00:00
2010-04-29 06:46:01 -04:00
static PyObject *
libvirt_virNWFilterGetUUID ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
PyObject * py_retval ;
unsigned char uuid [ VIR_UUID_BUFLEN ] ;
virNWFilterPtr nwfilter ;
PyObject * pyobj_nwfilter ;
int c_retval ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virNWFilterGetUUID " , & pyobj_nwfilter ) )
return ( NULL ) ;
nwfilter = ( virNWFilterPtr ) PyvirNWFilter_Get ( pyobj_nwfilter ) ;
if ( nwfilter = = NULL )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virNWFilterGetUUID ( nwfilter , & uuid [ 0 ] ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
return VIR_PY_NONE ;
py_retval = PyString_FromStringAndSize ( ( char * ) & uuid [ 0 ] , VIR_UUID_BUFLEN ) ;
return ( py_retval ) ;
}
static PyObject *
libvirt_virNWFilterGetUUIDString ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
PyObject * py_retval ;
char uuidstr [ VIR_UUID_STRING_BUFLEN ] ;
virNWFilterPtr nwfilter ;
PyObject * pyobj_nwfilter ;
int c_retval ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virNWFilterGetUUIDString " ,
& pyobj_nwfilter ) )
return ( NULL ) ;
nwfilter = ( virNWFilterPtr ) PyvirNWFilter_Get ( pyobj_nwfilter ) ;
if ( nwfilter = = NULL )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virNWFilterGetUUIDString ( nwfilter , & uuidstr [ 0 ] ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
return VIR_PY_NONE ;
py_retval = PyString_FromString ( ( char * ) & uuidstr [ 0 ] ) ;
return ( py_retval ) ;
}
static PyObject *
libvirt_virNWFilterLookupByUUID ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
PyObject * py_retval ;
virNWFilterPtr c_retval ;
virConnectPtr conn ;
PyObject * pyobj_conn ;
unsigned char * uuid ;
int len ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Oz#:virNWFilterLookupByUUID " , & pyobj_conn , & uuid , & len ) )
return ( NULL ) ;
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
if ( ( uuid = = NULL ) | | ( len ! = VIR_UUID_BUFLEN ) )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virNWFilterLookupByUUID ( conn , uuid ) ;
LIBVIRT_END_ALLOW_THREADS ;
py_retval = libvirt_virNWFilterPtrWrap ( ( virNWFilterPtr ) c_retval ) ;
return ( py_retval ) ;
}
static PyObject *
libvirt_virConnectListNWFilters ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
PyObject * py_retval ;
char * * uuids = NULL ;
virConnectPtr conn ;
int c_retval , i ;
PyObject * pyobj_conn ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virConnectListNWFilters " , & pyobj_conn ) )
return NULL ;
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virConnectNumOfNWFilters ( conn ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
return VIR_PY_NONE ;
if ( c_retval ) {
uuids = malloc ( sizeof ( * uuids ) * c_retval ) ;
if ( ! uuids )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virConnectListNWFilters ( conn , uuids , c_retval ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 ) {
free ( uuids ) ;
return VIR_PY_NONE ;
}
}
py_retval = PyList_New ( c_retval ) ;
if ( uuids ) {
for ( i = 0 ; i < c_retval ; i + + ) {
PyList_SetItem ( py_retval , i , libvirt_constcharPtrWrap ( uuids [ i ] ) ) ;
free ( uuids [ i ] ) ;
}
free ( uuids ) ;
}
return py_retval ;
}
2009-11-20 16:22:42 +01:00
static PyObject *
libvirt_virConnectListInterfaces ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
PyObject * py_retval ;
char * * names = NULL ;
int c_retval , i ;
virConnectPtr conn ;
PyObject * pyobj_conn ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virConnectListInterfaces " , & pyobj_conn ) )
return ( NULL ) ;
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2009-11-20 16:22:42 +01:00
c_retval = virConnectNumOfInterfaces ( conn ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2009-11-20 16:22:42 +01:00
if ( c_retval < 0 )
return VIR_PY_NONE ;
if ( c_retval ) {
names = malloc ( sizeof ( * names ) * c_retval ) ;
if ( ! names )
return VIR_PY_NONE ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2009-11-20 16:22:42 +01:00
c_retval = virConnectListInterfaces ( conn , names , c_retval ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2009-11-20 16:22:42 +01:00
if ( c_retval < 0 ) {
free ( names ) ;
return VIR_PY_NONE ;
}
}
py_retval = PyList_New ( c_retval ) ;
if ( py_retval = = NULL ) {
if ( names ) {
for ( i = 0 ; i < c_retval ; i + + )
free ( names [ i ] ) ;
free ( names ) ;
}
return VIR_PY_NONE ;
}
if ( names ) {
for ( i = 0 ; i < c_retval ; i + + ) {
PyList_SetItem ( py_retval , i , libvirt_constcharPtrWrap ( names [ i ] ) ) ;
free ( names [ i ] ) ;
}
free ( names ) ;
}
return ( py_retval ) ;
}
static PyObject *
libvirt_virConnectListDefinedInterfaces ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
PyObject * py_retval ;
char * * names = NULL ;
int c_retval , i ;
virConnectPtr conn ;
PyObject * pyobj_conn ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virConnectListDefinedInterfaces " ,
& pyobj_conn ) )
return ( NULL ) ;
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2009-11-20 16:22:42 +01:00
c_retval = virConnectNumOfDefinedInterfaces ( conn ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2009-11-20 16:22:42 +01:00
if ( c_retval < 0 )
return VIR_PY_NONE ;
if ( c_retval ) {
names = malloc ( sizeof ( * names ) * c_retval ) ;
if ( ! names )
return VIR_PY_NONE ;
2009-11-25 12:04:47 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2009-11-20 16:22:42 +01:00
c_retval = virConnectListDefinedInterfaces ( conn , names , c_retval ) ;
2009-11-25 12:04:47 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2009-11-20 16:22:42 +01:00
if ( c_retval < 0 ) {
free ( names ) ;
return VIR_PY_NONE ;
}
}
py_retval = PyList_New ( c_retval ) ;
if ( py_retval = = NULL ) {
if ( names ) {
for ( i = 0 ; i < c_retval ; i + + )
free ( names [ i ] ) ;
free ( names ) ;
}
return VIR_PY_NONE ;
}
if ( names ) {
for ( i = 0 ; i < c_retval ; i + + ) {
PyList_SetItem ( py_retval , i , libvirt_constcharPtrWrap ( names [ i ] ) ) ;
free ( names [ i ] ) ;
}
free ( names ) ;
}
return ( py_retval ) ;
}
2010-01-22 14:52:41 +01:00
static PyObject *
libvirt_virConnectBaselineCPU ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
PyObject * pyobj_conn ;
PyObject * list ;
virConnectPtr conn ;
unsigned int flags ;
const char * * xmlcpus = NULL ;
int ncpus = 0 ;
char * base_cpu ;
PyObject * pybase_cpu ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " OOi:virConnectBaselineCPU " ,
& pyobj_conn , & list , & flags ) )
return ( NULL ) ;
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
if ( PyList_Check ( list ) ) {
int i ;
ncpus = PyList_Size ( list ) ;
if ( ( xmlcpus = malloc ( ncpus * sizeof ( * xmlcpus ) ) ) = = NULL )
return VIR_PY_INT_FAIL ;
for ( i = 0 ; i < ncpus ; i + + ) {
xmlcpus [ i ] = PyString_AsString ( PyList_GetItem ( list , i ) ) ;
2010-02-16 08:07:38 +01:00
if ( xmlcpus [ i ] = = NULL ) {
free ( xmlcpus ) ;
2010-01-22 14:52:41 +01:00
return VIR_PY_INT_FAIL ;
2010-02-16 08:07:38 +01:00
}
2010-01-22 14:52:41 +01:00
}
}
LIBVIRT_BEGIN_ALLOW_THREADS ;
base_cpu = virConnectBaselineCPU ( conn , xmlcpus , ncpus , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
free ( xmlcpus ) ;
if ( base_cpu = = NULL )
return VIR_PY_INT_FAIL ;
pybase_cpu = PyString_FromString ( base_cpu ) ;
free ( base_cpu ) ;
if ( pybase_cpu = = NULL )
return VIR_PY_INT_FAIL ;
return pybase_cpu ;
}
2010-02-03 11:31:45 +00:00
static PyObject *
libvirt_virDomainGetJobInfo ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
PyObject * py_retval ;
int c_retval ;
virDomainPtr domain ;
PyObject * pyobj_domain ;
virDomainJobInfo info ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virDomainGetJobInfo " , & pyobj_domain ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virDomainGetJobInfo ( domain , & info ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
return VIR_PY_NONE ;
py_retval = PyList_New ( 12 ) ;
PyList_SetItem ( py_retval , 0 , libvirt_intWrap ( ( int ) info . type ) ) ;
PyList_SetItem ( py_retval , 1 , libvirt_ulonglongWrap ( info . timeElapsed ) ) ;
PyList_SetItem ( py_retval , 2 , libvirt_ulonglongWrap ( info . timeRemaining ) ) ;
PyList_SetItem ( py_retval , 3 , libvirt_ulonglongWrap ( info . dataTotal ) ) ;
PyList_SetItem ( py_retval , 4 , libvirt_ulonglongWrap ( info . dataProcessed ) ) ;
PyList_SetItem ( py_retval , 5 , libvirt_ulonglongWrap ( info . dataRemaining ) ) ;
PyList_SetItem ( py_retval , 6 , libvirt_ulonglongWrap ( info . memTotal ) ) ;
PyList_SetItem ( py_retval , 7 , libvirt_ulonglongWrap ( info . memProcessed ) ) ;
PyList_SetItem ( py_retval , 8 , libvirt_ulonglongWrap ( info . memRemaining ) ) ;
PyList_SetItem ( py_retval , 9 , libvirt_ulonglongWrap ( info . fileTotal ) ) ;
PyList_SetItem ( py_retval , 10 , libvirt_ulonglongWrap ( info . fileProcessed ) ) ;
PyList_SetItem ( py_retval , 11 , libvirt_ulonglongWrap ( info . fileRemaining ) ) ;
return ( py_retval ) ;
}
2011-07-22 13:43:53 +08:00
static PyObject *
libvirt_virDomainGetBlockJobInfo ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args )
{
virDomainPtr domain ;
PyObject * pyobj_domain ;
const char * path ;
unsigned int flags ;
virDomainBlockJobInfo info ;
int c_ret ;
PyObject * ret ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Ozi:virDomainGetBlockJobInfo " ,
& pyobj_domain , & path , & flags ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_ret = virDomainGetBlockJobInfo ( domain , path , & info , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_ret ! = 1 )
return VIR_PY_NONE ;
if ( ( ret = PyDict_New ( ) ) = = NULL )
return VIR_PY_NONE ;
PyDict_SetItem ( ret , libvirt_constcharPtrWrap ( " type " ) ,
libvirt_intWrap ( info . type ) ) ;
PyDict_SetItem ( ret , libvirt_constcharPtrWrap ( " bandwidth " ) ,
libvirt_ulongWrap ( info . bandwidth ) ) ;
PyDict_SetItem ( ret , libvirt_constcharPtrWrap ( " cur " ) ,
libvirt_ulonglongWrap ( info . cur ) ) ;
PyDict_SetItem ( ret , libvirt_constcharPtrWrap ( " end " ) ,
libvirt_ulonglongWrap ( info . end ) ) ;
return ret ;
}
2010-02-03 11:31:45 +00:00
2011-11-15 17:02:49 +08:00
static PyObject *
libvirt_virDomainSetBlockIoTune ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args )
{
virDomainPtr domain ;
PyObject * pyobj_domain , * pyinfo ;
const char * disk ;
unsigned int flags ;
virTypedParameterPtr params ;
int nparams = 0 , i ;
int c_ret ;
2011-12-29 13:22:52 +08:00
if ( ! PyArg_ParseTuple ( args , ( char * ) " OzOi:virDomainSetBlockIoTune " ,
2011-11-15 17:02:49 +08:00
& pyobj_domain , & disk , & pyinfo , & flags ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_ret = virDomainGetBlockIoTune ( domain , disk , NULL , & nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_ret < 0 )
return VIR_PY_INT_FAIL ;
if ( ( params = malloc ( sizeof ( * params ) * nparams ) ) = = NULL )
return VIR_PY_INT_FAIL ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_ret = virDomainGetBlockIoTune ( domain , disk , params , & nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_ret < 0 ) {
free ( params ) ;
return VIR_PY_INT_FAIL ;
}
/* convert to a Python tuple of long objects */
for ( i = 0 ; i < nparams ; i + + ) {
PyObject * key , * val ;
key = libvirt_constcharPtrWrap ( params [ i ] . field ) ;
val = PyDict_GetItem ( pyinfo , key ) ;
Py_DECREF ( key ) ;
if ( val = = NULL )
continue ;
switch ( params [ i ] . type ) {
case VIR_TYPED_PARAM_INT :
params [ i ] . value . i = ( int ) PyInt_AS_LONG ( val ) ;
break ;
case VIR_TYPED_PARAM_UINT :
params [ i ] . value . ui = ( unsigned int ) PyInt_AS_LONG ( val ) ;
break ;
case VIR_TYPED_PARAM_LLONG :
params [ i ] . value . l = ( long long ) PyLong_AsLongLong ( val ) ;
break ;
case VIR_TYPED_PARAM_ULLONG :
params [ i ] . value . ul = ( unsigned long long ) PyLong_AsLongLong ( val ) ;
break ;
case VIR_TYPED_PARAM_DOUBLE :
params [ i ] . value . d = ( double ) PyFloat_AsDouble ( val ) ;
break ;
case VIR_TYPED_PARAM_BOOLEAN :
{
PyObject * hacktrue = PyBool_FromLong ( 1 ) ;
params [ i ] . value . b = hacktrue = = val ? 1 : 0 ;
Py_DECREF ( hacktrue ) ;
}
break ;
default :
free ( params ) ;
return VIR_PY_INT_FAIL ;
}
}
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_ret = virDomainSetBlockIoTune ( domain , disk , params , nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_ret < 0 ) {
free ( params ) ;
return VIR_PY_INT_FAIL ;
}
free ( params ) ;
return VIR_PY_INT_SUCCESS ;
}
static PyObject *
libvirt_virDomainGetBlockIoTune ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args )
{
virDomainPtr domain ;
PyObject * pyobj_domain , * pyreply ;
const char * disk ;
int nparams = 0 , i ;
unsigned int flags ;
virTypedParameterPtr params ;
int c_ret ;
2011-12-29 13:22:52 +08:00
if ( ! PyArg_ParseTuple ( args , ( char * ) " Ozi:virDomainGetBlockIoTune " ,
2011-11-15 17:02:49 +08:00
& pyobj_domain , & disk , & flags ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_ret = virDomainGetBlockIoTune ( domain , disk , NULL , & nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_ret < 0 )
return VIR_PY_NONE ;
if ( ( params = malloc ( sizeof ( * params ) * nparams ) ) = = NULL )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_ret = virDomainGetBlockIoTune ( domain , disk , params , & nparams , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_ret < 0 ) {
free ( params ) ;
return VIR_PY_NONE ;
}
/* convert to a Python tuple of long objects */
if ( ( pyreply = PyDict_New ( ) ) = = NULL ) {
free ( params ) ;
return VIR_PY_NONE ;
}
for ( i = 0 ; i < nparams ; i + + ) {
PyObject * key , * val ;
switch ( params [ i ] . type ) {
case VIR_TYPED_PARAM_INT :
val = PyInt_FromLong ( ( long ) params [ i ] . value . i ) ;
break ;
case VIR_TYPED_PARAM_UINT :
val = PyInt_FromLong ( ( long ) params [ i ] . value . ui ) ;
break ;
case VIR_TYPED_PARAM_LLONG :
val = PyLong_FromLongLong ( ( long long ) params [ i ] . value . l ) ;
break ;
case VIR_TYPED_PARAM_ULLONG :
val = PyLong_FromLongLong ( ( unsigned long long ) params [ i ] . value . ul ) ;
break ;
case VIR_TYPED_PARAM_DOUBLE :
val = PyFloat_FromDouble ( ( double ) params [ i ] . value . d ) ;
break ;
case VIR_TYPED_PARAM_BOOLEAN :
val = PyBool_FromLong ( ( long ) params [ i ] . value . b ) ;
break ;
default :
free ( params ) ;
Py_DECREF ( pyreply ) ;
return VIR_PY_NONE ;
}
key = libvirt_constcharPtrWrap ( params [ i ] . field ) ;
PyDict_SetItem ( pyreply , key , val ) ;
}
free ( params ) ;
return ( pyreply ) ;
}
2008-10-31 10:13:45 +00:00
/*******************************************
* Helper functions to avoid importing modules
* for every callback
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static PyObject * libvirt_module = NULL ;
static PyObject * libvirt_dict = NULL ;
static PyObject * libvirt_dom_class = NULL ;
2008-02-20 15:26:22 +00:00
2008-10-31 10:13:45 +00:00
static PyObject *
getLibvirtModuleObject ( void ) {
if ( libvirt_module )
return libvirt_module ;
// PyImport_ImportModule returns a new reference
2008-11-25 10:44:52 +00:00
/* Bogus (char *) cast for RHEL-5 python API brokenness */
libvirt_module = PyImport_ImportModule ( ( char * ) " libvirt " ) ;
2008-10-31 10:13:45 +00:00
if ( ! libvirt_module ) {
2011-06-14 12:59:44 -04:00
DEBUG ( " %s Error importing libvirt module \n " , __FUNCTION__ ) ;
2008-10-31 10:13:45 +00:00
PyErr_Print ( ) ;
return NULL ;
}
return libvirt_module ;
}
static PyObject *
getLibvirtDictObject ( void ) {
if ( libvirt_dict )
return libvirt_dict ;
// PyModule_GetDict returns a borrowed reference
libvirt_dict = PyModule_GetDict ( getLibvirtModuleObject ( ) ) ;
if ( ! libvirt_dict ) {
2011-06-14 12:59:44 -04:00
DEBUG ( " %s Error importing libvirt dictionary \n " , __FUNCTION__ ) ;
2008-10-31 10:13:45 +00:00
PyErr_Print ( ) ;
return NULL ;
}
Py_INCREF ( libvirt_dict ) ;
return libvirt_dict ;
}
static PyObject *
getLibvirtDomainClassObject ( void ) {
if ( libvirt_dom_class )
return libvirt_dom_class ;
// PyDict_GetItemString returns a borrowed reference
libvirt_dom_class = PyDict_GetItemString ( getLibvirtDictObject ( ) ,
" virDomain " ) ;
if ( ! libvirt_dom_class ) {
2011-06-14 12:59:44 -04:00
DEBUG ( " %s Error importing virDomain class \n " , __FUNCTION__ ) ;
2008-10-31 10:13:45 +00:00
PyErr_Print ( ) ;
return NULL ;
}
Py_INCREF ( libvirt_dom_class ) ;
return libvirt_dom_class ;
}
2011-06-15 19:35:44 -04:00
static PyObject *
libvirt_lookupPythonFunc ( const char * funcname )
{
PyObject * python_cb ;
/* Lookup the python callback */
python_cb = PyDict_GetItemString ( getLibvirtDictObject ( ) , funcname ) ;
if ( ! python_cb ) {
DEBUG ( " %s: Error finding %s \n " , __FUNCTION__ , funcname ) ;
PyErr_Print ( ) ;
PyErr_Clear ( ) ;
return NULL ;
}
if ( ! PyCallable_Check ( python_cb ) ) {
DEBUG ( " %s: %s is not callable \n " , __FUNCTION__ , funcname ) ;
return NULL ;
}
return python_cb ;
}
2008-10-31 10:13:45 +00:00
/*******************************************
* Domain Events
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static int
libvirt_virConnectDomainEventCallback ( virConnectPtr conn ATTRIBUTE_UNUSED ,
virDomainPtr dom ,
int event ,
2008-11-17 16:43:00 +00:00
int detail ,
2008-10-31 10:13:45 +00:00
void * opaque )
{
PyObject * pyobj_ret ;
PyObject * pyobj_conn_inst = ( PyObject * ) opaque ;
2008-11-17 10:26:09 +00:00
PyObject * pyobj_dom ;
2008-10-31 10:13:45 +00:00
PyObject * pyobj_dom_args ;
PyObject * pyobj_dom_inst ;
PyObject * dom_class ;
2008-11-17 10:26:09 +00:00
int ret = - 1 ;
LIBVIRT_ENSURE_THREAD_STATE ;
2008-10-31 10:13:45 +00:00
/* Create a python instance of this virDomainPtr */
2009-05-28 11:02:11 +00:00
virDomainRef ( dom ) ;
2008-11-17 10:26:09 +00:00
pyobj_dom = libvirt_virDomainPtrWrap ( dom ) ;
2008-10-31 10:13:45 +00:00
pyobj_dom_args = PyTuple_New ( 2 ) ;
if ( PyTuple_SetItem ( pyobj_dom_args , 0 , pyobj_conn_inst ) ! = 0 ) {
2011-06-14 12:59:44 -04:00
DEBUG ( " %s error creating tuple " , __FUNCTION__ ) ;
2008-11-17 10:26:09 +00:00
goto cleanup ;
2008-10-31 10:13:45 +00:00
}
if ( PyTuple_SetItem ( pyobj_dom_args , 1 , pyobj_dom ) ! = 0 ) {
2011-06-14 12:59:44 -04:00
DEBUG ( " %s error creating tuple " , __FUNCTION__ ) ;
2008-11-17 10:26:09 +00:00
goto cleanup ;
2008-10-31 10:13:45 +00:00
}
Py_INCREF ( pyobj_conn_inst ) ;
dom_class = getLibvirtDomainClassObject ( ) ;
if ( ! PyClass_Check ( dom_class ) ) {
2011-06-14 12:59:44 -04:00
DEBUG ( " %s dom_class is not a class! \n " , __FUNCTION__ ) ;
2008-11-17 10:26:09 +00:00
goto cleanup ;
2008-10-31 10:13:45 +00:00
}
pyobj_dom_inst = PyInstance_New ( dom_class ,
pyobj_dom_args ,
NULL ) ;
Py_DECREF ( pyobj_dom_args ) ;
if ( ! pyobj_dom_inst ) {
2011-06-14 12:59:44 -04:00
DEBUG ( " %s Error creating a python instance of virDomain \n " ,
__FUNCTION__ ) ;
2008-10-31 10:13:45 +00:00
PyErr_Print ( ) ;
2008-11-17 10:26:09 +00:00
goto cleanup ;
2008-10-31 10:13:45 +00:00
}
/* Call the Callback Dispatcher */
pyobj_ret = PyObject_CallMethod ( pyobj_conn_inst ,
2011-06-15 20:14:45 -04:00
( char * ) " _dispatchDomainEventCallbacks " ,
2008-11-17 16:43:00 +00:00
( char * ) " Oii " ,
2008-10-31 10:13:45 +00:00
pyobj_dom_inst ,
2008-11-17 16:43:00 +00:00
event ,
detail ) ;
2008-10-31 10:13:45 +00:00
Py_DECREF ( pyobj_dom_inst ) ;
if ( ! pyobj_ret ) {
2011-06-14 12:59:44 -04:00
DEBUG ( " %s - ret:%p \n " , __FUNCTION__ , pyobj_ret ) ;
2008-10-31 10:13:45 +00:00
PyErr_Print ( ) ;
} else {
Py_DECREF ( pyobj_ret ) ;
2008-11-17 10:26:09 +00:00
ret = 0 ;
2008-10-31 10:13:45 +00:00
}
2008-11-17 10:26:09 +00:00
cleanup :
LIBVIRT_RELEASE_THREAD_STATE ;
2009-09-03 14:09:49 +02:00
return ret ;
2008-10-31 10:13:45 +00:00
}
static PyObject *
libvirt_virConnectDomainEventRegister ( ATTRIBUTE_UNUSED PyObject * self ,
PyObject * args )
{
PyObject * py_retval ; /* return value */
PyObject * pyobj_conn ; /* virConnectPtr */
PyObject * pyobj_conn_inst ; /* virConnect Python object */
virConnectPtr conn ;
int ret = 0 ;
if ( ! PyArg_ParseTuple
( args , ( char * ) " OO:virConnectDomainEventRegister " ,
& pyobj_conn , & pyobj_conn_inst ) ) {
2011-06-14 12:59:44 -04:00
DEBUG ( " %s failed parsing tuple \n " , __FUNCTION__ ) ;
2008-10-31 10:13:45 +00:00
return VIR_PY_INT_FAIL ;
2008-11-17 10:26:09 +00:00
}
2008-10-31 10:13:45 +00:00
2011-06-14 12:59:44 -04:00
DEBUG ( " libvirt_virConnectDomainEventRegister(%p %p) called \n " ,
pyobj_conn , pyobj_conn_inst ) ;
2008-10-31 10:13:45 +00:00
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
Py_INCREF ( pyobj_conn_inst ) ;
2008-11-17 10:26:09 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2008-10-31 10:13:45 +00:00
ret = virConnectDomainEventRegister ( conn ,
libvirt_virConnectDomainEventCallback ,
2008-11-19 15:25:24 +00:00
( void * ) pyobj_conn_inst , NULL ) ;
2008-10-31 10:13:45 +00:00
2008-11-17 10:26:09 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-10-31 10:13:45 +00:00
py_retval = libvirt_intWrap ( ret ) ;
return ( py_retval ) ;
}
static PyObject *
libvirt_virConnectDomainEventDeregister ( ATTRIBUTE_UNUSED PyObject * self ,
PyObject * args )
{
PyObject * py_retval ;
PyObject * pyobj_conn ;
PyObject * pyobj_conn_inst ;
virConnectPtr conn ;
int ret = 0 ;
if ( ! PyArg_ParseTuple
( args , ( char * ) " OO:virConnectDomainEventDeregister " ,
& pyobj_conn , & pyobj_conn_inst ) )
return ( NULL ) ;
2011-06-14 12:59:44 -04:00
DEBUG ( " libvirt_virConnectDomainEventDeregister(%p) called \n " , pyobj_conn ) ;
2008-10-31 10:13:45 +00:00
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
2008-11-17 10:26:09 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2008-10-31 10:13:45 +00:00
ret = virConnectDomainEventDeregister ( conn , libvirt_virConnectDomainEventCallback ) ;
2008-11-17 10:26:09 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-10-31 10:13:45 +00:00
Py_DECREF ( pyobj_conn_inst ) ;
py_retval = libvirt_intWrap ( ret ) ;
return ( py_retval ) ;
}
/*******************************************
* Event Impl
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static PyObject * addHandleObj = NULL ;
2008-11-24 19:28:12 +00:00
static char * addHandleName = NULL ;
2008-10-31 10:13:45 +00:00
static PyObject * updateHandleObj = NULL ;
2008-11-24 19:28:12 +00:00
static char * updateHandleName = NULL ;
2008-10-31 10:13:45 +00:00
static PyObject * removeHandleObj = NULL ;
2008-11-24 19:28:12 +00:00
static char * removeHandleName = NULL ;
2008-10-31 10:13:45 +00:00
static PyObject * addTimeoutObj = NULL ;
2008-11-24 19:28:12 +00:00
static char * addTimeoutName = NULL ;
2008-10-31 10:13:45 +00:00
static PyObject * updateTimeoutObj = NULL ;
2008-11-24 19:28:12 +00:00
static char * updateTimeoutName = NULL ;
2008-10-31 10:13:45 +00:00
static PyObject * removeTimeoutObj = NULL ;
2008-11-24 19:28:12 +00:00
static char * removeTimeoutName = NULL ;
2008-10-31 10:13:45 +00:00
2008-11-24 19:28:12 +00:00
# define NAME(fn) ( fn ## Name ? fn ## Name : # fn )
2008-10-31 10:13:45 +00:00
static int
2008-11-19 16:24:01 +00:00
libvirt_virEventAddHandleFunc ( int fd ,
int event ,
virEventHandleCallback cb ,
void * opaque ,
virFreeCallback ff )
2008-10-31 10:13:45 +00:00
{
2008-11-24 19:28:12 +00:00
PyObject * result ;
2008-10-31 10:13:45 +00:00
PyObject * python_cb ;
PyObject * cb_obj ;
2008-11-19 16:24:01 +00:00
PyObject * ff_obj ;
2008-10-31 10:13:45 +00:00
PyObject * opaque_obj ;
PyObject * cb_args ;
PyObject * pyobj_args ;
2008-11-24 19:28:12 +00:00
int retval = - 1 ;
2008-10-31 10:13:45 +00:00
2008-11-17 10:26:09 +00:00
LIBVIRT_ENSURE_THREAD_STATE ;
2008-10-31 10:13:45 +00:00
/* Lookup the python callback */
2011-06-15 20:14:45 -04:00
python_cb = libvirt_lookupPythonFunc ( " _eventInvokeHandleCallback " ) ;
2011-06-15 19:35:44 -04:00
if ( ! python_cb ) {
2008-11-17 10:26:09 +00:00
goto cleanup ;
2008-10-31 10:13:45 +00:00
}
Py_INCREF ( python_cb ) ;
/* create tuple for cb */
cb_obj = libvirt_virEventHandleCallbackWrap ( cb ) ;
2008-11-19 16:24:01 +00:00
ff_obj = libvirt_virFreeCallbackWrap ( ff ) ;
2008-10-31 10:13:45 +00:00
opaque_obj = libvirt_virVoidPtrWrap ( opaque ) ;
2008-11-19 16:24:01 +00:00
cb_args = PyTuple_New ( 3 ) ;
2008-10-31 10:13:45 +00:00
PyTuple_SetItem ( cb_args , 0 , cb_obj ) ;
PyTuple_SetItem ( cb_args , 1 , opaque_obj ) ;
2008-11-19 16:24:01 +00:00
PyTuple_SetItem ( cb_args , 2 , ff_obj ) ;
2008-10-31 10:13:45 +00:00
pyobj_args = PyTuple_New ( 4 ) ;
PyTuple_SetItem ( pyobj_args , 0 , libvirt_intWrap ( fd ) ) ;
PyTuple_SetItem ( pyobj_args , 1 , libvirt_intWrap ( event ) ) ;
PyTuple_SetItem ( pyobj_args , 2 , python_cb ) ;
PyTuple_SetItem ( pyobj_args , 3 , cb_args ) ;
2008-11-24 19:28:12 +00:00
result = PyEval_CallObject ( addHandleObj , pyobj_args ) ;
if ( ! result ) {
PyErr_Print ( ) ;
PyErr_Clear ( ) ;
} else if ( ! PyInt_Check ( result ) ) {
2011-06-14 12:59:44 -04:00
DEBUG ( " %s: %s should return an int \n " , __FUNCTION__ , NAME ( addHandle ) ) ;
2008-11-24 19:28:12 +00:00
} else {
retval = ( int ) PyInt_AsLong ( result ) ;
}
2008-10-31 10:13:45 +00:00
Py_XDECREF ( result ) ;
Py_DECREF ( pyobj_args ) ;
2008-11-17 10:26:09 +00:00
cleanup :
LIBVIRT_RELEASE_THREAD_STATE ;
2008-11-24 19:28:12 +00:00
return retval ;
2008-10-31 10:13:45 +00:00
}
static void
2008-11-24 19:28:12 +00:00
libvirt_virEventUpdateHandleFunc ( int watch , int event )
2008-10-31 10:13:45 +00:00
{
2008-11-24 19:28:12 +00:00
PyObject * result ;
2008-11-17 10:26:09 +00:00
PyObject * pyobj_args ;
LIBVIRT_ENSURE_THREAD_STATE ;
pyobj_args = PyTuple_New ( 2 ) ;
2008-11-24 19:28:12 +00:00
PyTuple_SetItem ( pyobj_args , 0 , libvirt_intWrap ( watch ) ) ;
2008-10-31 10:13:45 +00:00
PyTuple_SetItem ( pyobj_args , 1 , libvirt_intWrap ( event ) ) ;
2008-11-24 19:28:12 +00:00
result = PyEval_CallObject ( updateHandleObj , pyobj_args ) ;
if ( ! result ) {
PyErr_Print ( ) ;
PyErr_Clear ( ) ;
}
2008-10-31 10:13:45 +00:00
Py_XDECREF ( result ) ;
Py_DECREF ( pyobj_args ) ;
2008-11-17 10:26:09 +00:00
LIBVIRT_RELEASE_THREAD_STATE ;
2008-10-31 10:13:45 +00:00
}
2008-11-17 10:26:09 +00:00
2008-10-31 10:13:45 +00:00
static int
2008-11-24 19:28:12 +00:00
libvirt_virEventRemoveHandleFunc ( int watch )
2008-10-31 10:13:45 +00:00
{
2008-11-24 19:28:12 +00:00
PyObject * result ;
2008-11-17 10:26:09 +00:00
PyObject * pyobj_args ;
2008-11-24 19:28:12 +00:00
PyObject * opaque ;
PyObject * ff ;
int retval = - 1 ;
virFreeCallback cff ;
2008-11-17 10:26:09 +00:00
LIBVIRT_ENSURE_THREAD_STATE ;
pyobj_args = PyTuple_New ( 1 ) ;
2008-11-24 19:28:12 +00:00
PyTuple_SetItem ( pyobj_args , 0 , libvirt_intWrap ( watch ) ) ;
2008-10-31 10:13:45 +00:00
2008-11-24 19:28:12 +00:00
result = PyEval_CallObject ( removeHandleObj , pyobj_args ) ;
if ( ! result ) {
PyErr_Print ( ) ;
PyErr_Clear ( ) ;
} else if ( ! PyTuple_Check ( result ) | | PyTuple_Size ( result ) ! = 3 ) {
2011-06-14 12:59:44 -04:00
DEBUG ( " %s: %s must return opaque obj registered with %s "
" to avoid leaking libvirt memory \n " ,
__FUNCTION__ , NAME ( removeHandle ) , NAME ( addHandle ) ) ;
2008-11-24 19:28:12 +00:00
} else {
opaque = PyTuple_GetItem ( result , 1 ) ;
ff = PyTuple_GetItem ( result , 2 ) ;
cff = PyvirFreeCallback_Get ( ff ) ;
if ( cff )
( * cff ) ( PyvirVoidPtr_Get ( opaque ) ) ;
retval = 0 ;
}
2008-10-31 10:13:45 +00:00
Py_XDECREF ( result ) ;
Py_DECREF ( pyobj_args ) ;
2008-11-17 10:26:09 +00:00
LIBVIRT_RELEASE_THREAD_STATE ;
2008-11-24 19:28:12 +00:00
return retval ;
2008-10-31 10:13:45 +00:00
}
2011-06-15 19:35:44 -04:00
2008-10-31 10:13:45 +00:00
static int
2008-11-19 16:24:01 +00:00
libvirt_virEventAddTimeoutFunc ( int timeout ,
virEventTimeoutCallback cb ,
void * opaque ,
virFreeCallback ff )
2008-10-31 10:13:45 +00:00
{
2008-11-24 19:28:12 +00:00
PyObject * result ;
2008-10-31 10:13:45 +00:00
PyObject * python_cb ;
PyObject * cb_obj ;
2008-11-19 16:24:01 +00:00
PyObject * ff_obj ;
2008-10-31 10:13:45 +00:00
PyObject * opaque_obj ;
PyObject * cb_args ;
PyObject * pyobj_args ;
2008-11-24 19:28:12 +00:00
int retval = - 1 ;
2008-10-31 10:13:45 +00:00
2008-11-17 10:26:09 +00:00
LIBVIRT_ENSURE_THREAD_STATE ;
2008-10-31 10:13:45 +00:00
/* Lookup the python callback */
2011-06-15 20:14:45 -04:00
python_cb = libvirt_lookupPythonFunc ( " _eventInvokeTimeoutCallback " ) ;
2011-06-15 19:35:44 -04:00
if ( ! python_cb ) {
2008-11-17 10:26:09 +00:00
goto cleanup ;
2008-10-31 10:13:45 +00:00
}
Py_INCREF ( python_cb ) ;
/* create tuple for cb */
cb_obj = libvirt_virEventTimeoutCallbackWrap ( cb ) ;
2008-11-19 16:24:01 +00:00
ff_obj = libvirt_virFreeCallbackWrap ( ff ) ;
2008-10-31 10:13:45 +00:00
opaque_obj = libvirt_virVoidPtrWrap ( opaque ) ;
2008-11-19 16:24:01 +00:00
cb_args = PyTuple_New ( 3 ) ;
2008-10-31 10:13:45 +00:00
PyTuple_SetItem ( cb_args , 0 , cb_obj ) ;
PyTuple_SetItem ( cb_args , 1 , opaque_obj ) ;
2008-11-19 16:24:01 +00:00
PyTuple_SetItem ( cb_args , 2 , ff_obj ) ;
2008-10-31 10:13:45 +00:00
pyobj_args = PyTuple_New ( 3 ) ;
PyTuple_SetItem ( pyobj_args , 0 , libvirt_intWrap ( timeout ) ) ;
PyTuple_SetItem ( pyobj_args , 1 , python_cb ) ;
PyTuple_SetItem ( pyobj_args , 2 , cb_args ) ;
2008-11-24 19:28:12 +00:00
result = PyEval_CallObject ( addTimeoutObj , pyobj_args ) ;
if ( ! result ) {
PyErr_Print ( ) ;
PyErr_Clear ( ) ;
} else if ( ! PyInt_Check ( result ) ) {
2011-06-14 12:59:44 -04:00
DEBUG ( " %s: %s should return an int \n " , __FUNCTION__ , NAME ( addTimeout ) ) ;
2008-11-24 19:28:12 +00:00
} else {
retval = ( int ) PyInt_AsLong ( result ) ;
}
2008-10-31 10:13:45 +00:00
Py_XDECREF ( result ) ;
Py_DECREF ( pyobj_args ) ;
2008-11-17 10:26:09 +00:00
cleanup :
LIBVIRT_RELEASE_THREAD_STATE ;
2008-11-24 19:28:12 +00:00
return retval ;
2008-10-31 10:13:45 +00:00
}
static void
libvirt_virEventUpdateTimeoutFunc ( int timer , int timeout )
{
PyObject * result = NULL ;
2008-11-17 10:26:09 +00:00
PyObject * pyobj_args ;
LIBVIRT_ENSURE_THREAD_STATE ;
pyobj_args = PyTuple_New ( 2 ) ;
2008-10-31 10:13:45 +00:00
PyTuple_SetItem ( pyobj_args , 0 , libvirt_intWrap ( timer ) ) ;
PyTuple_SetItem ( pyobj_args , 1 , libvirt_intWrap ( timeout ) ) ;
2008-11-24 19:28:12 +00:00
result = PyEval_CallObject ( updateTimeoutObj , pyobj_args ) ;
if ( ! result ) {
PyErr_Print ( ) ;
PyErr_Clear ( ) ;
}
2008-10-31 10:13:45 +00:00
Py_XDECREF ( result ) ;
Py_DECREF ( pyobj_args ) ;
2008-11-17 10:26:09 +00:00
LIBVIRT_RELEASE_THREAD_STATE ;
2008-10-31 10:13:45 +00:00
}
static int
libvirt_virEventRemoveTimeoutFunc ( int timer )
{
PyObject * result = NULL ;
2008-11-17 10:26:09 +00:00
PyObject * pyobj_args ;
2008-11-24 19:28:12 +00:00
PyObject * opaque ;
PyObject * ff ;
int retval = - 1 ;
virFreeCallback cff ;
2008-11-17 10:26:09 +00:00
LIBVIRT_ENSURE_THREAD_STATE ;
pyobj_args = PyTuple_New ( 1 ) ;
2008-10-31 10:13:45 +00:00
PyTuple_SetItem ( pyobj_args , 0 , libvirt_intWrap ( timer ) ) ;
2008-11-24 19:28:12 +00:00
result = PyEval_CallObject ( removeTimeoutObj , pyobj_args ) ;
if ( ! result ) {
PyErr_Print ( ) ;
PyErr_Clear ( ) ;
} else if ( ! PyTuple_Check ( result ) | | PyTuple_Size ( result ) ! = 3 ) {
2011-06-14 12:59:44 -04:00
DEBUG ( " %s: %s must return opaque obj registered with %s "
" to avoid leaking libvirt memory \n " ,
__FUNCTION__ , NAME ( removeTimeout ) , NAME ( addTimeout ) ) ;
2008-11-24 19:28:12 +00:00
} else {
opaque = PyTuple_GetItem ( result , 1 ) ;
ff = PyTuple_GetItem ( result , 2 ) ;
cff = PyvirFreeCallback_Get ( ff ) ;
if ( cff )
( * cff ) ( PyvirVoidPtr_Get ( opaque ) ) ;
retval = 0 ;
}
2008-10-31 10:13:45 +00:00
Py_XDECREF ( result ) ;
Py_DECREF ( pyobj_args ) ;
2008-11-17 10:26:09 +00:00
LIBVIRT_RELEASE_THREAD_STATE ;
2008-11-24 19:28:12 +00:00
return retval ;
2008-10-31 10:13:45 +00:00
}
static PyObject *
libvirt_virEventRegisterImpl ( ATTRIBUTE_UNUSED PyObject * self ,
PyObject * args )
{
2008-11-24 19:28:12 +00:00
/* Unref the previously-registered impl (if any) */
2008-10-31 10:13:45 +00:00
Py_XDECREF ( addHandleObj ) ;
Py_XDECREF ( updateHandleObj ) ;
Py_XDECREF ( removeHandleObj ) ;
Py_XDECREF ( addTimeoutObj ) ;
Py_XDECREF ( updateTimeoutObj ) ;
Py_XDECREF ( removeTimeoutObj ) ;
2008-11-24 19:28:12 +00:00
/* Parse and check arguments */
if ( ! PyArg_ParseTuple ( args , ( char * ) " OOOOOO:virEventRegisterImpl " ,
& addHandleObj , & updateHandleObj ,
& removeHandleObj , & addTimeoutObj ,
& updateTimeoutObj , & removeTimeoutObj ) | |
! PyCallable_Check ( addHandleObj ) | |
! PyCallable_Check ( updateHandleObj ) | |
! PyCallable_Check ( removeHandleObj ) | |
! PyCallable_Check ( addTimeoutObj ) | |
! PyCallable_Check ( updateTimeoutObj ) | |
! PyCallable_Check ( removeTimeoutObj ) )
2008-10-31 10:13:45 +00:00
return VIR_PY_INT_FAIL ;
2008-11-24 19:28:12 +00:00
/* Get argument string representations (for error reporting) */
2011-05-23 10:51:46 +02:00
addHandleName = py_str ( addHandleObj ) ;
2008-11-24 19:28:12 +00:00
updateHandleName = py_str ( updateHandleObj ) ;
removeHandleName = py_str ( removeHandleObj ) ;
addTimeoutName = py_str ( addTimeoutObj ) ;
updateTimeoutName = py_str ( updateTimeoutObj ) ;
removeTimeoutName = py_str ( removeTimeoutObj ) ;
/* Inc refs since we're holding onto these objects until
* the next call ( if any ) to this function .
*/
2008-10-31 10:13:45 +00:00
Py_INCREF ( addHandleObj ) ;
Py_INCREF ( updateHandleObj ) ;
Py_INCREF ( removeHandleObj ) ;
Py_INCREF ( addTimeoutObj ) ;
Py_INCREF ( updateTimeoutObj ) ;
Py_INCREF ( removeTimeoutObj ) ;
2008-11-17 10:26:09 +00:00
LIBVIRT_BEGIN_ALLOW_THREADS ;
2008-11-24 19:28:12 +00:00
/* Now register our C EventImpl, which will dispatch
* to the Python callbacks passed in as args .
*/
2008-10-31 10:13:45 +00:00
virEventRegisterImpl ( libvirt_virEventAddHandleFunc ,
libvirt_virEventUpdateHandleFunc ,
libvirt_virEventRemoveHandleFunc ,
libvirt_virEventAddTimeoutFunc ,
libvirt_virEventUpdateTimeoutFunc ,
libvirt_virEventRemoveTimeoutFunc ) ;
2008-11-17 10:26:09 +00:00
LIBVIRT_END_ALLOW_THREADS ;
2008-10-31 10:13:45 +00:00
return VIR_PY_INT_SUCCESS ;
}
static PyObject *
libvirt_virEventInvokeHandleCallback ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args )
{
2008-11-19 16:19:36 +00:00
int watch , fd , event ;
2008-10-31 10:13:45 +00:00
PyObject * py_f ;
PyObject * py_opaque ;
virEventHandleCallback cb ;
void * opaque ;
if ( ! PyArg_ParseTuple
2008-11-19 16:19:36 +00:00
( args , ( char * ) " iiiOO:virEventInvokeHandleCallback " ,
& watch , & fd , & event , & py_f , & py_opaque
2008-10-31 10:13:45 +00:00
) )
return VIR_PY_INT_FAIL ;
cb = ( virEventHandleCallback ) PyvirEventHandleCallback_Get ( py_f ) ;
opaque = ( void * ) PyvirVoidPtr_Get ( py_opaque ) ;
2009-11-03 18:42:16 +01:00
if ( cb ) {
LIBVIRT_BEGIN_ALLOW_THREADS ;
2008-11-19 16:19:36 +00:00
cb ( watch , fd , event , opaque ) ;
2009-11-03 18:42:16 +01:00
LIBVIRT_END_ALLOW_THREADS ;
}
2008-10-31 10:13:45 +00:00
return VIR_PY_INT_SUCCESS ;
}
static PyObject *
libvirt_virEventInvokeTimeoutCallback ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args )
{
int timer ;
PyObject * py_f ;
PyObject * py_opaque ;
virEventTimeoutCallback cb ;
void * opaque ;
if ( ! PyArg_ParseTuple
( args , ( char * ) " iOO:virEventInvokeTimeoutCallback " ,
& timer , & py_f , & py_opaque
) )
return VIR_PY_INT_FAIL ;
cb = ( virEventTimeoutCallback ) PyvirEventTimeoutCallback_Get ( py_f ) ;
opaque = ( void * ) PyvirVoidPtr_Get ( py_opaque ) ;
2009-11-03 18:42:16 +01:00
if ( cb ) {
LIBVIRT_BEGIN_ALLOW_THREADS ;
2008-10-31 10:13:45 +00:00
cb ( timer , opaque ) ;
2009-11-03 18:42:16 +01:00
LIBVIRT_END_ALLOW_THREADS ;
}
2008-10-31 10:13:45 +00:00
return VIR_PY_INT_SUCCESS ;
}
2008-02-20 15:26:22 +00:00
2011-06-15 19:35:44 -04:00
static void
libvirt_virEventHandleCallback ( int watch ,
int fd ,
int events ,
void * opaque )
{
PyObject * pyobj_cbData = ( PyObject * ) opaque ;
PyObject * pyobj_ret ;
PyObject * python_cb ;
LIBVIRT_ENSURE_THREAD_STATE ;
/* Lookup the python callback */
python_cb = libvirt_lookupPythonFunc ( " _dispatchEventHandleCallback " ) ;
if ( ! python_cb ) {
goto cleanup ;
}
Py_INCREF ( pyobj_cbData ) ;
/* Call the pure python dispatcher */
pyobj_ret = PyObject_CallFunction ( python_cb ,
( char * ) " iiiO " ,
watch , fd , events , pyobj_cbData ) ;
Py_DECREF ( pyobj_cbData ) ;
if ( ! pyobj_ret ) {
DEBUG ( " %s - ret:%p \n " , __FUNCTION__ , pyobj_ret ) ;
PyErr_Print ( ) ;
} else {
Py_DECREF ( pyobj_ret ) ;
}
cleanup :
LIBVIRT_RELEASE_THREAD_STATE ;
}
static PyObject *
libvirt_virEventAddHandle ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args )
{
PyObject * py_retval ;
PyObject * pyobj_cbData ;
virEventHandleCallback cb = libvirt_virEventHandleCallback ;
int events ;
int fd ;
int ret ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " iiO:virEventAddHandle " ,
& fd , & events , & pyobj_cbData ) ) {
DEBUG ( " %s failed to parse tuple \n " , __FUNCTION__ ) ;
return VIR_PY_INT_FAIL ;
}
Py_INCREF ( pyobj_cbData ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
ret = virEventAddHandle ( fd , events , cb , pyobj_cbData , NULL ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( ret < 0 ) {
Py_DECREF ( pyobj_cbData ) ;
}
py_retval = libvirt_intWrap ( ret ) ;
return py_retval ;
}
static void
libvirt_virEventTimeoutCallback ( int timer ,
void * opaque )
{
PyObject * pyobj_cbData = ( PyObject * ) opaque ;
PyObject * pyobj_ret ;
PyObject * python_cb ;
LIBVIRT_ENSURE_THREAD_STATE ;
/* Lookup the python callback */
python_cb = libvirt_lookupPythonFunc ( " _dispatchEventTimeoutCallback " ) ;
if ( ! python_cb ) {
goto cleanup ;
}
Py_INCREF ( pyobj_cbData ) ;
/* Call the pure python dispatcher */
pyobj_ret = PyObject_CallFunction ( python_cb ,
( char * ) " iO " ,
timer , pyobj_cbData ) ;
Py_DECREF ( pyobj_cbData ) ;
if ( ! pyobj_ret ) {
DEBUG ( " %s - ret:%p \n " , __FUNCTION__ , pyobj_ret ) ;
PyErr_Print ( ) ;
} else {
Py_DECREF ( pyobj_ret ) ;
}
cleanup :
LIBVIRT_RELEASE_THREAD_STATE ;
}
static PyObject *
libvirt_virEventAddTimeout ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args )
{
PyObject * py_retval ;
PyObject * pyobj_cbData ;
virEventTimeoutCallback cb = libvirt_virEventTimeoutCallback ;
int timeout ;
int ret ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " iO:virEventAddTimeout " ,
& timeout , & pyobj_cbData ) ) {
DEBUG ( " %s failed to parse tuple \n " , __FUNCTION__ ) ;
return VIR_PY_INT_FAIL ;
}
Py_INCREF ( pyobj_cbData ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
ret = virEventAddTimeout ( timeout , cb , pyobj_cbData , NULL ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( ret < 0 ) {
Py_DECREF ( pyobj_cbData ) ;
}
py_retval = libvirt_intWrap ( ret ) ;
return py_retval ;
}
2010-03-26 13:22:06 +00:00
static void
libvirt_virConnectDomainEventFreeFunc ( void * opaque )
{
PyObject * pyobj_conn = ( PyObject * ) opaque ;
LIBVIRT_ENSURE_THREAD_STATE ;
Py_DECREF ( pyobj_conn ) ;
LIBVIRT_RELEASE_THREAD_STATE ;
}
static int
libvirt_virConnectDomainEventLifecycleCallback ( virConnectPtr conn ATTRIBUTE_UNUSED ,
virDomainPtr dom ,
int event ,
int detail ,
void * opaque )
{
PyObject * pyobj_cbData = ( PyObject * ) opaque ;
PyObject * pyobj_dom ;
PyObject * pyobj_ret ;
PyObject * pyobj_conn ;
PyObject * dictKey ;
int ret = - 1 ;
LIBVIRT_ENSURE_THREAD_STATE ;
/* Create a python instance of this virDomainPtr */
virDomainRef ( dom ) ;
pyobj_dom = libvirt_virDomainPtrWrap ( dom ) ;
Py_INCREF ( pyobj_cbData ) ;
dictKey = libvirt_constcharPtrWrap ( " conn " ) ;
pyobj_conn = PyDict_GetItem ( pyobj_cbData , dictKey ) ;
Py_DECREF ( dictKey ) ;
/* Call the Callback Dispatcher */
pyobj_ret = PyObject_CallMethod ( pyobj_conn ,
2011-06-15 20:14:45 -04:00
( char * ) " _dispatchDomainEventLifecycleCallback " ,
2010-03-26 13:22:06 +00:00
( char * ) " OiiO " ,
pyobj_dom ,
event , detail ,
pyobj_cbData ) ;
Py_DECREF ( pyobj_cbData ) ;
Py_DECREF ( pyobj_dom ) ;
if ( ! pyobj_ret ) {
2011-06-14 12:59:44 -04:00
DEBUG ( " %s - ret:%p \n " , __FUNCTION__ , pyobj_ret ) ;
2010-03-26 13:22:06 +00:00
PyErr_Print ( ) ;
} else {
Py_DECREF ( pyobj_ret ) ;
ret = 0 ;
}
LIBVIRT_RELEASE_THREAD_STATE ;
return ret ;
}
static int
libvirt_virConnectDomainEventGenericCallback ( virConnectPtr conn ATTRIBUTE_UNUSED ,
virDomainPtr dom ,
void * opaque )
{
PyObject * pyobj_cbData = ( PyObject * ) opaque ;
PyObject * pyobj_dom ;
PyObject * pyobj_ret ;
PyObject * pyobj_conn ;
PyObject * dictKey ;
int ret = - 1 ;
LIBVIRT_ENSURE_THREAD_STATE ;
/* Create a python instance of this virDomainPtr */
virDomainRef ( dom ) ;
pyobj_dom = libvirt_virDomainPtrWrap ( dom ) ;
Py_INCREF ( pyobj_cbData ) ;
dictKey = libvirt_constcharPtrWrap ( " conn " ) ;
pyobj_conn = PyDict_GetItem ( pyobj_cbData , dictKey ) ;
Py_DECREF ( dictKey ) ;
/* Call the Callback Dispatcher */
pyobj_ret = PyObject_CallMethod ( pyobj_conn ,
2011-06-15 20:14:45 -04:00
( char * ) " _dispatchDomainEventGenericCallback " ,
2010-03-26 13:22:06 +00:00
( char * ) " OO " ,
pyobj_dom , pyobj_cbData ) ;
Py_DECREF ( pyobj_cbData ) ;
Py_DECREF ( pyobj_dom ) ;
if ( ! pyobj_ret ) {
2011-06-14 12:59:44 -04:00
DEBUG ( " %s - ret:%p \n " , __FUNCTION__ , pyobj_ret ) ;
2010-03-26 13:22:06 +00:00
PyErr_Print ( ) ;
} else {
Py_DECREF ( pyobj_ret ) ;
ret = 0 ;
}
LIBVIRT_RELEASE_THREAD_STATE ;
return ret ;
}
static int
libvirt_virConnectDomainEventRTCChangeCallback ( virConnectPtr conn ATTRIBUTE_UNUSED ,
virDomainPtr dom ,
long long utcoffset ,
void * opaque )
{
PyObject * pyobj_cbData = ( PyObject * ) opaque ;
PyObject * pyobj_dom ;
PyObject * pyobj_ret ;
PyObject * pyobj_conn ;
PyObject * dictKey ;
int ret = - 1 ;
LIBVIRT_ENSURE_THREAD_STATE ;
/* Create a python instance of this virDomainPtr */
virDomainRef ( dom ) ;
pyobj_dom = libvirt_virDomainPtrWrap ( dom ) ;
Py_INCREF ( pyobj_cbData ) ;
dictKey = libvirt_constcharPtrWrap ( " conn " ) ;
pyobj_conn = PyDict_GetItem ( pyobj_cbData , dictKey ) ;
Py_DECREF ( dictKey ) ;
/* Call the Callback Dispatcher */
pyobj_ret = PyObject_CallMethod ( pyobj_conn ,
2011-06-15 20:14:45 -04:00
( char * ) " _dispatchDomainEventRTCChangeCallback " ,
2010-03-26 13:22:06 +00:00
( char * ) " OLO " ,
pyobj_dom ,
( PY_LONG_LONG ) utcoffset ,
pyobj_cbData ) ;
Py_DECREF ( pyobj_cbData ) ;
Py_DECREF ( pyobj_dom ) ;
if ( ! pyobj_ret ) {
2011-06-14 12:59:44 -04:00
DEBUG ( " %s - ret:%p \n " , __FUNCTION__ , pyobj_ret ) ;
2010-03-26 13:22:06 +00:00
PyErr_Print ( ) ;
} else {
Py_DECREF ( pyobj_ret ) ;
ret = 0 ;
}
LIBVIRT_RELEASE_THREAD_STATE ;
return ret ;
}
static int
libvirt_virConnectDomainEventWatchdogCallback ( virConnectPtr conn ATTRIBUTE_UNUSED ,
virDomainPtr dom ,
int action ,
void * opaque )
{
PyObject * pyobj_cbData = ( PyObject * ) opaque ;
PyObject * pyobj_dom ;
PyObject * pyobj_ret ;
PyObject * pyobj_conn ;
PyObject * dictKey ;
int ret = - 1 ;
LIBVIRT_ENSURE_THREAD_STATE ;
/* Create a python instance of this virDomainPtr */
virDomainRef ( dom ) ;
pyobj_dom = libvirt_virDomainPtrWrap ( dom ) ;
Py_INCREF ( pyobj_cbData ) ;
dictKey = libvirt_constcharPtrWrap ( " conn " ) ;
pyobj_conn = PyDict_GetItem ( pyobj_cbData , dictKey ) ;
Py_DECREF ( dictKey ) ;
/* Call the Callback Dispatcher */
pyobj_ret = PyObject_CallMethod ( pyobj_conn ,
2011-06-15 20:14:45 -04:00
( char * ) " _dispatchDomainEventWatchdogCallback " ,
2010-03-26 13:22:06 +00:00
( char * ) " OiO " ,
pyobj_dom ,
action ,
pyobj_cbData ) ;
Py_DECREF ( pyobj_cbData ) ;
Py_DECREF ( pyobj_dom ) ;
if ( ! pyobj_ret ) {
2011-06-14 12:59:44 -04:00
DEBUG ( " %s - ret:%p \n " , __FUNCTION__ , pyobj_ret ) ;
2010-03-26 13:22:06 +00:00
PyErr_Print ( ) ;
} else {
Py_DECREF ( pyobj_ret ) ;
ret = 0 ;
}
LIBVIRT_RELEASE_THREAD_STATE ;
return ret ;
}
static int
libvirt_virConnectDomainEventIOErrorCallback ( virConnectPtr conn ATTRIBUTE_UNUSED ,
virDomainPtr dom ,
const char * srcPath ,
const char * devAlias ,
int action ,
void * opaque )
{
PyObject * pyobj_cbData = ( PyObject * ) opaque ;
PyObject * pyobj_dom ;
PyObject * pyobj_ret ;
PyObject * pyobj_conn ;
PyObject * dictKey ;
int ret = - 1 ;
LIBVIRT_ENSURE_THREAD_STATE ;
/* Create a python instance of this virDomainPtr */
virDomainRef ( dom ) ;
pyobj_dom = libvirt_virDomainPtrWrap ( dom ) ;
Py_INCREF ( pyobj_cbData ) ;
dictKey = libvirt_constcharPtrWrap ( " conn " ) ;
pyobj_conn = PyDict_GetItem ( pyobj_cbData , dictKey ) ;
Py_DECREF ( dictKey ) ;
/* Call the Callback Dispatcher */
pyobj_ret = PyObject_CallMethod ( pyobj_conn ,
2011-06-15 20:14:45 -04:00
( char * ) " _dispatchDomainEventIOErrorCallback " ,
2010-03-26 13:22:06 +00:00
( char * ) " OssiO " ,
pyobj_dom ,
srcPath , devAlias , action ,
pyobj_cbData ) ;
Py_DECREF ( pyobj_cbData ) ;
Py_DECREF ( pyobj_dom ) ;
if ( ! pyobj_ret ) {
2011-06-14 12:59:44 -04:00
DEBUG ( " %s - ret:%p \n " , __FUNCTION__ , pyobj_ret ) ;
2010-03-26 13:22:06 +00:00
PyErr_Print ( ) ;
} else {
Py_DECREF ( pyobj_ret ) ;
ret = 0 ;
}
LIBVIRT_RELEASE_THREAD_STATE ;
return ret ;
}
Add support for another explicit IO error event
This introduces a new event type
VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON
This event is the same as the previous VIR_DOMAIN_ID_IO_ERROR
event, but also includes a string describing the cause of
the event.
Thus there is a new callback definition for this event type
typedef void (*virConnectDomainEventIOErrorReasonCallback)(virConnectPtr conn,
virDomainPtr dom,
const char *srcPath,
const char *devAlias,
int action,
const char *reason,
void *opaque);
This is currently wired up to the QEMU block IO error events
* daemon/remote.c: Dispatch IO error events to client
* examples/domain-events/events-c/event-test.c: Watch for
IO error events
* include/libvirt/libvirt.h.in: Define new IO error event ID
and callback signature
* src/conf/domain_event.c, src/conf/domain_event.h,
src/libvirt_private.syms: Extend API to handle IO error events
* src/qemu/qemu_driver.c: Connect to the QEMU monitor event
for block IO errors and emit a libvirt IO error event
* src/remote/remote_driver.c: Receive and dispatch IO error
events to application
* src/remote/remote_protocol.x: Wire protocol definition for
IO error events
* src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h,
src/qemu/qemu_monitor_json.c: Watch for BLOCK_IO_ERROR event
from QEMU monitor
2010-03-18 19:37:44 +00:00
static int
libvirt_virConnectDomainEventIOErrorReasonCallback ( virConnectPtr conn ATTRIBUTE_UNUSED ,
virDomainPtr dom ,
const char * srcPath ,
const char * devAlias ,
int action ,
const char * reason ,
void * opaque )
{
PyObject * pyobj_cbData = ( PyObject * ) opaque ;
PyObject * pyobj_dom ;
PyObject * pyobj_ret ;
PyObject * pyobj_conn ;
PyObject * dictKey ;
int ret = - 1 ;
LIBVIRT_ENSURE_THREAD_STATE ;
/* Create a python instance of this virDomainPtr */
virDomainRef ( dom ) ;
pyobj_dom = libvirt_virDomainPtrWrap ( dom ) ;
Py_INCREF ( pyobj_cbData ) ;
dictKey = libvirt_constcharPtrWrap ( " conn " ) ;
pyobj_conn = PyDict_GetItem ( pyobj_cbData , dictKey ) ;
Py_DECREF ( dictKey ) ;
/* Call the Callback Dispatcher */
pyobj_ret = PyObject_CallMethod ( pyobj_conn ,
2011-06-15 20:14:45 -04:00
( char * ) " _dispatchDomainEventIOErrorReasonCallback " ,
Add support for another explicit IO error event
This introduces a new event type
VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON
This event is the same as the previous VIR_DOMAIN_ID_IO_ERROR
event, but also includes a string describing the cause of
the event.
Thus there is a new callback definition for this event type
typedef void (*virConnectDomainEventIOErrorReasonCallback)(virConnectPtr conn,
virDomainPtr dom,
const char *srcPath,
const char *devAlias,
int action,
const char *reason,
void *opaque);
This is currently wired up to the QEMU block IO error events
* daemon/remote.c: Dispatch IO error events to client
* examples/domain-events/events-c/event-test.c: Watch for
IO error events
* include/libvirt/libvirt.h.in: Define new IO error event ID
and callback signature
* src/conf/domain_event.c, src/conf/domain_event.h,
src/libvirt_private.syms: Extend API to handle IO error events
* src/qemu/qemu_driver.c: Connect to the QEMU monitor event
for block IO errors and emit a libvirt IO error event
* src/remote/remote_driver.c: Receive and dispatch IO error
events to application
* src/remote/remote_protocol.x: Wire protocol definition for
IO error events
* src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h,
src/qemu/qemu_monitor_json.c: Watch for BLOCK_IO_ERROR event
from QEMU monitor
2010-03-18 19:37:44 +00:00
( char * ) " OssisO " ,
pyobj_dom ,
srcPath , devAlias , action , reason ,
pyobj_cbData ) ;
Py_DECREF ( pyobj_cbData ) ;
Py_DECREF ( pyobj_dom ) ;
if ( ! pyobj_ret ) {
2011-06-14 12:59:44 -04:00
DEBUG ( " %s - ret:%p \n " , __FUNCTION__ , pyobj_ret ) ;
Add support for another explicit IO error event
This introduces a new event type
VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON
This event is the same as the previous VIR_DOMAIN_ID_IO_ERROR
event, but also includes a string describing the cause of
the event.
Thus there is a new callback definition for this event type
typedef void (*virConnectDomainEventIOErrorReasonCallback)(virConnectPtr conn,
virDomainPtr dom,
const char *srcPath,
const char *devAlias,
int action,
const char *reason,
void *opaque);
This is currently wired up to the QEMU block IO error events
* daemon/remote.c: Dispatch IO error events to client
* examples/domain-events/events-c/event-test.c: Watch for
IO error events
* include/libvirt/libvirt.h.in: Define new IO error event ID
and callback signature
* src/conf/domain_event.c, src/conf/domain_event.h,
src/libvirt_private.syms: Extend API to handle IO error events
* src/qemu/qemu_driver.c: Connect to the QEMU monitor event
for block IO errors and emit a libvirt IO error event
* src/remote/remote_driver.c: Receive and dispatch IO error
events to application
* src/remote/remote_protocol.x: Wire protocol definition for
IO error events
* src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h,
src/qemu/qemu_monitor_json.c: Watch for BLOCK_IO_ERROR event
from QEMU monitor
2010-03-18 19:37:44 +00:00
PyErr_Print ( ) ;
} else {
Py_DECREF ( pyobj_ret ) ;
ret = 0 ;
}
LIBVIRT_RELEASE_THREAD_STATE ;
return ret ;
}
2010-03-26 13:22:06 +00:00
static int
libvirt_virConnectDomainEventGraphicsCallback ( virConnectPtr conn ATTRIBUTE_UNUSED ,
virDomainPtr dom ,
int phase ,
virDomainEventGraphicsAddressPtr local ,
virDomainEventGraphicsAddressPtr remote ,
const char * authScheme ,
virDomainEventGraphicsSubjectPtr subject ,
void * opaque )
{
PyObject * pyobj_cbData = ( PyObject * ) opaque ;
PyObject * pyobj_dom ;
PyObject * pyobj_ret ;
PyObject * pyobj_conn ;
PyObject * dictKey ;
PyObject * pyobj_local ;
PyObject * pyobj_remote ;
PyObject * pyobj_subject ;
int ret = - 1 ;
int i ;
LIBVIRT_ENSURE_THREAD_STATE ;
/* Create a python instance of this virDomainPtr */
virDomainRef ( dom ) ;
pyobj_dom = libvirt_virDomainPtrWrap ( dom ) ;
Py_INCREF ( pyobj_cbData ) ;
dictKey = libvirt_constcharPtrWrap ( " conn " ) ;
pyobj_conn = PyDict_GetItem ( pyobj_cbData , dictKey ) ;
Py_DECREF ( dictKey ) ;
pyobj_local = PyDict_New ( ) ;
PyDict_SetItem ( pyobj_local ,
libvirt_constcharPtrWrap ( " family " ) ,
libvirt_intWrap ( local - > family ) ) ;
PyDict_SetItem ( pyobj_local ,
libvirt_constcharPtrWrap ( " node " ) ,
libvirt_constcharPtrWrap ( local - > node ) ) ;
PyDict_SetItem ( pyobj_local ,
libvirt_constcharPtrWrap ( " service " ) ,
libvirt_constcharPtrWrap ( local - > service ) ) ;
pyobj_remote = PyDict_New ( ) ;
PyDict_SetItem ( pyobj_remote ,
libvirt_constcharPtrWrap ( " family " ) ,
libvirt_intWrap ( remote - > family ) ) ;
PyDict_SetItem ( pyobj_remote ,
libvirt_constcharPtrWrap ( " node " ) ,
libvirt_constcharPtrWrap ( remote - > node ) ) ;
PyDict_SetItem ( pyobj_remote ,
libvirt_constcharPtrWrap ( " service " ) ,
libvirt_constcharPtrWrap ( remote - > service ) ) ;
pyobj_subject = PyList_New ( subject - > nidentity ) ;
for ( i = 0 ; i < subject - > nidentity ; i + + ) {
PyObject * pair = PyTuple_New ( 2 ) ;
PyTuple_SetItem ( pair , 0 , libvirt_constcharPtrWrap ( subject - > identities [ i ] . type ) ) ;
PyTuple_SetItem ( pair , 1 , libvirt_constcharPtrWrap ( subject - > identities [ i ] . name ) ) ;
PyList_SetItem ( pyobj_subject , i , pair ) ;
}
/* Call the Callback Dispatcher */
pyobj_ret = PyObject_CallMethod ( pyobj_conn ,
2011-06-15 20:14:45 -04:00
( char * ) " _dispatchDomainEventGraphicsCallback " ,
2010-03-26 13:22:06 +00:00
( char * ) " OiOOsOO " ,
pyobj_dom ,
phase , pyobj_local , pyobj_remote ,
authScheme , pyobj_subject ,
pyobj_cbData ) ;
Py_DECREF ( pyobj_cbData ) ;
Py_DECREF ( pyobj_dom ) ;
if ( ! pyobj_ret ) {
2011-06-14 12:59:44 -04:00
DEBUG ( " %s - ret:%p \n " , __FUNCTION__ , pyobj_ret ) ;
2010-03-26 13:22:06 +00:00
PyErr_Print ( ) ;
} else {
Py_DECREF ( pyobj_ret ) ;
ret = 0 ;
}
LIBVIRT_RELEASE_THREAD_STATE ;
return ret ;
}
2011-07-22 13:57:42 +08:00
static int
libvirt_virConnectDomainEventBlockJobCallback ( virConnectPtr conn ATTRIBUTE_UNUSED ,
virDomainPtr dom ,
const char * path ,
int type ,
int status ,
void * opaque )
{
PyObject * pyobj_cbData = ( PyObject * ) opaque ;
PyObject * pyobj_dom ;
PyObject * pyobj_ret ;
PyObject * pyobj_conn ;
PyObject * dictKey ;
int ret = - 1 ;
LIBVIRT_ENSURE_THREAD_STATE ;
/* Create a python instance of this virDomainPtr */
virDomainRef ( dom ) ;
pyobj_dom = libvirt_virDomainPtrWrap ( dom ) ;
Py_INCREF ( pyobj_cbData ) ;
dictKey = libvirt_constcharPtrWrap ( " conn " ) ;
pyobj_conn = PyDict_GetItem ( pyobj_cbData , dictKey ) ;
Py_DECREF ( dictKey ) ;
/* Call the Callback Dispatcher */
pyobj_ret = PyObject_CallMethod ( pyobj_conn ,
( char * ) " dispatchDomainEventBlockPullCallback " ,
( char * ) " OsiiO " ,
pyobj_dom , path , type , status , pyobj_cbData ) ;
Py_DECREF ( pyobj_cbData ) ;
Py_DECREF ( pyobj_dom ) ;
if ( ! pyobj_ret ) {
# if DEBUG_ERROR
printf ( " %s - ret:%p \n " , __FUNCTION__ , pyobj_ret ) ;
# endif
PyErr_Print ( ) ;
} else {
Py_DECREF ( pyobj_ret ) ;
ret = 0 ;
}
LIBVIRT_RELEASE_THREAD_STATE ;
return ret ;
}
2011-10-18 16:15:42 +02:00
static int
libvirt_virConnectDomainEventDiskChangeCallback ( virConnectPtr conn ATTRIBUTE_UNUSED ,
virDomainPtr dom ,
const char * oldSrcPath ,
const char * newSrcPath ,
const char * devAlias ,
int reason ,
void * opaque )
{
PyObject * pyobj_cbData = ( PyObject * ) opaque ;
PyObject * pyobj_dom ;
PyObject * pyobj_ret ;
PyObject * pyobj_conn ;
PyObject * dictKey ;
int ret = - 1 ;
LIBVIRT_ENSURE_THREAD_STATE ;
/* Create a python instance of this virDomainPtr */
virDomainRef ( dom ) ;
pyobj_dom = libvirt_virDomainPtrWrap ( dom ) ;
Py_INCREF ( pyobj_cbData ) ;
dictKey = libvirt_constcharPtrWrap ( " conn " ) ;
pyobj_conn = PyDict_GetItem ( pyobj_cbData , dictKey ) ;
Py_DECREF ( dictKey ) ;
/* Call the Callback Dispatcher */
pyobj_ret = PyObject_CallMethod ( pyobj_conn ,
( char * ) " _dispatchDomainEventDiskChangeCallback " ,
( char * ) " OsssiO " ,
pyobj_dom ,
oldSrcPath , newSrcPath ,
devAlias , reason , pyobj_cbData ) ;
Py_DECREF ( pyobj_cbData ) ;
Py_DECREF ( pyobj_dom ) ;
if ( ! pyobj_ret ) {
DEBUG ( " %s - ret:%p \n " , __FUNCTION__ , pyobj_ret ) ;
PyErr_Print ( ) ;
} else {
Py_DECREF ( pyobj_ret ) ;
ret = 0 ;
}
LIBVIRT_RELEASE_THREAD_STATE ;
return ret ;
}
2010-03-26 13:22:06 +00:00
static PyObject *
libvirt_virConnectDomainEventRegisterAny ( ATTRIBUTE_UNUSED PyObject * self ,
PyObject * args )
{
PyObject * py_retval ; /* return value */
PyObject * pyobj_conn ; /* virConnectPtr */
PyObject * pyobj_dom ;
PyObject * pyobj_cbData ; /* hash of callback data */
int eventID ;
virConnectPtr conn ;
int ret = 0 ;
virConnectDomainEventGenericCallback cb = NULL ;
virDomainPtr dom ;
if ( ! PyArg_ParseTuple
( args , ( char * ) " OOiO:virConnectDomainEventRegisterAny " ,
& pyobj_conn , & pyobj_dom , & eventID , & pyobj_cbData ) ) {
2011-06-14 12:59:44 -04:00
DEBUG ( " %s failed parsing tuple \n " , __FUNCTION__ ) ;
2010-03-26 13:22:06 +00:00
return VIR_PY_INT_FAIL ;
}
2011-06-14 12:59:44 -04:00
DEBUG ( " libvirt_virConnectDomainEventRegister(%p %p %d %p) called \n " ,
2010-03-26 13:22:06 +00:00
pyobj_conn , pyobj_dom , eventID , pyobj_cbData ) ;
conn = PyvirConnect_Get ( pyobj_conn ) ;
if ( pyobj_dom = = Py_None )
dom = NULL ;
else
dom = PyvirDomain_Get ( pyobj_dom ) ;
switch ( eventID ) {
case VIR_DOMAIN_EVENT_ID_LIFECYCLE :
cb = VIR_DOMAIN_EVENT_CALLBACK ( libvirt_virConnectDomainEventLifecycleCallback ) ;
break ;
case VIR_DOMAIN_EVENT_ID_REBOOT :
cb = VIR_DOMAIN_EVENT_CALLBACK ( libvirt_virConnectDomainEventGenericCallback ) ;
break ;
case VIR_DOMAIN_EVENT_ID_RTC_CHANGE :
cb = VIR_DOMAIN_EVENT_CALLBACK ( libvirt_virConnectDomainEventRTCChangeCallback ) ;
break ;
case VIR_DOMAIN_EVENT_ID_WATCHDOG :
cb = VIR_DOMAIN_EVENT_CALLBACK ( libvirt_virConnectDomainEventWatchdogCallback ) ;
break ;
case VIR_DOMAIN_EVENT_ID_IO_ERROR :
cb = VIR_DOMAIN_EVENT_CALLBACK ( libvirt_virConnectDomainEventIOErrorCallback ) ;
break ;
Add support for another explicit IO error event
This introduces a new event type
VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON
This event is the same as the previous VIR_DOMAIN_ID_IO_ERROR
event, but also includes a string describing the cause of
the event.
Thus there is a new callback definition for this event type
typedef void (*virConnectDomainEventIOErrorReasonCallback)(virConnectPtr conn,
virDomainPtr dom,
const char *srcPath,
const char *devAlias,
int action,
const char *reason,
void *opaque);
This is currently wired up to the QEMU block IO error events
* daemon/remote.c: Dispatch IO error events to client
* examples/domain-events/events-c/event-test.c: Watch for
IO error events
* include/libvirt/libvirt.h.in: Define new IO error event ID
and callback signature
* src/conf/domain_event.c, src/conf/domain_event.h,
src/libvirt_private.syms: Extend API to handle IO error events
* src/qemu/qemu_driver.c: Connect to the QEMU monitor event
for block IO errors and emit a libvirt IO error event
* src/remote/remote_driver.c: Receive and dispatch IO error
events to application
* src/remote/remote_protocol.x: Wire protocol definition for
IO error events
* src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h,
src/qemu/qemu_monitor_json.c: Watch for BLOCK_IO_ERROR event
from QEMU monitor
2010-03-18 19:37:44 +00:00
case VIR_DOMAIN_EVENT_ID_IO_ERROR_REASON :
cb = VIR_DOMAIN_EVENT_CALLBACK ( libvirt_virConnectDomainEventIOErrorReasonCallback ) ;
break ;
2010-03-26 13:22:06 +00:00
case VIR_DOMAIN_EVENT_ID_GRAPHICS :
cb = VIR_DOMAIN_EVENT_CALLBACK ( libvirt_virConnectDomainEventGraphicsCallback ) ;
break ;
2011-05-29 20:21:53 +08:00
case VIR_DOMAIN_EVENT_ID_CONTROL_ERROR :
cb = VIR_DOMAIN_EVENT_CALLBACK ( libvirt_virConnectDomainEventGenericCallback ) ;
break ;
2011-07-22 13:57:42 +08:00
case VIR_DOMAIN_EVENT_ID_BLOCK_JOB :
cb = VIR_DOMAIN_EVENT_CALLBACK ( libvirt_virConnectDomainEventBlockJobCallback ) ;
break ;
2011-10-18 16:15:42 +02:00
case VIR_DOMAIN_EVENT_ID_DISK_CHANGE :
cb = VIR_DOMAIN_EVENT_CALLBACK ( libvirt_virConnectDomainEventDiskChangeCallback ) ;
break ;
2010-03-26 13:22:06 +00:00
}
if ( ! cb ) {
return VIR_PY_INT_FAIL ;
}
Py_INCREF ( pyobj_cbData ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
ret = virConnectDomainEventRegisterAny ( conn , dom , eventID ,
cb , pyobj_cbData ,
libvirt_virConnectDomainEventFreeFunc ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( ret < 0 ) {
Py_DECREF ( pyobj_cbData ) ;
}
py_retval = libvirt_intWrap ( ret ) ;
return ( py_retval ) ;
}
static PyObject *
libvirt_virConnectDomainEventDeregisterAny ( ATTRIBUTE_UNUSED PyObject * self ,
PyObject * args )
{
PyObject * py_retval ;
PyObject * pyobj_conn ;
int callbackID ;
virConnectPtr conn ;
int ret = 0 ;
if ( ! PyArg_ParseTuple
( args , ( char * ) " Oi:virConnectDomainEventDeregister " ,
& pyobj_conn , & callbackID ) )
return ( NULL ) ;
2011-06-14 12:59:44 -04:00
DEBUG ( " libvirt_virConnectDomainEventDeregister(%p) called \n " , pyobj_conn ) ;
2010-03-26 13:22:06 +00:00
conn = ( virConnectPtr ) PyvirConnect_Get ( pyobj_conn ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
ret = virConnectDomainEventDeregisterAny ( conn , callbackID ) ;
LIBVIRT_END_ALLOW_THREADS ;
py_retval = libvirt_intWrap ( ret ) ;
return ( py_retval ) ;
}
2011-06-14 13:49:22 -04:00
static void
libvirt_virStreamEventFreeFunc ( void * opaque )
{
PyObject * pyobj_stream = ( PyObject * ) opaque ;
LIBVIRT_ENSURE_THREAD_STATE ;
Py_DECREF ( pyobj_stream ) ;
LIBVIRT_RELEASE_THREAD_STATE ;
}
static void
libvirt_virStreamEventCallback ( virStreamPtr st ATTRIBUTE_UNUSED ,
int events ,
void * opaque )
{
PyObject * pyobj_cbData = ( PyObject * ) opaque ;
PyObject * pyobj_stream ;
PyObject * pyobj_ret ;
PyObject * dictKey ;
LIBVIRT_ENSURE_THREAD_STATE ;
Py_INCREF ( pyobj_cbData ) ;
dictKey = libvirt_constcharPtrWrap ( " stream " ) ;
pyobj_stream = PyDict_GetItem ( pyobj_cbData , dictKey ) ;
Py_DECREF ( dictKey ) ;
/* Call the pure python dispatcher */
pyobj_ret = PyObject_CallMethod ( pyobj_stream ,
2011-06-15 20:14:45 -04:00
( char * ) " _dispatchStreamEventCallback " ,
2011-06-14 13:49:22 -04:00
( char * ) " iO " ,
events , pyobj_cbData ) ;
Py_DECREF ( pyobj_cbData ) ;
if ( ! pyobj_ret ) {
DEBUG ( " %s - ret:%p \n " , __FUNCTION__ , pyobj_ret ) ;
PyErr_Print ( ) ;
} else {
Py_DECREF ( pyobj_ret ) ;
}
LIBVIRT_RELEASE_THREAD_STATE ;
}
static PyObject *
libvirt_virStreamEventAddCallback ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args )
{
PyObject * py_retval ;
PyObject * pyobj_stream ;
PyObject * pyobj_cbData ;
virStreamPtr stream ;
virStreamEventCallback cb = libvirt_virStreamEventCallback ;
int ret ;
int events ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " OiO:virStreamEventAddCallback " ,
& pyobj_stream , & events , & pyobj_cbData ) ) {
DEBUG ( " %s failed to parse tuple \n " , __FUNCTION__ ) ;
return VIR_PY_INT_FAIL ;
}
DEBUG ( " libvirt_virStreamEventAddCallback(%p, %d, %p) called \n " ,
pyobj_stream , events , pyobj_cbData ) ;
stream = PyvirStream_Get ( pyobj_stream ) ;
Py_INCREF ( pyobj_cbData ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
ret = virStreamEventAddCallback ( stream , events , cb , pyobj_cbData ,
libvirt_virStreamEventFreeFunc ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( ret < 0 ) {
Py_DECREF ( pyobj_cbData ) ;
}
py_retval = libvirt_intWrap ( ret ) ;
return py_retval ;
}
2010-03-26 13:22:06 +00:00
2011-06-14 16:07:43 -04:00
static PyObject *
libvirt_virStreamRecv ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args )
{
PyObject * pyobj_stream ;
virStreamPtr stream ;
char * buf = NULL ;
int ret ;
int nbytes ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " Oi:virStreamRecv " ,
& pyobj_stream , & nbytes ) ) {
DEBUG ( " %s failed to parse tuple \n " , __FUNCTION__ ) ;
return VIR_PY_NONE ;
}
stream = PyvirStream_Get ( pyobj_stream ) ;
if ( ( buf = malloc ( nbytes + 1 > 0 ? nbytes + 1 : 1 ) ) = = NULL )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
ret = virStreamRecv ( stream , buf , nbytes ) ;
LIBVIRT_END_ALLOW_THREADS ;
buf [ ret > - 1 ? ret : 0 ] = ' \0 ' ;
DEBUG ( " StreamRecv ret=%d strlen=%d \n " , ret , ( int ) strlen ( buf ) ) ;
2011-07-26 19:25:43 -04:00
if ( ret = = - 2 )
2011-06-14 16:07:43 -04:00
return libvirt_intWrap ( ret ) ;
2011-07-26 19:25:43 -04:00
if ( ret < 0 )
return VIR_PY_NONE ;
2011-06-14 16:07:43 -04:00
return libvirt_charPtrSizeWrap ( ( char * ) buf , ( Py_ssize_t ) ret ) ;
}
static PyObject *
libvirt_virStreamSend ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args )
{
PyObject * py_retval ;
PyObject * pyobj_stream ;
virStreamPtr stream ;
char * data ;
2011-07-25 11:44:36 -04:00
int datalen ;
2011-06-14 16:07:43 -04:00
int ret ;
int nbytes ;
2011-07-25 11:44:36 -04:00
if ( ! PyArg_ParseTuple ( args , ( char * ) " Oz#i:virStreamRecv " ,
& pyobj_stream , & data , & datalen , & nbytes ) ) {
2011-06-14 16:07:43 -04:00
DEBUG ( " %s failed to parse tuple \n " , __FUNCTION__ ) ;
return VIR_PY_INT_FAIL ;
}
stream = PyvirStream_Get ( pyobj_stream ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
ret = virStreamSend ( stream , data , nbytes ) ;
LIBVIRT_END_ALLOW_THREADS ;
DEBUG ( " StreamSend ret=%d \n " , ret ) ;
py_retval = libvirt_intWrap ( ret ) ;
return py_retval ;
}
2011-07-21 17:21:10 +08:00
static PyObject *
libvirt_virDomainSendKey ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args )
{
PyObject * py_retval ;
virDomainPtr domain ;
PyObject * pyobj_domain ;
PyObject * pyobj_list ;
int codeset ;
int holdtime ;
unsigned int flags ;
int ret ;
int i ;
unsigned int keycodes [ VIR_DOMAIN_SEND_KEY_MAX_KEYS ] ;
unsigned int nkeycodes ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " OiiOii:virDomainSendKey " ,
& pyobj_domain , & codeset , & holdtime , & pyobj_list ,
& nkeycodes , & flags ) ) {
DEBUG ( " %s failed to parse tuple \n " , __FUNCTION__ ) ;
return VIR_PY_INT_FAIL ;
}
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
if ( ! PyList_Check ( pyobj_list ) ) {
return VIR_PY_INT_FAIL ;
}
if ( nkeycodes ! = PyList_Size ( pyobj_list ) | |
nkeycodes > VIR_DOMAIN_SEND_KEY_MAX_KEYS ) {
return VIR_PY_INT_FAIL ;
}
for ( i = 0 ; i < nkeycodes ; i + + ) {
keycodes [ i ] = ( int ) PyInt_AsLong ( PyList_GetItem ( pyobj_list , i ) ) ;
}
LIBVIRT_BEGIN_ALLOW_THREADS ;
ret = virDomainSendKey ( domain , codeset , holdtime , keycodes , nkeycodes , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
DEBUG ( " virDomainSendKey ret=%d \n " , ret ) ;
py_retval = libvirt_intWrap ( ret ) ;
return py_retval ;
}
2011-08-26 12:10:21 -06:00
static PyObject *
libvirt_virDomainMigrateGetMaxSpeed ( PyObject * self ATTRIBUTE_UNUSED , PyObject * args ) {
PyObject * py_retval ;
int c_retval ;
unsigned long bandwidth ;
virDomainPtr domain ;
PyObject * pyobj_domain ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " O:virDomainMigrateGetMaxSpeed " , & pyobj_domain ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virDomainMigrateGetMaxSpeed ( domain , & bandwidth , 0 ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
return VIR_PY_INT_FAIL ;
py_retval = libvirt_ulongWrap ( bandwidth ) ;
return ( py_retval ) ;
}
2011-12-15 21:01:33 +08:00
static PyObject *
libvirt_virDomainBlockPeek ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
PyObject * py_retval = NULL ;
int c_retval ;
virDomainPtr domain ;
PyObject * pyobj_domain ;
const char * disk ;
unsigned long long offset ;
size_t size ;
char * buf ;
unsigned int flags ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " OzLni:virDomainBlockPeek " , & pyobj_domain ,
& disk , & offset , & size , & flags ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
if ( ( buf = malloc ( size ) ) = = NULL )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virDomainBlockPeek ( domain , disk , offset , size , buf , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
goto cleanup ;
py_retval = PyString_FromStringAndSize ( buf , size ) ;
cleanup :
free ( buf ) ;
return py_retval ;
}
static PyObject *
libvirt_virDomainMemoryPeek ( PyObject * self ATTRIBUTE_UNUSED ,
PyObject * args ) {
PyObject * py_retval = NULL ;
int c_retval ;
virDomainPtr domain ;
PyObject * pyobj_domain ;
unsigned long long start ;
size_t size ;
char * buf ;
unsigned int flags ;
if ( ! PyArg_ParseTuple ( args , ( char * ) " OLni:virDomainMemoryPeek " , & pyobj_domain ,
& start , & size , & flags ) )
return ( NULL ) ;
domain = ( virDomainPtr ) PyvirDomain_Get ( pyobj_domain ) ;
if ( ( buf = malloc ( size ) ) = = NULL )
return VIR_PY_NONE ;
LIBVIRT_BEGIN_ALLOW_THREADS ;
c_retval = virDomainMemoryPeek ( domain , start , size , buf , flags ) ;
LIBVIRT_END_ALLOW_THREADS ;
if ( c_retval < 0 )
goto cleanup ;
py_retval = PyString_FromStringAndSize ( buf , size ) ;
cleanup :
free ( buf ) ;
return py_retval ;
}
2005-12-19 16:34:11 +00:00
/************************************************************************
* *
* The registration stuff *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2006-02-09 17:45:11 +00:00
static PyMethodDef libvirtMethods [ ] = {
# include "libvirt-export.c"
2007-05-29 14:58:27 +00:00
{ ( char * ) " virGetVersion " , libvirt_virGetVersion , METH_VARARGS , NULL } ,
2010-01-22 11:01:09 +01:00
{ ( char * ) " virConnectGetVersion " , libvirt_virConnectGetVersion , METH_VARARGS , NULL } ,
2009-11-12 10:53:26 -05:00
{ ( char * ) " virConnectGetLibVersion " , libvirt_virConnectGetLibVersion , METH_VARARGS , NULL } ,
2007-12-05 19:09:23 +00:00
{ ( char * ) " virConnectOpenAuth " , libvirt_virConnectOpenAuth , METH_VARARGS , NULL } ,
2006-02-09 17:45:11 +00:00
{ ( char * ) " virConnectListDomainsID " , libvirt_virConnectListDomainsID , METH_VARARGS , NULL } ,
2006-11-16 00:17:10 +00:00
{ ( char * ) " virConnectListDefinedDomains " , libvirt_virConnectListDefinedDomains , METH_VARARGS , NULL } ,
2008-10-31 10:13:45 +00:00
{ ( char * ) " virConnectDomainEventRegister " , libvirt_virConnectDomainEventRegister , METH_VARARGS , NULL } ,
{ ( char * ) " virConnectDomainEventDeregister " , libvirt_virConnectDomainEventDeregister , METH_VARARGS , NULL } ,
2010-03-26 13:22:06 +00:00
{ ( char * ) " virConnectDomainEventRegisterAny " , libvirt_virConnectDomainEventRegisterAny , METH_VARARGS , NULL } ,
{ ( char * ) " virConnectDomainEventDeregisterAny " , libvirt_virConnectDomainEventDeregisterAny , METH_VARARGS , NULL } ,
2011-06-14 13:49:22 -04:00
{ ( char * ) " virStreamEventAddCallback " , libvirt_virStreamEventAddCallback , METH_VARARGS , NULL } ,
2011-06-14 16:07:43 -04:00
{ ( char * ) " virStreamRecv " , libvirt_virStreamRecv , METH_VARARGS , NULL } ,
{ ( char * ) " virStreamSend " , libvirt_virStreamSend , METH_VARARGS , NULL } ,
2006-02-09 17:45:11 +00:00
{ ( char * ) " virDomainGetInfo " , libvirt_virDomainGetInfo , METH_VARARGS , NULL } ,
2011-04-22 13:31:35 +02:00
{ ( char * ) " virDomainGetState " , libvirt_virDomainGetState , METH_VARARGS , NULL } ,
2011-05-24 11:28:50 +03:00
{ ( char * ) " virDomainGetControlInfo " , libvirt_virDomainGetControlInfo , METH_VARARGS , NULL } ,
2010-04-28 13:42:13 +01:00
{ ( char * ) " virDomainGetBlockInfo " , libvirt_virDomainGetBlockInfo , METH_VARARGS , NULL } ,
2006-03-29 12:46:03 +00:00
{ ( char * ) " virNodeGetInfo " , libvirt_virNodeGetInfo , METH_VARARGS , NULL } ,
2011-11-28 18:19:27 +01:00
{ ( char * ) " virNodeGetCPUStats " , libvirt_virNodeGetCPUStats , METH_VARARGS , NULL } ,
2011-11-28 18:19:28 +01:00
{ ( char * ) " virNodeGetMemoryStats " , libvirt_virNodeGetMemoryStats , METH_VARARGS , NULL } ,
2006-02-23 11:26:17 +00:00
{ ( char * ) " virDomainGetUUID " , libvirt_virDomainGetUUID , METH_VARARGS , NULL } ,
2008-06-10 15:20:25 +00:00
{ ( char * ) " virDomainGetUUIDString " , libvirt_virDomainGetUUIDString , METH_VARARGS , NULL } ,
2006-02-24 12:26:56 +00:00
{ ( char * ) " virDomainLookupByUUID " , libvirt_virDomainLookupByUUID , METH_VARARGS , NULL } ,
2006-02-28 12:17:00 +00:00
{ ( char * ) " virRegisterErrorHandler " , libvirt_virRegisterErrorHandler , METH_VARARGS , NULL } ,
2006-11-07 23:18:56 +00:00
{ ( char * ) " virGetLastError " , libvirt_virGetLastError , METH_VARARGS , NULL } ,
{ ( char * ) " virConnGetLastError " , libvirt_virConnGetLastError , METH_VARARGS , NULL } ,
2007-03-09 15:42:50 +00:00
{ ( char * ) " virConnectListNetworks " , libvirt_virConnectListNetworks , METH_VARARGS , NULL } ,
{ ( char * ) " virConnectListDefinedNetworks " , libvirt_virConnectListDefinedNetworks , METH_VARARGS , NULL } ,
{ ( char * ) " virNetworkGetUUID " , libvirt_virNetworkGetUUID , METH_VARARGS , NULL } ,
2008-06-10 15:20:25 +00:00
{ ( char * ) " virNetworkGetUUIDString " , libvirt_virNetworkGetUUIDString , METH_VARARGS , NULL } ,
2007-03-09 15:42:50 +00:00
{ ( char * ) " virNetworkLookupByUUID " , libvirt_virNetworkLookupByUUID , METH_VARARGS , NULL } ,
2007-04-10 23:15:58 +00:00
{ ( char * ) " virDomainGetAutostart " , libvirt_virDomainGetAutostart , METH_VARARGS , NULL } ,
{ ( char * ) " virNetworkGetAutostart " , libvirt_virNetworkGetAutostart , METH_VARARGS , NULL } ,
2007-09-30 20:52:13 +00:00
{ ( char * ) " virDomainBlockStats " , libvirt_virDomainBlockStats , METH_VARARGS , NULL } ,
2011-09-05 16:24:21 +08:00
{ ( char * ) " virDomainBlockStatsFlags " , libvirt_virDomainBlockStatsFlags , METH_VARARGS , NULL } ,
2007-09-30 20:52:13 +00:00
{ ( char * ) " virDomainInterfaceStats " , libvirt_virDomainInterfaceStats , METH_VARARGS , NULL } ,
2009-12-20 13:48:37 +01:00
{ ( char * ) " virDomainMemoryStats " , libvirt_virDomainMemoryStats , METH_VARARGS , NULL } ,
2007-12-07 08:41:01 +00:00
{ ( char * ) " virNodeGetCellsFreeMemory " , libvirt_virNodeGetCellsFreeMemory , METH_VARARGS , NULL } ,
2008-01-21 15:41:15 +00:00
{ ( char * ) " virDomainGetSchedulerType " , libvirt_virDomainGetSchedulerType , METH_VARARGS , NULL } ,
{ ( char * ) " virDomainGetSchedulerParameters " , libvirt_virDomainGetSchedulerParameters , METH_VARARGS , NULL } ,
2011-07-25 14:54:34 +08:00
{ ( char * ) " virDomainGetSchedulerParametersFlags " , libvirt_virDomainGetSchedulerParametersFlags , METH_VARARGS , NULL } ,
2008-01-21 15:41:15 +00:00
{ ( char * ) " virDomainSetSchedulerParameters " , libvirt_virDomainSetSchedulerParameters , METH_VARARGS , NULL } ,
2011-07-25 14:57:33 +08:00
{ ( char * ) " virDomainSetSchedulerParametersFlags " , libvirt_virDomainSetSchedulerParametersFlags , METH_VARARGS , NULL } ,
2011-02-22 13:30:33 +08:00
{ ( char * ) " virDomainSetBlkioParameters " , libvirt_virDomainSetBlkioParameters , METH_VARARGS , NULL } ,
{ ( char * ) " virDomainGetBlkioParameters " , libvirt_virDomainGetBlkioParameters , METH_VARARGS , NULL } ,
2010-10-12 21:24:11 +02:00
{ ( char * ) " virDomainSetMemoryParameters " , libvirt_virDomainSetMemoryParameters , METH_VARARGS , NULL } ,
{ ( char * ) " virDomainGetMemoryParameters " , libvirt_virDomainGetMemoryParameters , METH_VARARGS , NULL } ,
2008-01-21 15:41:15 +00:00
{ ( char * ) " virDomainGetVcpus " , libvirt_virDomainGetVcpus , METH_VARARGS , NULL } ,
{ ( char * ) " virDomainPinVcpu " , libvirt_virDomainPinVcpu , METH_VARARGS , NULL } ,
2011-07-25 15:00:11 +08:00
{ ( char * ) " virDomainPinVcpuFlags " , libvirt_virDomainPinVcpuFlags , METH_VARARGS , NULL } ,
2011-07-25 15:04:50 +08:00
{ ( char * ) " virDomainGetVcpuPinInfo " , libvirt_virDomainGetVcpuPinInfo , METH_VARARGS , NULL } ,
2008-02-20 15:26:22 +00:00
{ ( char * ) " virConnectListStoragePools " , libvirt_virConnectListStoragePools , METH_VARARGS , NULL } ,
{ ( char * ) " virConnectListDefinedStoragePools " , libvirt_virConnectListDefinedStoragePools , METH_VARARGS , NULL } ,
{ ( char * ) " virStoragePoolGetAutostart " , libvirt_virStoragePoolGetAutostart , METH_VARARGS , NULL } ,
{ ( char * ) " virStoragePoolListVolumes " , libvirt_virStoragePoolListVolumes , METH_VARARGS , NULL } ,
{ ( char * ) " virStoragePoolGetInfo " , libvirt_virStoragePoolGetInfo , METH_VARARGS , NULL } ,
{ ( char * ) " virStorageVolGetInfo " , libvirt_virStorageVolGetInfo , METH_VARARGS , NULL } ,
{ ( char * ) " virStoragePoolGetUUID " , libvirt_virStoragePoolGetUUID , METH_VARARGS , NULL } ,
2008-06-10 15:20:25 +00:00
{ ( char * ) " virStoragePoolGetUUIDString " , libvirt_virStoragePoolGetUUIDString , METH_VARARGS , NULL } ,
2008-02-20 15:26:22 +00:00
{ ( char * ) " virStoragePoolLookupByUUID " , libvirt_virStoragePoolLookupByUUID , METH_VARARGS , NULL } ,
2008-10-31 10:13:45 +00:00
{ ( char * ) " virEventRegisterImpl " , libvirt_virEventRegisterImpl , METH_VARARGS , NULL } ,
2011-06-15 19:35:44 -04:00
{ ( char * ) " virEventAddHandle " , libvirt_virEventAddHandle , METH_VARARGS , NULL } ,
{ ( char * ) " virEventAddTimeout " , libvirt_virEventAddTimeout , METH_VARARGS , NULL } ,
2008-10-31 10:13:45 +00:00
{ ( char * ) " virEventInvokeHandleCallback " , libvirt_virEventInvokeHandleCallback , METH_VARARGS , NULL } ,
{ ( char * ) " virEventInvokeTimeoutCallback " , libvirt_virEventInvokeTimeoutCallback , METH_VARARGS , NULL } ,
2008-11-21 12:41:15 +00:00
{ ( char * ) " virNodeListDevices " , libvirt_virNodeListDevices , METH_VARARGS , NULL } ,
{ ( char * ) " virNodeDeviceListCaps " , libvirt_virNodeDeviceListCaps , METH_VARARGS , NULL } ,
Fix UUID handling in secrets/storage encryption APIs
Convert all the secret/storage encryption APIs / wire format to
handle UUIDs in raw format instead of non-canonical printable
format. Guarentees data format correctness.
* docs/schemas/storageencryption.rng: Make UUID mandatory for a secret
and validate fully
* docs/schemas/secret.rng: Fully validate UUID
* include/libvirt/libvirt.h, include/libvirt/libvirt.h.in, Add
virSecretLookupByUUID and virSecretGetUUID. Make
virSecretGetUUIDString follow normal API design pattern
* python/generator.py: Skip generation of virSecretGetUUID,
virSecretGetUUIDString and virSecretLookupByUUID
* python/libvir.c, python/libvirt-python-api.xml: Manual impl
of virSecretGetUUID,virSecretGetUUIDString and virSecretLookupByUUID
* qemud/remote.c: s/virSecretLookupByUUIDString/virSecretLookupByUUID/
Fix get_nonnull_secret/make_nonnull_secret to use unsigned char
* qemud/remote_protocol.x: Fix remote_nonnull_secret to use a
remote_uuid instead of remote_nonnull_string for UUID field.
Rename REMOTE_PROC_SECRET_LOOKUP_BY_UUID_STRING to
REMOTE_PROC_SECRET_LOOKUP_BY_UUID_STRING and make it take an
remote_uuid value
* qemud/remote_dispatch_args.h, qemud/remote_dispatch_prototypes.h,
qemud/remote_dispatch_ret.h, qemud/remote_dispatch_table.h,
qemud/remote_protocol.c, qemud/remote_protocol.h: Re-generate
* src/datatypes.h, src/datatypes.c: Store UUID in raw format instead
of printable. Change virGetSecret to use raw format UUID
* src/driver.h: Rename virDrvSecretLookupByUUIDString to
virDrvSecretLookupByUUID and use raw format UUID
* src/libvirt.c: Add virSecretLookupByUUID and virSecretGetUUID
and re-implement virSecretLookupByUUIDString and
virSecretGetUUIDString in terms of those
* src/libvirt_public.syms: Add virSecretLookupByUUID and
virSecretGetUUID
* src/remote_internal.c: Rename remoteSecretLookupByUUIDString
to remoteSecretLookupByUUID. Fix typo in args for
remoteSecretDefineXML impl. Use raw UUID format for
get_nonnull_secret and make_nonnull_secret
* src/storage_encryption_conf.c, src/storage_encryption_conf.h:
Storage UUID in raw format, and require it to be present in
XML. Use UUID parser to validate.
* secret_conf.h, secret_conf.c: Generate a UUID if none is provided.
Storage UUID in raw format.
* src/secret_driver.c: Adjust to deal with raw UUIDs. Save secrets
in a filed with printable UUID, instead of base64 UUID.
* src/virsh.c: Adjust for changed public API contract of
virSecretGetUUIDString.
* src/storage_Backend.c: DOn't undefine secret we just generated
upon successful volume creation. Fix to handle raw UUIDs. Generate
a non-clashing UUID
* src/qemu_driver.c: Change to use lookupByUUID instead of
lookupByUUIDString
2009-09-10 17:44:12 +01:00
{ ( char * ) " virSecretGetUUID " , libvirt_virSecretGetUUID , METH_VARARGS , NULL } ,
{ ( char * ) " virSecretGetUUIDString " , libvirt_virSecretGetUUIDString , METH_VARARGS , NULL } ,
{ ( char * ) " virSecretLookupByUUID " , libvirt_virSecretLookupByUUID , METH_VARARGS , NULL } ,
Secret manipulation API docs refresh & wire up python generator
Sample session:
>>> import libvirt
>>> c = libvirt.open('qemu:///session')
>>> c.listSecrets()
['12247729-47d2-a783-88ce-b329d4781cd3', 'reee', 'abc']
>>> s = c.secretDefineXML("<secret ephemeral='no' private='no'>\n<description>Something for use</description>\n<volume>/foo/bar</volume>\n</secret>\n")
>>> s.UUIDString()
'340c2dfb-811b-eda8-da9e-25ccd7bfd650'
>>> s.XMLDesc()
"<secret ephemeral='no' private='no'>\n <uuid>340c2dfb-811b-eda8-da9e-25ccd7bfd650</uuid>\n <description>Something for use</description>\n <volume>/foo/bar</volume>\n</secret>\n"
>>> s.setValue('abc\0xx\xffx')
0
>>> s.value()
'abc\x00xx\xffx'
>>> s.undefine()
0
* python/generator.py: Add rules for virSecret APIs
* python/libvir.c, python/libvirt-python-api.xml: Manual impl of
virSecretSetValue, virSecretGetValue$ and virConnectListSecrets APIs
* python/libvirt_wrap.h, python/types.c: Wrapper for virSecret objects
* docs/libvirt-api.xml, docs/libvirt-refs.xml,
docs/html/libvirt-virterror.html, docs/html/libvirt-libvirt.html,
docs/devhelp/libvirt-virterror.html, docs/devhelp/libvirt-libvirt.html:
Re-generate with 'make api'
2009-08-04 20:38:21 +02:00
{ ( char * ) " virConnectListSecrets " , libvirt_virConnectListSecrets , METH_VARARGS , NULL } ,
{ ( char * ) " virSecretGetValue " , libvirt_virSecretGetValue , METH_VARARGS , NULL } ,
{ ( char * ) " virSecretSetValue " , libvirt_virSecretSetValue , METH_VARARGS , NULL } ,
2010-04-29 06:46:01 -04:00
{ ( char * ) " virNWFilterGetUUID " , libvirt_virNWFilterGetUUID , METH_VARARGS , NULL } ,
{ ( char * ) " virNWFilterGetUUIDString " , libvirt_virNWFilterGetUUIDString , METH_VARARGS , NULL } ,
{ ( char * ) " virNWFilterLookupByUUID " , libvirt_virNWFilterLookupByUUID , METH_VARARGS , NULL } ,
{ ( char * ) " virConnectListNWFilters " , libvirt_virConnectListNWFilters , METH_VARARGS , NULL } ,
2009-11-20 16:22:42 +01:00
{ ( char * ) " virConnectListInterfaces " , libvirt_virConnectListInterfaces , METH_VARARGS , NULL } ,
{ ( char * ) " virConnectListDefinedInterfaces " , libvirt_virConnectListDefinedInterfaces , METH_VARARGS , NULL } ,
2010-01-22 14:52:41 +01:00
{ ( char * ) " virConnectBaselineCPU " , libvirt_virConnectBaselineCPU , METH_VARARGS , NULL } ,
2010-02-03 11:31:45 +00:00
{ ( char * ) " virDomainGetJobInfo " , libvirt_virDomainGetJobInfo , METH_VARARGS , NULL } ,
2010-04-20 11:49:27 +02:00
{ ( char * ) " virDomainSnapshotListNames " , libvirt_virDomainSnapshotListNames , METH_VARARGS , NULL } ,
2011-12-13 15:49:59 +01:00
{ ( char * ) " virDomainSnapshotListChildrenNames " , libvirt_virDomainSnapshotListChildrenNames , METH_VARARGS , NULL } ,
2010-05-19 09:02:30 -04:00
{ ( char * ) " virDomainRevertToSnapshot " , libvirt_virDomainRevertToSnapshot , METH_VARARGS , NULL } ,
2011-07-22 13:43:53 +08:00
{ ( char * ) " virDomainGetBlockJobInfo " , libvirt_virDomainGetBlockJobInfo , METH_VARARGS , NULL } ,
2011-11-15 17:02:49 +08:00
{ ( char * ) " virDomainSetBlockIoTune " , libvirt_virDomainSetBlockIoTune , METH_VARARGS , NULL } ,
{ ( char * ) " virDomainGetBlockIoTune " , libvirt_virDomainGetBlockIoTune , METH_VARARGS , NULL } ,
2011-07-21 17:21:10 +08:00
{ ( char * ) " virDomainSendKey " , libvirt_virDomainSendKey , METH_VARARGS , NULL } ,
2011-08-26 12:10:21 -06:00
{ ( char * ) " virDomainMigrateGetMaxSpeed " , libvirt_virDomainMigrateGetMaxSpeed , METH_VARARGS , NULL } ,
2011-12-15 21:01:33 +08:00
{ ( char * ) " virDomainBlockPeek " , libvirt_virDomainBlockPeek , METH_VARARGS , NULL } ,
{ ( char * ) " virDomainMemoryPeek " , libvirt_virDomainMemoryPeek , METH_VARARGS , NULL } ,
2005-12-19 16:34:11 +00:00
{ NULL , NULL , 0 , NULL }
} ;
void
2007-11-30 11:10:53 +00:00
# ifndef __CYGWIN__
initlibvirtmod
# else
initcygvirtmod
# endif
( void )
2005-12-19 16:34:11 +00:00
{
static int initialized = 0 ;
if ( initialized ! = 0 )
return ;
2010-05-18 13:46:27 +02:00
if ( virInitialize ( ) < 0 )
return ;
2006-03-28 14:41:04 +00:00
2008-02-29 12:53:10 +00:00
/* initialize the python extension module */
2007-11-30 11:10:53 +00:00
Py_InitModule ( ( char * )
# ifndef __CYGWIN__
" libvirtmod "
# else
" cygvirtmod "
# endif
, libvirtMethods ) ;
2005-12-19 16:34:11 +00:00
initialized = 1 ;
}