2005-12-19 19:34:11 +03:00
/*
* types . c : converter functions between the internal representation
* and the Python objects
*
2019-12-04 13:27:36 +03:00
* Copyright ( C ) 2005 - 2019 Red Hat , Inc .
2005-12-19 19:34:11 +03:00
*
* Daniel Veillard < veillard @ redhat . com >
*/
2008-04-18 22:31:32 +04:00
/* Horrible kludge to work around even more horrible name-space pollution
2019-12-04 13:27:36 +03:00
* via Python . h . That file includes / usr / include / python3 . x / pyconfig * . h ,
* which has over 180 autoconf - style HAVE_ * definitions . Shame on them . */
2008-04-18 22:31:32 +04:00
# undef HAVE_PTHREAD_H
2023-09-20 20:27:20 +03:00
# include <stdio.h>
# include <string.h>
2009-09-16 17:03:53 +04:00
# include "typewrappers.h"
2013-11-12 22:21:52 +04:00
# include "libvirt-utils.h"
2005-12-19 19:34:11 +03:00
2010-12-02 20:15:10 +03:00
static PyObject *
libvirt_buildPyObject ( void * cobj ,
const char * name ,
PyCapsule_Destructor destr )
{
2019-12-04 13:27:36 +03:00
return PyCapsule_New ( cobj , name , destr ) ;
2010-12-02 20:15:10 +03:00
}
2005-12-19 19:34:11 +03:00
PyObject *
2006-02-09 20:45:11 +03:00
libvirt_intWrap ( int val )
2005-12-19 19:34:11 +03:00
{
2023-02-13 16:47:22 +03:00
return PyLong_FromLong ( val ) ;
2005-12-19 19:34:11 +03:00
}
2013-12-05 20:08:40 +04:00
PyObject *
2022-09-09 18:18:56 +03:00
libvirt_uintWrap ( unsigned int val )
2013-12-05 20:08:40 +04:00
{
2023-02-13 16:20:32 +03:00
return PyLong_FromUnsignedLong ( val ) ;
2013-12-05 20:08:40 +04:00
}
2005-12-19 19:34:11 +03:00
PyObject *
2006-02-09 20:45:11 +03:00
libvirt_longWrap ( long val )
2005-12-19 19:34:11 +03:00
{
2019-12-04 13:27:36 +03:00
return PyLong_FromLong ( val ) ;
2005-12-19 19:34:11 +03:00
}
2006-11-15 22:40:00 +03:00
PyObject *
libvirt_ulongWrap ( unsigned long val )
{
2019-12-04 13:27:36 +03:00
return PyLong_FromLong ( val ) ;
2008-02-05 22:27:37 +03:00
}
2006-11-15 22:40:00 +03:00
2006-01-31 13:24:12 +03:00
PyObject *
2006-02-09 20:45:11 +03:00
libvirt_longlongWrap ( long long val )
2006-01-31 13:24:12 +03:00
{
2019-12-04 13:27:36 +03:00
return PyLong_FromLongLong ( val ) ;
2006-01-31 13:24:12 +03:00
}
2010-02-03 14:31:45 +03:00
PyObject *
libvirt_ulonglongWrap ( unsigned long long val )
{
2019-12-04 13:27:36 +03:00
return PyLong_FromUnsignedLongLong ( val ) ;
2010-02-03 14:31:45 +03:00
}
2011-06-15 00:07:43 +04:00
PyObject *
libvirt_charPtrSizeWrap ( char * str , Py_ssize_t size )
{
if ( str = = NULL ) {
2015-08-21 22:38:45 +03:00
return VIR_PY_NONE ;
2011-06-15 00:07:43 +04:00
}
2019-12-04 13:27:36 +03:00
return PyBytes_FromStringAndSize ( str , size ) ;
2011-06-15 00:07:43 +04:00
}
2005-12-19 19:34:11 +03:00
PyObject *
2006-02-09 20:45:11 +03:00
libvirt_charPtrWrap ( char * str )
2005-12-19 19:34:11 +03:00
{
if ( str = = NULL ) {
2015-08-21 22:38:45 +03:00
return VIR_PY_NONE ;
2005-12-19 19:34:11 +03:00
}
2019-12-04 13:27:36 +03:00
return PyUnicode_FromString ( str ) ;
2005-12-19 19:34:11 +03:00
}
PyObject *
2006-02-09 20:45:11 +03:00
libvirt_constcharPtrWrap ( const char * str )
2005-12-19 19:34:11 +03:00
{
if ( str = = NULL ) {
2015-08-21 22:38:45 +03:00
return VIR_PY_NONE ;
2005-12-19 19:34:11 +03:00
}
2019-12-04 13:27:36 +03:00
return PyUnicode_FromString ( str ) ;
2005-12-19 19:34:11 +03:00
}
2013-11-26 22:31:18 +04:00
PyObject *
libvirt_boolWrap ( int val )
{
2015-09-22 11:41:36 +03:00
if ( val )
Py_RETURN_TRUE ;
else
Py_RETURN_FALSE ;
2013-11-26 22:31:18 +04:00
}
2012-03-27 10:06:10 +04:00
int
2015-09-29 17:37:13 +03:00
libvirt_intUnwrap ( PyObject * obj ,
int * val )
2012-03-27 10:06:10 +04:00
{
long long_val ;
2012-09-26 21:33:50 +04:00
if ( ! obj ) {
PyErr_SetString ( PyExc_TypeError , " unexpected type " ) ;
return - 1 ;
}
2012-03-27 10:06:10 +04:00
/* If obj is type of PyInt_Type, PyInt_AsLong converts it
* to C long type directly . If it is of PyLong_Type , PyInt_AsLong
* will call PyLong_AsLong ( ) to deal with it automatically .
*/
2013-12-09 18:00:19 +04:00
long_val = PyLong_AsLong ( obj ) ;
2012-03-27 10:06:10 +04:00
if ( ( long_val = = - 1 ) & & PyErr_Occurred ( ) )
return - 1 ;
2012-04-10 14:24:03 +04:00
# if LONG_MAX != INT_MAX
python: improve conversion validation
Laszlo Ersek pointed out that in trying to convert a long to an
unsigned int, we used:
long long_val = ...;
if ((unsigned int)long_val == long_val)
According to C99 integer promotion rules, the if statement is
equivalent to:
(unsigned long)(unsigned int)long_val == (unsigned long)long_val
since you get an unsigned comparison if at least one side is
unsigned, using the largest rank of the two sides; but on 32-bit
platforms, where unsigned long and unsigned int are the same size,
this comparison is always true and ends up converting negative
long_val into posigive unsigned int values, rather than rejecting
the negative value as we had originally intended (python longs
are unbounded size, and we don't want to do silent modulo
arithmetic when converting to C code).
Fix this by using direct comparisons, rather than casting.
* python/typewrappers.c (libvirt_intUnwrap, libvirt_uintUnwrap)
(libvirt_ulongUnwrap, libvirt_ulonglongUnwrap): Fix conversion
checks.
2012-03-30 22:03:20 +04:00
if ( long_val > = INT_MIN & & long_val < = INT_MAX ) {
2012-03-27 10:06:10 +04:00
* val = long_val ;
} else {
PyErr_SetString ( PyExc_OverflowError ,
" Python int too large to convert to C int " ) ;
return - 1 ;
}
2012-04-10 14:24:03 +04:00
# else
* val = long_val ;
# endif
2012-03-27 10:06:10 +04:00
return 0 ;
}
int
2015-09-29 17:37:13 +03:00
libvirt_uintUnwrap ( PyObject * obj ,
unsigned int * val )
2012-03-27 10:06:10 +04:00
{
2023-02-13 16:17:56 +03:00
unsigned long long_val ;
2012-03-27 10:06:10 +04:00
2012-09-26 21:33:50 +04:00
if ( ! obj ) {
PyErr_SetString ( PyExc_TypeError , " unexpected type " ) ;
return - 1 ;
}
2023-02-13 16:17:56 +03:00
long_val = PyLong_AsUnsignedLong ( obj ) ;
if ( ( long_val = = ( unsigned long ) - 1 ) & & PyErr_Occurred ( ) )
2012-03-27 10:06:10 +04:00
return - 1 ;
2023-02-13 16:17:56 +03:00
if ( long_val < = UINT_MAX ) {
2012-03-27 10:06:10 +04:00
* val = long_val ;
} else {
PyErr_SetString ( PyExc_OverflowError ,
" Python int too large to convert to C unsigned int " ) ;
return - 1 ;
}
return 0 ;
}
int
2015-09-29 17:37:13 +03:00
libvirt_longUnwrap ( PyObject * obj ,
long * val )
2012-03-27 10:06:10 +04:00
{
long long_val ;
2012-09-26 21:33:50 +04:00
if ( ! obj ) {
PyErr_SetString ( PyExc_TypeError , " unexpected type " ) ;
return - 1 ;
}
2013-12-09 18:00:19 +04:00
long_val = PyLong_AsLong ( obj ) ;
2012-03-27 10:06:10 +04:00
if ( ( long_val = = - 1 ) & & PyErr_Occurred ( ) )
return - 1 ;
* val = long_val ;
return 0 ;
}
int
2015-09-29 17:37:13 +03:00
libvirt_ulongUnwrap ( PyObject * obj ,
unsigned long * val )
2012-03-27 10:06:10 +04:00
{
long long_val ;
2012-09-26 21:33:50 +04:00
if ( ! obj ) {
PyErr_SetString ( PyExc_TypeError , " unexpected type " ) ;
return - 1 ;
}
2013-12-09 18:00:19 +04:00
long_val = PyLong_AsLong ( obj ) ;
2012-03-27 10:06:10 +04:00
if ( ( long_val = = - 1 ) & & PyErr_Occurred ( ) )
return - 1 ;
python: improve conversion validation
Laszlo Ersek pointed out that in trying to convert a long to an
unsigned int, we used:
long long_val = ...;
if ((unsigned int)long_val == long_val)
According to C99 integer promotion rules, the if statement is
equivalent to:
(unsigned long)(unsigned int)long_val == (unsigned long)long_val
since you get an unsigned comparison if at least one side is
unsigned, using the largest rank of the two sides; but on 32-bit
platforms, where unsigned long and unsigned int are the same size,
this comparison is always true and ends up converting negative
long_val into posigive unsigned int values, rather than rejecting
the negative value as we had originally intended (python longs
are unbounded size, and we don't want to do silent modulo
arithmetic when converting to C code).
Fix this by using direct comparisons, rather than casting.
* python/typewrappers.c (libvirt_intUnwrap, libvirt_uintUnwrap)
(libvirt_ulongUnwrap, libvirt_ulonglongUnwrap): Fix conversion
checks.
2012-03-30 22:03:20 +04:00
if ( long_val > = 0 ) {
* val = long_val ;
} else {
PyErr_SetString ( PyExc_OverflowError ,
" negative Python int cannot be converted to C unsigned long " ) ;
return - 1 ;
}
2012-03-27 10:06:10 +04:00
return 0 ;
}
int
2015-09-29 17:37:13 +03:00
libvirt_longlongUnwrap ( PyObject * obj ,
long long * val )
2012-03-27 10:06:10 +04:00
{
2012-09-28 16:29:03 +04:00
long long llong_val = - 1 ;
2012-03-27 10:06:10 +04:00
2012-09-26 21:33:50 +04:00
if ( ! obj ) {
PyErr_SetString ( PyExc_TypeError , " unexpected type " ) ;
return - 1 ;
}
2013-12-09 18:00:19 +04:00
if ( PyLong_Check ( obj ) )
2012-09-28 16:29:03 +04:00
llong_val = PyLong_AsLongLong ( obj ) ;
else
PyErr_SetString ( PyExc_TypeError , " an integer is required " ) ;
2012-03-27 10:06:10 +04:00
if ( ( llong_val = = - 1 ) & & PyErr_Occurred ( ) )
return - 1 ;
* val = llong_val ;
return 0 ;
}
int
2015-09-29 17:37:13 +03:00
libvirt_ulonglongUnwrap ( PyObject * obj ,
unsigned long long * val )
2012-03-27 10:06:10 +04:00
{
unsigned long long ullong_val = - 1 ;
2012-09-26 21:33:50 +04:00
if ( ! obj ) {
PyErr_SetString ( PyExc_TypeError , " unexpected type " ) ;
return - 1 ;
}
2013-12-09 18:00:19 +04:00
if ( PyLong_Check ( obj ) ) {
2012-03-27 10:06:10 +04:00
ullong_val = PyLong_AsUnsignedLongLong ( obj ) ;
python: improve conversion validation
Laszlo Ersek pointed out that in trying to convert a long to an
unsigned int, we used:
long long_val = ...;
if ((unsigned int)long_val == long_val)
According to C99 integer promotion rules, the if statement is
equivalent to:
(unsigned long)(unsigned int)long_val == (unsigned long)long_val
since you get an unsigned comparison if at least one side is
unsigned, using the largest rank of the two sides; but on 32-bit
platforms, where unsigned long and unsigned int are the same size,
this comparison is always true and ends up converting negative
long_val into posigive unsigned int values, rather than rejecting
the negative value as we had originally intended (python longs
are unbounded size, and we don't want to do silent modulo
arithmetic when converting to C code).
Fix this by using direct comparisons, rather than casting.
* python/typewrappers.c (libvirt_intUnwrap, libvirt_uintUnwrap)
(libvirt_ulongUnwrap, libvirt_ulonglongUnwrap): Fix conversion
checks.
2012-03-30 22:03:20 +04:00
} else {
2012-03-27 10:06:10 +04:00
PyErr_SetString ( PyExc_TypeError , " an integer is required " ) ;
python: improve conversion validation
Laszlo Ersek pointed out that in trying to convert a long to an
unsigned int, we used:
long long_val = ...;
if ((unsigned int)long_val == long_val)
According to C99 integer promotion rules, the if statement is
equivalent to:
(unsigned long)(unsigned int)long_val == (unsigned long)long_val
since you get an unsigned comparison if at least one side is
unsigned, using the largest rank of the two sides; but on 32-bit
platforms, where unsigned long and unsigned int are the same size,
this comparison is always true and ends up converting negative
long_val into posigive unsigned int values, rather than rejecting
the negative value as we had originally intended (python longs
are unbounded size, and we don't want to do silent modulo
arithmetic when converting to C code).
Fix this by using direct comparisons, rather than casting.
* python/typewrappers.c (libvirt_intUnwrap, libvirt_uintUnwrap)
(libvirt_ulongUnwrap, libvirt_ulonglongUnwrap): Fix conversion
checks.
2012-03-30 22:03:20 +04:00
}
2012-03-27 10:06:10 +04:00
2017-09-26 13:12:18 +03:00
if ( ( ullong_val = = ( unsigned long long ) - 1 ) & & PyErr_Occurred ( ) )
2012-03-27 10:06:10 +04:00
return - 1 ;
* val = ullong_val ;
return 0 ;
}
int
2015-09-29 17:37:13 +03:00
libvirt_doubleUnwrap ( PyObject * obj ,
double * val )
2012-03-27 10:06:10 +04:00
{
double double_val ;
2012-09-26 21:33:50 +04:00
if ( ! obj ) {
PyErr_SetString ( PyExc_TypeError , " unexpected type " ) ;
return - 1 ;
}
2012-03-27 10:06:10 +04:00
double_val = PyFloat_AsDouble ( obj ) ;
if ( ( double_val = = - 1 ) & & PyErr_Occurred ( ) )
return - 1 ;
* val = double_val ;
return 0 ;
}
int
2015-09-29 17:37:13 +03:00
libvirt_boolUnwrap ( PyObject * obj ,
bool * val )
2012-03-27 10:06:10 +04:00
{
int ret ;
2012-09-26 21:33:50 +04:00
if ( ! obj ) {
PyErr_SetString ( PyExc_TypeError , " unexpected type " ) ;
return - 1 ;
}
if ( ( ret = PyObject_IsTrue ( obj ) ) < 0 )
2012-03-27 10:06:10 +04:00
return ret ;
* val = ret > 0 ;
return 0 ;
}
2013-12-05 20:36:41 +04:00
int
2015-09-29 17:37:13 +03:00
libvirt_charPtrUnwrap ( PyObject * obj ,
char * * str )
2013-12-05 20:36:41 +04:00
{
2013-12-12 22:15:05 +04:00
PyObject * bytes ;
const char * ret ;
2013-12-05 20:36:41 +04:00
* str = NULL ;
if ( ! obj ) {
PyErr_SetString ( PyExc_TypeError , " unexpected type " ) ;
return - 1 ;
}
2013-12-12 22:15:05 +04:00
if ( ! ( bytes = PyUnicode_AsUTF8String ( obj ) ) )
2013-12-05 21:10:55 +04:00
return - 1 ;
2013-12-12 22:15:05 +04:00
ret = PyBytes_AsString ( bytes ) ;
2018-06-12 08:00:22 +03:00
if ( ret ) {
2013-12-12 22:15:05 +04:00
* str = strdup ( ret ) ;
2018-06-12 08:00:22 +03:00
if ( ! * str )
PyErr_NoMemory ( ) ;
}
2013-12-12 22:15:05 +04:00
Py_DECREF ( bytes ) ;
return ret & & * str ? 0 : - 1 ;
2013-12-05 20:36:41 +04:00
}
2015-09-29 17:37:13 +03:00
int
libvirt_charPtrSizeUnwrap ( PyObject * obj ,
char * * str ,
Py_ssize_t * size )
2013-12-09 18:53:34 +04:00
{
* str = NULL ;
* size = 0 ;
if ( ! obj ) {
PyErr_SetString ( PyExc_TypeError , " unexpected type " ) ;
return - 1 ;
}
2019-12-04 13:27:36 +03:00
return PyBytes_AsStringAndSize ( obj , str , size ) ;
2013-12-09 18:53:34 +04:00
}
2005-12-19 19:34:11 +03:00
PyObject *
2006-02-09 20:45:11 +03:00
libvirt_virDomainPtrWrap ( virDomainPtr node )
2005-12-19 19:34:11 +03:00
{
PyObject * ret ;
if ( node = = NULL ) {
2015-08-21 22:38:45 +03:00
return VIR_PY_NONE ;
2005-12-19 19:34:11 +03:00
}
2010-12-02 20:15:10 +03:00
ret = libvirt_buildPyObject ( node , " virDomainPtr " , NULL ) ;
2012-03-22 15:33:35 +04:00
return ret ;
2005-12-19 19:34:11 +03:00
}
2007-03-09 18:42:50 +03:00
PyObject *
libvirt_virNetworkPtrWrap ( virNetworkPtr node )
{
PyObject * ret ;
if ( node = = NULL ) {
2015-08-21 22:38:45 +03:00
return VIR_PY_NONE ;
2007-03-09 18:42:50 +03:00
}
2010-12-02 20:15:10 +03:00
ret = libvirt_buildPyObject ( node , " virNetworkPtr " , NULL ) ;
2012-03-22 15:33:35 +04:00
return ret ;
2007-03-09 18:42:50 +03:00
}
2019-06-18 14:08:32 +03:00
PyObject *
libvirt_virNetworkPortPtrWrap ( virNetworkPortPtr node )
{
PyObject * ret ;
if ( node = = NULL ) {
return VIR_PY_NONE ;
}
ret = libvirt_buildPyObject ( node , " virNetworkPortPtr " , NULL ) ;
return ret ;
}
2009-05-21 14:57:05 +04:00
PyObject *
libvirt_virInterfacePtrWrap ( virInterfacePtr node )
{
PyObject * ret ;
if ( node = = NULL ) {
2015-08-21 22:38:45 +03:00
return VIR_PY_NONE ;
2009-05-21 14:57:05 +04:00
}
2010-12-02 20:15:10 +03:00
ret = libvirt_buildPyObject ( node , " virInterfacePtr " , NULL ) ;
2012-03-22 15:33:35 +04:00
return ret ;
2009-05-21 14:57:05 +04:00
}
2008-02-20 18:26:22 +03:00
PyObject *
libvirt_virStoragePoolPtrWrap ( virStoragePoolPtr node )
{
PyObject * ret ;
if ( node = = NULL ) {
2015-08-21 22:38:45 +03:00
return VIR_PY_NONE ;
2008-02-20 18:26:22 +03:00
}
2010-12-02 20:15:10 +03:00
ret = libvirt_buildPyObject ( node , " virStoragePoolPtr " , NULL ) ;
2012-03-22 15:33:35 +04:00
return ret ;
2008-02-20 18:26:22 +03:00
}
PyObject *
libvirt_virStorageVolPtrWrap ( virStorageVolPtr node )
{
PyObject * ret ;
if ( node = = NULL ) {
2015-08-21 22:38:45 +03:00
return VIR_PY_NONE ;
2008-02-20 18:26:22 +03:00
}
2010-12-02 20:15:10 +03:00
ret = libvirt_buildPyObject ( node , " virStorageVolPtr " , NULL ) ;
2012-03-22 15:33:35 +04:00
return ret ;
2008-02-20 18:26:22 +03:00
}
2005-12-19 19:34:11 +03:00
PyObject *
2006-02-09 20:45:11 +03:00
libvirt_virConnectPtrWrap ( virConnectPtr node )
2005-12-19 19:34:11 +03:00
{
PyObject * ret ;
if ( node = = NULL ) {
2015-08-21 22:38:45 +03:00
return VIR_PY_NONE ;
2005-12-19 19:34:11 +03:00
}
2010-12-02 20:15:10 +03:00
ret = libvirt_buildPyObject ( node , " virConnectPtr " , NULL ) ;
2012-03-22 15:33:35 +04:00
return ret ;
2005-12-19 19:34:11 +03:00
}
2008-10-31 13:13:45 +03:00
2008-11-21 15:41:15 +03:00
PyObject *
libvirt_virNodeDevicePtrWrap ( virNodeDevicePtr node )
{
PyObject * ret ;
if ( node = = NULL ) {
2015-08-21 22:38:45 +03:00
return VIR_PY_NONE ;
2008-11-21 15:41:15 +03:00
}
2010-12-02 20:15:10 +03:00
ret = libvirt_buildPyObject ( node , " virNodeDevicePtr " , NULL ) ;
2012-03-22 15:33:35 +04:00
return ret ;
2008-11-21 15:41:15 +03:00
}
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 22:38:21 +04:00
PyObject *
libvirt_virSecretPtrWrap ( virSecretPtr node )
{
PyObject * ret ;
if ( node = = NULL ) {
2015-08-21 22:38:45 +03:00
return VIR_PY_NONE ;
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 22:38:21 +04:00
}
2010-12-02 20:15:10 +03:00
ret = libvirt_buildPyObject ( node , " virSecretPtr " , NULL ) ;
2012-03-22 15:33:35 +04:00
return ret ;
2010-04-29 14:46:01 +04:00
}
PyObject *
libvirt_virNWFilterPtrWrap ( virNWFilterPtr node )
{
PyObject * ret ;
if ( node = = NULL ) {
2015-08-21 22:38:45 +03:00
return VIR_PY_NONE ;
2010-04-29 14:46:01 +04:00
}
2010-12-02 20:15:10 +03:00
ret = libvirt_buildPyObject ( node , " virNWFilterPtr " , NULL ) ;
2012-03-22 15:33:35 +04:00
return ret ;
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 22:38:21 +04:00
}
2018-06-26 13:18:32 +03:00
PyObject *
libvirt_virNWFilterBindingPtrWrap ( virNWFilterBindingPtr node )
{
PyObject * ret ;
if ( node = = NULL ) {
return VIR_PY_NONE ;
}
ret = libvirt_buildPyObject ( node , " virNWFilterBindingPtr " , NULL ) ;
return ret ;
}
2009-07-10 15:18:12 +04:00
PyObject *
libvirt_virStreamPtrWrap ( virStreamPtr node )
{
PyObject * ret ;
if ( node = = NULL ) {
2015-08-21 22:38:45 +03:00
return VIR_PY_NONE ;
2009-07-10 15:18:12 +04:00
}
2010-12-02 20:15:10 +03:00
ret = libvirt_buildPyObject ( node , " virStreamPtr " , NULL ) ;
2012-03-22 15:33:35 +04:00
return ret ;
2009-07-10 15:18:12 +04:00
}
2019-02-08 01:36:16 +03:00
PyObject *
libvirt_virDomainCheckpointPtrWrap ( virDomainCheckpointPtr node )
{
PyObject * ret ;
if ( node = = NULL ) {
return VIR_PY_NONE ;
}
ret = libvirt_buildPyObject ( node , " virDomainCheckpointPtr " , NULL ) ;
return ret ;
}
2010-04-01 00:33:13 +04:00
PyObject *
libvirt_virDomainSnapshotPtrWrap ( virDomainSnapshotPtr node )
{
PyObject * ret ;
if ( node = = NULL ) {
2015-08-21 22:38:45 +03:00
return VIR_PY_NONE ;
2010-04-01 00:33:13 +04:00
}
2010-12-02 20:15:10 +03:00
ret = libvirt_buildPyObject ( node , " virDomainSnapshotPtr " , NULL ) ;
2012-03-22 15:33:35 +04:00
return ret ;
2010-04-01 00:33:13 +04:00
}
2008-10-31 13:13:45 +03:00
PyObject *
libvirt_virEventHandleCallbackWrap ( virEventHandleCallback node )
{
PyObject * ret ;
if ( node = = NULL ) {
2008-12-18 15:25:11 +03:00
printf ( " %s: WARNING - Wrapping None \n " , __func__ ) ;
2015-08-21 22:38:45 +03:00
return VIR_PY_NONE ;
2008-10-31 13:13:45 +03:00
}
2010-12-02 20:15:10 +03:00
ret = libvirt_buildPyObject ( node , " virEventHandleCallback " , NULL ) ;
2012-03-22 15:33:35 +04:00
return ret ;
2008-10-31 13:13:45 +03:00
}
PyObject *
libvirt_virEventTimeoutCallbackWrap ( virEventTimeoutCallback node )
{
PyObject * ret ;
if ( node = = NULL ) {
2008-12-18 15:25:11 +03:00
printf ( " %s: WARNING - Wrapping None \n " , __func__ ) ;
2015-08-21 22:38:45 +03:00
return VIR_PY_NONE ;
2008-10-31 13:13:45 +03:00
}
2010-12-02 20:15:10 +03:00
ret = libvirt_buildPyObject ( node , " virEventTimeoutCallback " , NULL ) ;
2012-03-22 15:33:35 +04:00
return ret ;
2008-10-31 13:13:45 +03:00
}
2008-11-19 19:24:01 +03:00
PyObject *
libvirt_virFreeCallbackWrap ( virFreeCallback node )
{
PyObject * ret ;
if ( node = = NULL ) {
2015-08-21 22:38:45 +03:00
return VIR_PY_NONE ;
2008-11-19 19:24:01 +03:00
}
2010-12-02 20:15:10 +03:00
ret = libvirt_buildPyObject ( node , " virFreeCallback " , NULL ) ;
2012-03-22 15:33:35 +04:00
return ret ;
2008-11-19 19:24:01 +03:00
}
2008-10-31 13:13:45 +03:00
PyObject *
libvirt_virVoidPtrWrap ( void * node )
{
PyObject * ret ;
if ( node = = NULL ) {
2015-08-21 22:38:45 +03:00
return VIR_PY_NONE ;
2008-10-31 13:13:45 +03:00
}
2010-12-02 20:15:10 +03:00
ret = libvirt_buildPyObject ( node , " void* " , NULL ) ;
2012-03-22 15:33:35 +04:00
return ret ;
2008-10-31 13:13:45 +03:00
}