From: Daniel P. Berrange Date: Wed, 16 Sep 2009 13:03:53 +0000 (+0100) Subject: Re-arrange python generator to make it clear what's auto-generated X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=f991a006530100feb713b2d0554ee7664a36f5bc;p=libvirt.git Re-arrange python generator to make it clear what's auto-generated * README: New file describing what each file is used for * livvirt-override.c, libvirt-override.py, libvirt-override-api.xml, libvirt-override-virConnect.py: Manually written code overriding the generator * typewrappers.c, typewrappers.h: Data type wrappers * generator.py: Automatically pre-prend contents of libvirt-override.py to generated libvirt.py. Output into libvirt.py directly instead of libvirtclass.py. Don't generate libvirtclass.txt at all. Write C files into libvirt.c/.h directly * Makefile.am: Remove rule for creating libvirt.py from libvirt-override.py and libvirtclass.py, since generator.py does it directly --- diff --git a/python/.gitignore b/python/.gitignore index db6c706796..c191f74206 100644 --- a/python/.gitignore +++ b/python/.gitignore @@ -7,9 +7,7 @@ Makefile.in *.loT libvirt.py libvirt-export.c -libvirtclass.txt -libvirt-py.[ch] -libvirtclass.py -gen_prog +libvirt.c +libvirt.h *.pyc generated.stamp diff --git a/python/Makefile.am b/python/Makefile.am index a7c342e7cf..95ae84d2e4 100644 --- a/python/Makefile.am +++ b/python/Makefile.am @@ -13,16 +13,15 @@ DOCS_DIR = $(datadir)/doc/libvirt-python-$(LIBVIRT_VERSION) DOCS = ${srcdir}/TODO -CLASSES_EXTRA = virConnect.py - -EXTRA_DIST = \ - libvir.c \ - types.c \ - generator.py \ - libvirt_wrap.h \ - libvirt.py \ - libvir.py \ - libvirt-python-api.xml \ +CLASSES_EXTRA = libvirt-override-virConnect.py + +EXTRA_DIST = \ + generator.py \ + typewrappers.c \ + typewrappers.h \ + libvirt-override.c \ + libvirt-override.py \ + libvirt-override-api.xml \ $(CLASSES_EXTRA) \ $(DOCS) @@ -33,7 +32,7 @@ all-local: libvirt.py python_LTLIBRARIES = libvirtmod.la -libvirtmod_la_SOURCES = libvir.c types.c libvirt-py.c libvirt-py.h +libvirtmod_la_SOURCES = libvirt-override.c typewrappers.c libvirt.c libvirt.h # Python <= 2.4 header files contain a redundant decl, hence we # need extra flags here libvirtmod_la_CFLAGS = @WARN_PYTHON_CFLAGS@ @@ -44,12 +43,11 @@ libvirtmod_la_LIBADD = $(mylibs) \ @CYGWIN_EXTRA_LIBADD@ @CYGWIN_EXTRA_PYTHON_LIBADD@ GENERATE = generator.py -API_DESC = $(top_srcdir)/docs/libvirt-api.xml $(srcdir)/libvirt-python-api.xml +API_DESC = $(top_srcdir)/docs/libvirt-api.xml $(srcdir)/libvirt-override-api.xml GENERATED= libvirt-export.c \ - libvirtclass.txt \ - libvirt-py.c \ - libvirt-py.h \ - libvirtclass.py + libvirt.c \ + libvirt.h \ + libvirt.py generated.stamp: $(srcdir)/$(GENERATE) $(API_DESC) $(PYTHON) $(srcdir)/$(GENERATE) $(srcdir) @@ -57,10 +55,6 @@ generated.stamp: $(srcdir)/$(GENERATE) $(API_DESC) $(GENERATED): generated.stamp -libvirt.py: $(srcdir)/libvir.py $(GENERATED) $(CLASSES_EXTRA) - cat $(srcdir)/libvir.py libvirtclass.py > $@-t - mv $@-t $@ - $(libvirtmod_la_OBJECTS): $(GENERATED) install-data-local: @@ -73,7 +67,7 @@ install-data-local: uninstall-local: rm -f $(DESTDIR)$(pythondir)/libvirt.py -CLEANFILES= $(GENERATED) generated.stamp libvirt.py +CLEANFILES= $(GENERATED) generated.stamp else all: diff --git a/python/README b/python/README new file mode 100644 index 0000000000..02d4cc4075 --- /dev/null +++ b/python/README @@ -0,0 +1,27 @@ + libvirt Python Bindings README + ============================== + +Most of the libvirt python binding code is automatically generated +using the script generator.py, and the API description from +docs/libvirt-api.xml + + +Manually written files: + + - libvirt-override.c: methods where the C binding needs to be hand crafted + - libvirt-override.py: global methods where the C and python bindings have different args + - libvirt-override-api.xml: methods where the auto-extracted API docs are not + suitable for python auto-generator. Overriding this if the method is going + into libvirt-override.c, but we still want auto-generated libvirt-override.py + - libvirt-override-virConnect.py: virConnect class methods + - typewrappers.h,.c: Python object wrappers for each libvirt C object + + +Auto-generated files: + + - libvirt.py: The main python binding. Comprises auto-generated code, along + with contents from libvirt-override.py and libvirt-override-virConnect.py + - libvirt.c, libvirt.h: The C glue layer for the python binding. Comprises + auto-generated code, along with libvirt-override.c + - libvirt-export.c: List of auto-generated C methods, included into + the libvirt-override.c method table diff --git a/python/generator.py b/python/generator.py index ad9c54423b..c34cb34702 100755 --- a/python/generator.py +++ b/python/generator.py @@ -287,8 +287,8 @@ foreign_encoding_args = ( ####################################################################### # -# This part writes the C <-> Python stubs libvirt2-py.[ch] and -# the table libxml2-export.c to add when registrering the Python module +# This part writes the C <-> Python stubs libvirt.[ch] and +# the table libvirt-export.c to add when registrering the Python module # ####################################################################### @@ -555,7 +555,7 @@ def buildStubs(): py_types['pythonObject'] = ('O', "pythonObject", "pythonObject", "pythonObject") try: - f = open(os.path.join(srcPref,"libvirt-python-api.xml")) + f = open(os.path.join(srcPref,"libvirt-override-api.xml")) data = f.read() (parser, target) = getparser() parser.feed(data) @@ -564,22 +564,22 @@ def buildStubs(): print file, ":", msg - print "Found %d functions in libvirt-python-api.xml" % ( + print "Found %d functions in libvirt-override-api.xml" % ( len(functions.keys()) - n) nb_wrap = 0 failed = 0 skipped = 0 - include = open("libvirt-py.h", "w") + include = open("libvirt.h", "w") include.write("/* Generated */\n\n") export = open("libvirt-export.c", "w") export.write("/* Generated */\n\n") - wrapper = open("libvirt-py.c", "w") + wrapper = open("libvirt.c", "w") wrapper.write("/* Generated */\n\n") wrapper.write("#include \n") wrapper.write("#include \n") - wrapper.write("#include \"libvirt_wrap.h\"\n") - wrapper.write("#include \"libvirt-py.h\"\n\n") + wrapper.write("#include \"typewrappers.h\"\n") + wrapper.write("#include \"libvirt.h\"\n\n") for function in functions.keys(): ret = print_function_wrapper(function, wrapper, export, include) if ret < 0: @@ -931,12 +931,30 @@ def buildWrappers(): info = (0, func, name, ret, args, file) function_classes['None'].append(info) - classes = open("libvirtclass.py", "w") + classes = open("libvirt.py", "w") + + extra = open(os.path.join(srcPref,"libvirt-override.py"), "r") + classes.write("#!/usr/bin/python -i\n") + classes.write("#\n") + classes.write("# WARNING WARNING WARNING WARNING\n") + classes.write("#\n") + classes.write("# This file is automatically written by generator.py. Any changes\n") + classes.write("# made here will be lost.\n") + classes.write("#\n") + classes.write("# To change the manually written methods edit libvirt-override.py\n") + classes.write("# To change the automatically written methods edit generator.py\n") + classes.write("#\n") + classes.write("# WARNING WARNING WARNING WARNING\n") + classes.write("#\n") + classes.writelines(extra.readlines()) + classes.write("#\n") + classes.write("# WARNING WARNING WARNING WARNING\n") + classes.write("#\n") + classes.write("# Automatically written part of python bindings for libvirt\n") + classes.write("#\n") + classes.write("# WARNING WARNING WARNING WARNING\n") + extra.close() - txt = open("libvirtclass.txt", "w") - txt.write(" Generated Classes for libvir-python\n\n") - - txt.write("#\n# Global functions of the module\n#\n\n") if function_classes.has_key("None"): flist = function_classes["None"] flist.sort(functionCompare) @@ -945,10 +963,8 @@ def buildWrappers(): (index, func, name, ret, args, file) = info if file != oldfile: classes.write("#\n# Functions from module %s\n#\n\n" % file) - txt.write("\n# functions from module %s\n" % file) oldfile = file classes.write("def %s(" % func) - txt.write("%s()\n" % func); n = 0 for arg in args: if n != 0: @@ -1025,14 +1041,11 @@ def buildWrappers(): classes.write("\n"); - txt.write("\n\n#\n# Set of classes of the module\n#\n\n") for classname in classes_list: if classname == "None": pass else: if classes_ancestor.has_key(classname): - txt.write("\n\nClass %s(%s)\n" % (classname, - classes_ancestor[classname])) classes.write("class %s(%s):\n" % (classname, classes_ancestor[classname])) classes.write(" def __init__(self, _obj=None):\n") @@ -1044,7 +1057,6 @@ def buildWrappers(): classes.write(" %s.__init__(self, _obj=_obj)\n\n" % ( classes_ancestor[classname])) else: - txt.write("Class %s()\n" % (classname)) classes.write("class %s:\n" % (classname)) if classname in [ "virDomain", "virNetwork", "virInterface", "virStoragePool", "virStorageVol", "virNodeDevice", "virSecret" ]: classes.write(" def __init__(self, conn, _obj=None):\n") @@ -1084,16 +1096,13 @@ def buildWrappers(): if file != oldfile: if file == "python_accessor": classes.write(" # accessors for %s\n" % (classname)) - txt.write(" # accessors\n") else: classes.write(" #\n") classes.write(" # %s functions from module %s\n" % ( classname, file)) - txt.write("\n # functions from module %s\n" % file) classes.write(" #\n\n") oldfile = file classes.write(" def %s(self" % func) - txt.write(" %s()\n" % func); n = 0 for arg in args: if n != index: @@ -1316,7 +1325,7 @@ def buildWrappers(): classes.write("\n"); # Append ".py" to class def, iff it exists try: - extra = open(classname + ".py", "r") + extra = open(os.path.join(srcPref,"libvirt-override-" + classname + ".py"), "r") classes.write (" #\n") classes.write (" # %s methods from %s.py (hand coded)\n" % (classname,classname)) classes.write (" #\n") @@ -1336,15 +1345,6 @@ def buildWrappers(): classes.write("%s = %s\n" % (name,value)) classes.write("\n"); - if len(functions_skipped) != 0: - txt.write("\nFunctions skipped:\n") - for function in functions_skipped: - txt.write(" %s\n" % function) - if len(functions_failed) != 0: - txt.write("\nFunctions failed:\n") - for function in functions_failed: - txt.write(" %s\n" % function) - txt.close() classes.close() if buildStubs() < 0: diff --git a/python/libvir.c b/python/libvir.c deleted file mode 100644 index d4f1eb2bf2..0000000000 --- a/python/libvir.c +++ /dev/null @@ -1,2471 +0,0 @@ -/* - * libvir.c: this modules implements the main part of the glue of the - * libvir library and the Python interpreter. It provides the - * entry points where an automatically generated stub is - * unpractical - * - * Copyright (C) 2005, 2007-2009 Red Hat, Inc. - * - * Daniel Veillard - */ - -#include - -/* Horrible kludge to work around even more horrible name-space pollution - via Python.h. That file includes /usr/include/python2.5/pyconfig*.h, - which has over 180 autoconf-style HAVE_* definitions. Shame on them. */ -#undef HAVE_PTHREAD_H - -#include -#include "libvirt/libvirt.h" -#include "libvirt/virterror.h" -#include "libvirt_wrap.h" -#include "libvirt-py.h" - -#ifndef __CYGWIN__ -extern void initlibvirtmod(void); -#else -extern void initcygvirtmod(void); -#endif - -/* The two-statement sequence "Py_INCREF(Py_None); return Py_None;" - is so common that we encapsulate it here. Now, each use is simply - return VIR_PY_NONE; */ -#define VIR_PY_NONE (Py_INCREF (Py_None), Py_None) -#define VIR_PY_INT_FAIL (libvirt_intWrap(-1)) -#define VIR_PY_INT_SUCCESS (libvirt_intWrap(0)) - -static char *py_str(PyObject *obj) -{ - PyObject *str = PyObject_Str(obj); - if (!str) { - PyErr_Print(); - PyErr_Clear(); - return NULL; - }; - return PyString_AsString(str); -} - - -/************************************************************************ - * * - * Statistics * - * * - ************************************************************************/ - -static PyObject * -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)) - return(NULL); - domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); - - c_retval = virDomainBlockStats(domain, path, &stats, sizeof(stats)); - if (c_retval < 0) - return VIR_PY_NONE; - - /* convert to a Python tuple of long objects */ - if ((info = PyTuple_New(5)) == NULL) - return VIR_PY_NONE; - 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); -} - -static PyObject * -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)) - return(NULL); - domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); - - c_retval = virDomainInterfaceStats(domain, path, &stats, sizeof(stats)); - if (c_retval < 0) - return VIR_PY_NONE; - - /* convert to a Python tuple of long objects */ - if ((info = PyTuple_New(8)) == NULL) - return VIR_PY_NONE; - 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); -} - - -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); - - c_retval = virDomainGetSchedulerType(domain, &nparams); - if (c_retval == NULL) - return VIR_PY_NONE; - - /* convert to a Python tuple of long objects */ - 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; - int nparams, i; - virSchedParameterPtr params; - - if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetScedulerParameters", - &pyobj_domain)) - return(NULL); - domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); - - c_retval = virDomainGetSchedulerType(domain, &nparams); - if (c_retval == NULL) - return VIR_PY_NONE; - free(c_retval); - - if ((params = malloc(sizeof(*params)*nparams)) == NULL) - return VIR_PY_NONE; - - if (virDomainGetSchedulerParameters(domain, params, &nparams) < 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_DOMAIN_SCHED_FIELD_INT: - val = PyInt_FromLong((long)params[i].value.i); - break; - - case VIR_DOMAIN_SCHED_FIELD_UINT: - val = PyInt_FromLong((long)params[i].value.ui); - break; - - case VIR_DOMAIN_SCHED_FIELD_LLONG: - val = PyLong_FromLongLong((long long)params[i].value.l); - break; - - case VIR_DOMAIN_SCHED_FIELD_ULLONG: - val = PyLong_FromLongLong((long long)params[i].value.ul); - break; - - case VIR_DOMAIN_SCHED_FIELD_DOUBLE: - val = PyFloat_FromDouble((double)params[i].value.d); - break; - - case VIR_DOMAIN_SCHED_FIELD_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); -} - -static PyObject * -libvirt_virDomainSetSchedulerParameters(PyObject *self ATTRIBUTE_UNUSED, - PyObject *args) { - virDomainPtr domain; - PyObject *pyobj_domain, *info; - char *c_retval; - int nparams, i; - virSchedParameterPtr params; - - if (!PyArg_ParseTuple(args, (char *)"OO:virDomainSetScedulerParameters", - &pyobj_domain, &info)) - return(NULL); - domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); - - c_retval = virDomainGetSchedulerType(domain, &nparams); - if (c_retval == NULL) - return VIR_PY_INT_FAIL; - free(c_retval); - - if ((params = malloc(sizeof(*params)*nparams)) == NULL) - return VIR_PY_INT_FAIL; - - if (virDomainGetSchedulerParameters(domain, params, &nparams) < 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_DOMAIN_SCHED_FIELD_INT: - params[i].value.i = (int)PyInt_AS_LONG(val); - break; - - case VIR_DOMAIN_SCHED_FIELD_UINT: - params[i].value.ui = (unsigned int)PyInt_AS_LONG(val); - break; - - case VIR_DOMAIN_SCHED_FIELD_LLONG: - params[i].value.l = (long long)PyLong_AsLongLong(val); - break; - - case VIR_DOMAIN_SCHED_FIELD_ULLONG: - params[i].value.ul = (unsigned long long)PyLong_AsLongLong(val); - break; - - case VIR_DOMAIN_SCHED_FIELD_DOUBLE: - params[i].value.d = (double)PyFloat_AsDouble(val); - break; - - case VIR_DOMAIN_SCHED_FIELD_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; - } - } - - if (virDomainSetSchedulerParameters(domain, params, nparams) < 0) { - free(params); - return VIR_PY_INT_FAIL; - } - - free(params); - return VIR_PY_INT_SUCCESS; -} - -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; - int cpumaplen, i; - - if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetVcpus", - &pyobj_domain)) - return(NULL); - domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); - - if (virNodeGetInfo(virDomainGetConnect(domain), &nodeinfo) != 0) - return VIR_PY_NONE; - - if (virDomainGetInfo(domain, &dominfo) != 0) - 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; - - if (virDomainGetVcpus(domain, - cpuinfo, dominfo.nrVirtCpu, - cpumap, cpumaplen) < 0) - goto cleanup; - - /* convert to a Python tuple of long objects */ - 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; - - if (!PyArg_ParseTuple(args, (char *)"OiO:virDomainPinVcpu", - &pyobj_domain, &vcpu, &pycpumap)) - return(NULL); - domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); - - if (virNodeGetInfo(virDomainGetConnect(domain), &nodeinfo) != 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); - } - - virDomainPinVcpu(domain, vcpu, cpumap, cpumaplen); - Py_DECREF(truth); - free(cpumap); - - return VIR_PY_INT_SUCCESS; -} - - -/************************************************************************ - * * - * Global error handler at the Python level * - * * - ************************************************************************/ - -static PyObject *libvirt_virPythonErrorFuncHandler = NULL; -static PyObject *libvirt_virPythonErrorFuncCtxt = NULL; - -static PyObject * -libvirt_virGetLastError(PyObject *self ATTRIBUTE_UNUSED, PyObject *args ATTRIBUTE_UNUSED) -{ - virError *err; - PyObject *info; - - if ((err = virGetLastError()) == NULL) - return VIR_PY_NONE; - - if ((info = PyTuple_New(9)) == NULL) - return VIR_PY_NONE; - 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)); - - return info; -} - -static PyObject * -libvirt_virConnGetLastError(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) -{ - virError *err; - PyObject *info; - virConnectPtr conn; - PyObject *pyobj_conn; - - if (!PyArg_ParseTuple(args, (char *)"O:virConGetLastError", &pyobj_conn)) - return(NULL); - conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); - - if ((err = virConnGetLastError(conn)) == NULL) - return VIR_PY_NONE; - - if ((info = PyTuple_New(9)) == NULL) - return VIR_PY_NONE; - 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)); - - return info; -} - -static void -libvirt_virErrorFuncHandler(ATTRIBUTE_UNUSED void *ctx, virErrorPtr err) -{ - PyObject *list, *info; - PyObject *result; - -#ifdef DEBUG_ERROR - printf("libvirt_virErrorFuncHandler(%p, %s, ...) called\n", ctx, - err->message); -#endif - - if ((err == NULL) || (err->code == VIR_ERR_OK)) - return; - - LIBVIRT_ENSURE_THREAD_STATE; - - 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)); - 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)); - /* TODO pass conn and dom if available */ - result = PyEval_CallObject(libvirt_virPythonErrorFuncHandler, list); - Py_XDECREF(list); - Py_XDECREF(result); - } - - LIBVIRT_RELEASE_THREAD_STATE; -} - -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); - -#ifdef DEBUG_ERROR - printf("libvirt_virRegisterErrorHandler(%p, %p) called\n", pyobj_ctx, - pyobj_f); -#endif - - 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; - libvirt_virPythonErrorFuncCtxt = NULL; - } else { - Py_XINCREF(pyobj_ctx); - Py_XINCREF(pyobj_f); - - /* TODO: check f is a function ! */ - libvirt_virPythonErrorFuncHandler = pyobj_f; - libvirt_virPythonErrorFuncCtxt = pyobj_ctx; - } - - py_retval = libvirt_intWrap(1); - return (py_retval); -} - -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; - int flags; - 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; - auth.credtype = malloc(sizeof(*auth.credtype) * auth.ncredtype); - if (auth.credtype == NULL) - return VIR_PY_NONE; - 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; - py_retval = libvirt_virConnectPtrWrap((virConnectPtr) c_retval); - return(py_retval); -} - - -/************************************************************************ - * * - * Wrappers for functions where generator fails * - * * - ************************************************************************/ - -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; - - if (c_retval == -1) - return VIR_PY_NONE; - - if (type == NULL) - return PyInt_FromLong (libVer); - else - return Py_BuildValue ((char *) "kk", libVer, typeVer); -} - - -static PyObject * -libvirt_virConnectListDomainsID(PyObject *self ATTRIBUTE_UNUSED, - PyObject *args) { - PyObject *py_retval; - int ids[500], c_retval, i; - virConnectPtr conn; - PyObject *pyobj_conn; - - - if (!PyArg_ParseTuple(args, (char *)"O:virConnectListDomains", &pyobj_conn)) - return(NULL); - conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); - - LIBVIRT_BEGIN_ALLOW_THREADS; - c_retval = virConnectListDomains(conn, &ids[0], 500); - LIBVIRT_END_ALLOW_THREADS; - if (c_retval < 0) - return VIR_PY_NONE; - py_retval = PyList_New(c_retval); - for (i = 0;i < c_retval;i++) { - PyList_SetItem(py_retval, i, libvirt_intWrap(ids[i])); - } - return(py_retval); -} - -static PyObject * -libvirt_virConnectListDefinedDomains(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:virConnectListDefinedDomains", &pyobj_conn)) - return(NULL); - conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); - - c_retval = virConnectNumOfDefinedDomains(conn); - if (c_retval < 0) - return VIR_PY_NONE; - - if (c_retval) { - names = malloc(sizeof(*names) * c_retval); - if (!names) - return VIR_PY_NONE; - c_retval = virConnectListDefinedDomains(conn, names, c_retval); - 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_virDomainGetInfo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { - 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); - - LIBVIRT_BEGIN_ALLOW_THREADS; - c_retval = virDomainGetInfo(domain, &info); - LIBVIRT_END_ALLOW_THREADS; - if (c_retval < 0) - return VIR_PY_NONE; - py_retval = PyList_New(5); - PyList_SetItem(py_retval, 0, libvirt_intWrap((int) info.state)); - PyList_SetItem(py_retval, 1, libvirt_ulongWrap(info.maxMem)); - PyList_SetItem(py_retval, 2, libvirt_ulongWrap(info.memory)); - PyList_SetItem(py_retval, 3, libvirt_intWrap((int) info.nrVirtCpu)); - PyList_SetItem(py_retval, 4, - libvirt_longlongWrap((unsigned long long) info.cpuTime)); - return(py_retval); -} - -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); - - LIBVIRT_BEGIN_ALLOW_THREADS; - c_retval = virNodeGetInfo(conn, &info); - LIBVIRT_END_ALLOW_THREADS; - if (c_retval < 0) - return VIR_PY_NONE; - py_retval = PyList_New(8); - PyList_SetItem(py_retval, 0, libvirt_constcharPtrWrap(&info.model[0])); - PyList_SetItem(py_retval, 1, libvirt_longWrap((long) info.memory >> 10)); - 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); -} - -static PyObject * -libvirt_virDomainGetUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { - PyObject *py_retval; - unsigned char uuid[VIR_UUID_BUFLEN]; - virDomainPtr domain; - PyObject *pyobj_domain; - int c_retval; - - if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetUUID", &pyobj_domain)) - return(NULL); - domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); - - if (domain == NULL) - return VIR_PY_NONE; - LIBVIRT_BEGIN_ALLOW_THREADS; - c_retval = virDomainGetUUID(domain, &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_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); -} - -static PyObject * -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); - - if ((uuid == NULL) || (len != VIR_UUID_BUFLEN)) - return VIR_PY_NONE; - - LIBVIRT_BEGIN_ALLOW_THREADS; - c_retval = virDomainLookupByUUID(conn, uuid); - LIBVIRT_END_ALLOW_THREADS; - py_retval = libvirt_virDomainPtrWrap((virDomainPtr) c_retval); - return(py_retval); -} - - -static PyObject * -libvirt_virConnectListNetworks(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:virConnectListNetworks", &pyobj_conn)) - return(NULL); - conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); - - c_retval = virConnectNumOfNetworks(conn); - if (c_retval < 0) - return VIR_PY_NONE; - - if (c_retval) { - names = malloc(sizeof(*names) * c_retval); - if (!names) - return VIR_PY_NONE; - c_retval = virConnectListNetworks(conn, names, c_retval); - 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_virConnectListDefinedNetworks(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:virConnectListDefinedNetworks", &pyobj_conn)) - return(NULL); - conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); - - c_retval = virConnectNumOfDefinedNetworks(conn); - if (c_retval < 0) - return VIR_PY_NONE; - - if (c_retval) { - names = malloc(sizeof(*names) * c_retval); - if (!names) - return VIR_PY_NONE; - c_retval = virConnectListDefinedNetworks(conn, names, c_retval); - 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_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); - - if (domain == NULL) - return VIR_PY_NONE; - LIBVIRT_BEGIN_ALLOW_THREADS; - c_retval = virNetworkGetUUID(domain, &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_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); -} - -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); - - if ((uuid == NULL) || (len != VIR_UUID_BUFLEN)) - return VIR_PY_NONE; - - LIBVIRT_BEGIN_ALLOW_THREADS; - c_retval = virNetworkLookupByUUID(conn, uuid); - LIBVIRT_END_ALLOW_THREADS; - py_retval = libvirt_virNetworkPtrWrap((virNetworkPtr) c_retval); - return(py_retval); -} - - -static PyObject * -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; - - if (c_retval < 0) - return VIR_PY_INT_FAIL; - py_retval = libvirt_intWrap(autostart); - return(py_retval); -} - - -static PyObject * -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; - - if (c_retval < 0) - return VIR_PY_INT_FAIL; - py_retval = libvirt_intWrap(autostart); - return(py_retval); -} - -static PyObject * -libvirt_virNodeGetCellsFreeMemory(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) -{ - 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); - - if ((startCell < 0) || (maxCells <= 0) || (startCell + maxCells > 10000)) - goto error; - - conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); - freeMems = - malloc(maxCells * sizeof(*freeMems)); - if (freeMems == NULL) - goto error; - - LIBVIRT_BEGIN_ALLOW_THREADS; - c_retval = virNodeGetCellsFreeMemory(conn, freeMems, startCell, maxCells); - LIBVIRT_END_ALLOW_THREADS; - - if (c_retval < 0) { - free(freeMems); -error: - return VIR_PY_NONE; - } - py_retval = PyList_New(c_retval); - for (i = 0;i < c_retval;i++) { - PyList_SetItem(py_retval, i, - libvirt_longlongWrap((long long) freeMems[i])); - } - free(freeMems); - return(py_retval); -} - - -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); - - c_retval = virConnectNumOfStoragePools(conn); - if (c_retval < 0) - return VIR_PY_NONE; - - if (c_retval) { - names = malloc(sizeof(*names) * c_retval); - if (!names) - return VIR_PY_NONE; - c_retval = virConnectListStoragePools(conn, names, c_retval); - 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); - - c_retval = virConnectNumOfDefinedStoragePools(conn); - if (c_retval < 0) - return VIR_PY_NONE; - - if (c_retval) { - names = malloc(sizeof(*names) * c_retval); - if (!names) - return VIR_PY_NONE; - c_retval = virConnectListDefinedStoragePools(conn, names, c_retval); - 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); - - c_retval = virStoragePoolNumOfVolumes(pool); - if (c_retval < 0) - return VIR_PY_NONE; - - if (c_retval) { - names = malloc(sizeof(*names) * c_retval); - if (!names) - return VIR_PY_NONE; - c_retval = virStoragePoolListVolumes(pool, names, c_retval); - 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); -} - -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); -} - -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); -} - -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); - - c_retval = virNodeNumOfDevices(conn, cap, flags); - if (c_retval < 0) - return VIR_PY_NONE; - - if (c_retval) { - names = malloc(sizeof(*names) * c_retval); - if (!names) - return VIR_PY_NONE; - c_retval = virNodeListDevices(conn, cap, names, c_retval, flags); - 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); - - c_retval = virNodeDeviceNumOfCaps(dev); - if (c_retval < 0) - return VIR_PY_NONE; - - if (c_retval) { - names = malloc(sizeof(*names) * c_retval); - if (!names) - return VIR_PY_NONE; - c_retval = virNodeDeviceListCaps(dev, names, c_retval); - 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_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); -} - - -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; -} - -/******************************************* - * 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; - -static PyObject * -getLibvirtModuleObject (void) { - if(libvirt_module) - return libvirt_module; - - // PyImport_ImportModule returns a new reference - /* Bogus (char *) cast for RHEL-5 python API brokenness */ - libvirt_module = PyImport_ImportModule((char *)"libvirt"); - if(!libvirt_module) { -#if DEBUG_ERROR - printf("%s Error importing libvirt module\n", __FUNCTION__); -#endif - 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) { -#if DEBUG_ERROR - printf("%s Error importing libvirt dictionary\n", __FUNCTION__); -#endif - 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) { -#if DEBUG_ERROR - printf("%s Error importing virDomain class\n", __FUNCTION__); -#endif - PyErr_Print(); - return NULL; - } - - Py_INCREF(libvirt_dom_class); - return libvirt_dom_class; -} -/******************************************* - * Domain Events - *******************************************/ - -static int -libvirt_virConnectDomainEventCallback(virConnectPtr conn ATTRIBUTE_UNUSED, - virDomainPtr dom, - int event, - int detail, - void *opaque) -{ - PyObject *pyobj_ret; - - PyObject *pyobj_conn_inst = (PyObject*)opaque; - PyObject *pyobj_dom; - - PyObject *pyobj_dom_args; - PyObject *pyobj_dom_inst; - - PyObject *dom_class; - int ret = -1; - - LIBVIRT_ENSURE_THREAD_STATE; - - /* Create a python instance of this virDomainPtr */ - virDomainRef(dom); - pyobj_dom = libvirt_virDomainPtrWrap(dom); - pyobj_dom_args = PyTuple_New(2); - if(PyTuple_SetItem(pyobj_dom_args, 0, pyobj_conn_inst)!=0) { -#if DEBUG_ERROR - printf("%s error creating tuple",__FUNCTION__); -#endif - goto cleanup; - } - if(PyTuple_SetItem(pyobj_dom_args, 1, pyobj_dom)!=0) { -#if DEBUG_ERROR - printf("%s error creating tuple",__FUNCTION__); -#endif - goto cleanup; - } - Py_INCREF(pyobj_conn_inst); - - dom_class = getLibvirtDomainClassObject(); - if(!PyClass_Check(dom_class)) { -#if DEBUG_ERROR - printf("%s dom_class is not a class!\n", __FUNCTION__); -#endif - goto cleanup; - } - - pyobj_dom_inst = PyInstance_New(dom_class, - pyobj_dom_args, - NULL); - - Py_DECREF(pyobj_dom_args); - - if(!pyobj_dom_inst) { -#if DEBUG_ERROR - printf("%s Error creating a python instance of virDomain\n", __FUNCTION__); -#endif - PyErr_Print(); - goto cleanup; - } - - /* Call the Callback Dispatcher */ - pyobj_ret = PyObject_CallMethod(pyobj_conn_inst, - (char*)"dispatchDomainEventCallbacks", - (char*)"Oii", - pyobj_dom_inst, - event, - detail); - - Py_DECREF(pyobj_dom_inst); - - if(!pyobj_ret) { -#if DEBUG_ERROR - printf("%s - ret:%p\n", __FUNCTION__, pyobj_ret); -#endif - PyErr_Print(); - } else { - Py_DECREF(pyobj_ret); - ret = 0; - } - - -cleanup: - LIBVIRT_RELEASE_THREAD_STATE; - return ret; -} - -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)) { -#if DEBUG_ERROR - printf("%s failed parsing tuple\n", __FUNCTION__); -#endif - return VIR_PY_INT_FAIL; - } - -#ifdef DEBUG_ERROR - printf("libvirt_virConnectDomainEventRegister(%p %p) called\n", - pyobj_conn, pyobj_conn_inst); -#endif - conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); - - Py_INCREF(pyobj_conn_inst); - - LIBVIRT_BEGIN_ALLOW_THREADS; - - ret = virConnectDomainEventRegister(conn, - libvirt_virConnectDomainEventCallback, - (void *)pyobj_conn_inst, NULL); - - LIBVIRT_END_ALLOW_THREADS; - - 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); - -#ifdef DEBUG_ERROR - printf("libvirt_virConnectDomainEventDeregister(%p) called\n", pyobj_conn); -#endif - - conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); - - LIBVIRT_BEGIN_ALLOW_THREADS; - - ret = virConnectDomainEventDeregister(conn, libvirt_virConnectDomainEventCallback); - - LIBVIRT_END_ALLOW_THREADS; - - Py_DECREF(pyobj_conn_inst); - py_retval = libvirt_intWrap(ret); - return (py_retval); -} - -/******************************************* - * Event Impl - *******************************************/ -static PyObject *addHandleObj = NULL; -static char *addHandleName = NULL; -static PyObject *updateHandleObj = NULL; -static char *updateHandleName = NULL; -static PyObject *removeHandleObj = NULL; -static char *removeHandleName = NULL; -static PyObject *addTimeoutObj = NULL; -static char *addTimeoutName = NULL; -static PyObject *updateTimeoutObj = NULL; -static char *updateTimeoutName = NULL; -static PyObject *removeTimeoutObj = NULL; -static char *removeTimeoutName = NULL; - -#define NAME(fn) ( fn ## Name ? fn ## Name : # fn ) - -static int -libvirt_virEventAddHandleFunc (int fd, - int event, - virEventHandleCallback cb, - void *opaque, - virFreeCallback ff) -{ - PyObject *result; - PyObject *python_cb; - PyObject *cb_obj; - PyObject *ff_obj; - PyObject *opaque_obj; - PyObject *cb_args; - PyObject *pyobj_args; - int retval = -1; - - LIBVIRT_ENSURE_THREAD_STATE; - - /* Lookup the python callback */ - python_cb = PyDict_GetItemString(getLibvirtDictObject(), - "eventInvokeHandleCallback"); - if(!python_cb) { -#if DEBUG_ERROR - printf("%s: Error finding eventInvokeHandleCallback\n", __FUNCTION__); -#endif - PyErr_Print(); - PyErr_Clear(); - goto cleanup; - } - if (!PyCallable_Check(python_cb)) { -#if DEBUG_ERROR - char *name = py_str(python_cb); - printf("%s: %s is not callable\n", __FUNCTION__, - name ? name : "libvirt.eventInvokeHandleCallback"); - free(name); -#endif - goto cleanup; - } - Py_INCREF(python_cb); - - /* create tuple for cb */ - cb_obj = libvirt_virEventHandleCallbackWrap(cb); - ff_obj = libvirt_virFreeCallbackWrap(ff); - opaque_obj = libvirt_virVoidPtrWrap(opaque); - - cb_args = PyTuple_New(3); - PyTuple_SetItem(cb_args, 0, cb_obj); - PyTuple_SetItem(cb_args, 1, opaque_obj); - PyTuple_SetItem(cb_args, 2, ff_obj); - - 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); - - result = PyEval_CallObject(addHandleObj, pyobj_args); - if (!result) { - PyErr_Print(); - PyErr_Clear(); - } else if (!PyInt_Check(result)) { -#if DEBUG_ERROR - printf("%s: %s should return an int\n", __FUNCTION__, NAME(addHandle)); -#endif - } else { - retval = (int)PyInt_AsLong(result); - } - - Py_XDECREF(result); - Py_DECREF(pyobj_args); - -cleanup: - LIBVIRT_RELEASE_THREAD_STATE; - - return retval; -} - -static void -libvirt_virEventUpdateHandleFunc(int watch, int event) -{ - PyObject *result; - PyObject *pyobj_args; - - LIBVIRT_ENSURE_THREAD_STATE; - - pyobj_args = PyTuple_New(2); - PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(watch)); - PyTuple_SetItem(pyobj_args, 1, libvirt_intWrap(event)); - - result = PyEval_CallObject(updateHandleObj, pyobj_args); - if (!result) { - PyErr_Print(); - PyErr_Clear(); - } - - Py_XDECREF(result); - Py_DECREF(pyobj_args); - - LIBVIRT_RELEASE_THREAD_STATE; -} - - -static int -libvirt_virEventRemoveHandleFunc(int watch) -{ - PyObject *result; - PyObject *pyobj_args; - PyObject *opaque; - PyObject *ff; - int retval = -1; - virFreeCallback cff; - - LIBVIRT_ENSURE_THREAD_STATE; - - pyobj_args = PyTuple_New(1); - PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(watch)); - - result = PyEval_CallObject(removeHandleObj, pyobj_args); - if (!result) { - PyErr_Print(); - PyErr_Clear(); - } else if (!PyTuple_Check(result) || PyTuple_Size(result) != 3) { -#if DEBUG_ERROR - printf("%s: %s must return opaque obj registered with %s" - "to avoid leaking libvirt memory\n", - __FUNCTION__, NAME(removeHandle), NAME(addHandle)); -#endif - } else { - opaque = PyTuple_GetItem(result, 1); - ff = PyTuple_GetItem(result, 2); - cff = PyvirFreeCallback_Get(ff); - if (cff) - (*cff)(PyvirVoidPtr_Get(opaque)); - retval = 0; - } - - Py_XDECREF(result); - Py_DECREF(pyobj_args); - - LIBVIRT_RELEASE_THREAD_STATE; - - return retval; -} - -static int -libvirt_virEventAddTimeoutFunc(int timeout, - virEventTimeoutCallback cb, - void *opaque, - virFreeCallback ff) -{ - PyObject *result; - - PyObject *python_cb; - - PyObject *cb_obj; - PyObject *ff_obj; - PyObject *opaque_obj; - PyObject *cb_args; - PyObject *pyobj_args; - int retval = -1; - - LIBVIRT_ENSURE_THREAD_STATE; - - /* Lookup the python callback */ - python_cb = PyDict_GetItemString(getLibvirtDictObject(), - "eventInvokeTimeoutCallback"); - if(!python_cb) { -#if DEBUG_ERROR - printf("%s: Error finding eventInvokeTimeoutCallback\n", __FUNCTION__); -#endif - PyErr_Print(); - PyErr_Clear(); - goto cleanup; - } - if (!PyCallable_Check(python_cb)) { -#if DEBUG_ERROR - char *name = py_str(python_cb); - printf("%s: %s is not callable\n", __FUNCTION__, - name ? name : "libvirt.eventInvokeTimeoutCallback"); - free(name); -#endif - goto cleanup; - } - Py_INCREF(python_cb); - - /* create tuple for cb */ - cb_obj = libvirt_virEventTimeoutCallbackWrap(cb); - ff_obj = libvirt_virFreeCallbackWrap(ff); - opaque_obj = libvirt_virVoidPtrWrap(opaque); - - cb_args = PyTuple_New(3); - PyTuple_SetItem(cb_args, 0, cb_obj); - PyTuple_SetItem(cb_args, 1, opaque_obj); - PyTuple_SetItem(cb_args, 2, ff_obj); - - 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); - - result = PyEval_CallObject(addTimeoutObj, pyobj_args); - if (!result) { - PyErr_Print(); - PyErr_Clear(); - } else if (!PyInt_Check(result)) { -#if DEBUG_ERROR - printf("%s: %s should return an int\n", __FUNCTION__, NAME(addTimeout)); -#endif - } else { - retval = (int)PyInt_AsLong(result); - } - - Py_XDECREF(result); - Py_DECREF(pyobj_args); - -cleanup: - LIBVIRT_RELEASE_THREAD_STATE; - return retval; -} - -static void -libvirt_virEventUpdateTimeoutFunc(int timer, int timeout) -{ - PyObject *result = NULL; - PyObject *pyobj_args; - - LIBVIRT_ENSURE_THREAD_STATE; - - pyobj_args = PyTuple_New(2); - PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(timer)); - PyTuple_SetItem(pyobj_args, 1, libvirt_intWrap(timeout)); - - result = PyEval_CallObject(updateTimeoutObj, pyobj_args); - if (!result) { - PyErr_Print(); - PyErr_Clear(); - } - - Py_XDECREF(result); - Py_DECREF(pyobj_args); - - LIBVIRT_RELEASE_THREAD_STATE; -} - -static int -libvirt_virEventRemoveTimeoutFunc(int timer) -{ - PyObject *result = NULL; - PyObject *pyobj_args; - PyObject *opaque; - PyObject *ff; - int retval = -1; - virFreeCallback cff; - - LIBVIRT_ENSURE_THREAD_STATE; - - pyobj_args = PyTuple_New(1); - PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(timer)); - - result = PyEval_CallObject(removeTimeoutObj, pyobj_args); - if (!result) { - PyErr_Print(); - PyErr_Clear(); - } else if (!PyTuple_Check(result) || PyTuple_Size(result) != 3) { -#if DEBUG_ERROR - printf("%s: %s must return opaque obj registered with %s" - "to avoid leaking libvirt memory\n", - __FUNCTION__, NAME(removeTimeout), NAME(addTimeout)); -#endif - } else { - opaque = PyTuple_GetItem(result, 1); - ff = PyTuple_GetItem(result, 2); - cff = PyvirFreeCallback_Get(ff); - if (cff) - (*cff)(PyvirVoidPtr_Get(opaque)); - retval = 0; - } - - Py_XDECREF(result); - Py_DECREF(pyobj_args); - - LIBVIRT_RELEASE_THREAD_STATE; - - return retval; -} - -static PyObject * -libvirt_virEventRegisterImpl(ATTRIBUTE_UNUSED PyObject * self, - PyObject * args) -{ - /* Unref the previously-registered impl (if any) */ - Py_XDECREF(addHandleObj); - free(addHandleName); - Py_XDECREF(updateHandleObj); - free(updateHandleName); - Py_XDECREF(removeHandleObj); - free(removeHandleName); - Py_XDECREF(addTimeoutObj); - free(addTimeoutName); - Py_XDECREF(updateTimeoutObj); - free(updateTimeoutName); - Py_XDECREF(removeTimeoutObj); - free(removeTimeoutName); - - /* 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)) - return VIR_PY_INT_FAIL; - - /* Get argument string representations (for error reporting) */ - addHandleName = py_str(addTimeoutObj); - 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. - */ - Py_INCREF(addHandleObj); - Py_INCREF(updateHandleObj); - Py_INCREF(removeHandleObj); - Py_INCREF(addTimeoutObj); - Py_INCREF(updateTimeoutObj); - Py_INCREF(removeTimeoutObj); - - LIBVIRT_BEGIN_ALLOW_THREADS; - - /* Now register our C EventImpl, which will dispatch - * to the Python callbacks passed in as args. - */ - virEventRegisterImpl(libvirt_virEventAddHandleFunc, - libvirt_virEventUpdateHandleFunc, - libvirt_virEventRemoveHandleFunc, - libvirt_virEventAddTimeoutFunc, - libvirt_virEventUpdateTimeoutFunc, - libvirt_virEventRemoveTimeoutFunc); - - LIBVIRT_END_ALLOW_THREADS; - - return VIR_PY_INT_SUCCESS; -} - -static PyObject * -libvirt_virEventInvokeHandleCallback(PyObject *self ATTRIBUTE_UNUSED, - PyObject *args) -{ - int watch, fd, event; - PyObject *py_f; - PyObject *py_opaque; - virEventHandleCallback cb; - void *opaque; - - if (!PyArg_ParseTuple - (args, (char *) "iiiOO:virEventInvokeHandleCallback", - &watch, &fd, &event, &py_f, &py_opaque - )) - return VIR_PY_INT_FAIL; - - cb = (virEventHandleCallback) PyvirEventHandleCallback_Get(py_f); - opaque = (void *) PyvirVoidPtr_Get(py_opaque); - - if(cb) - cb (watch, fd, event, opaque); - - 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); - if(cb) - cb (timer, opaque); - - return VIR_PY_INT_SUCCESS; -} - -/************************************************************************ - * * - * The registration stuff * - * * - ************************************************************************/ -static PyMethodDef libvirtMethods[] = { -#include "libvirt-export.c" - {(char *) "virGetVersion", libvirt_virGetVersion, METH_VARARGS, NULL}, - {(char *) "virConnectOpenAuth", libvirt_virConnectOpenAuth, METH_VARARGS, NULL}, - {(char *) "virConnectListDomainsID", libvirt_virConnectListDomainsID, METH_VARARGS, NULL}, - {(char *) "virConnectListDefinedDomains", libvirt_virConnectListDefinedDomains, METH_VARARGS, NULL}, - {(char *) "virConnectDomainEventRegister", libvirt_virConnectDomainEventRegister, METH_VARARGS, NULL}, - {(char *) "virConnectDomainEventDeregister", libvirt_virConnectDomainEventDeregister, METH_VARARGS, NULL}, - {(char *) "virDomainGetInfo", libvirt_virDomainGetInfo, METH_VARARGS, NULL}, - {(char *) "virNodeGetInfo", libvirt_virNodeGetInfo, METH_VARARGS, NULL}, - {(char *) "virDomainGetUUID", libvirt_virDomainGetUUID, METH_VARARGS, NULL}, - {(char *) "virDomainGetUUIDString", libvirt_virDomainGetUUIDString, METH_VARARGS, NULL}, - {(char *) "virDomainLookupByUUID", libvirt_virDomainLookupByUUID, METH_VARARGS, NULL}, - {(char *) "virRegisterErrorHandler", libvirt_virRegisterErrorHandler, METH_VARARGS, NULL}, - {(char *) "virGetLastError", libvirt_virGetLastError, METH_VARARGS, NULL}, - {(char *) "virConnGetLastError", libvirt_virConnGetLastError, METH_VARARGS, NULL}, - {(char *) "virConnectListNetworks", libvirt_virConnectListNetworks, METH_VARARGS, NULL}, - {(char *) "virConnectListDefinedNetworks", libvirt_virConnectListDefinedNetworks, METH_VARARGS, NULL}, - {(char *) "virNetworkGetUUID", libvirt_virNetworkGetUUID, METH_VARARGS, NULL}, - {(char *) "virNetworkGetUUIDString", libvirt_virNetworkGetUUIDString, METH_VARARGS, NULL}, - {(char *) "virNetworkLookupByUUID", libvirt_virNetworkLookupByUUID, METH_VARARGS, NULL}, - {(char *) "virDomainGetAutostart", libvirt_virDomainGetAutostart, METH_VARARGS, NULL}, - {(char *) "virNetworkGetAutostart", libvirt_virNetworkGetAutostart, METH_VARARGS, NULL}, - {(char *) "virDomainBlockStats", libvirt_virDomainBlockStats, METH_VARARGS, NULL}, - {(char *) "virDomainInterfaceStats", libvirt_virDomainInterfaceStats, METH_VARARGS, NULL}, - {(char *) "virNodeGetCellsFreeMemory", libvirt_virNodeGetCellsFreeMemory, METH_VARARGS, NULL}, - {(char *) "virDomainGetSchedulerType", libvirt_virDomainGetSchedulerType, METH_VARARGS, NULL}, - {(char *) "virDomainGetSchedulerParameters", libvirt_virDomainGetSchedulerParameters, METH_VARARGS, NULL}, - {(char *) "virDomainSetSchedulerParameters", libvirt_virDomainSetSchedulerParameters, METH_VARARGS, NULL}, - {(char *) "virDomainGetVcpus", libvirt_virDomainGetVcpus, METH_VARARGS, NULL}, - {(char *) "virDomainPinVcpu", libvirt_virDomainPinVcpu, METH_VARARGS, NULL}, - {(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}, - {(char *) "virStoragePoolGetUUIDString", libvirt_virStoragePoolGetUUIDString, METH_VARARGS, NULL}, - {(char *) "virStoragePoolLookupByUUID", libvirt_virStoragePoolLookupByUUID, METH_VARARGS, NULL}, - {(char *) "virEventRegisterImpl", libvirt_virEventRegisterImpl, METH_VARARGS, NULL}, - {(char *) "virEventInvokeHandleCallback", libvirt_virEventInvokeHandleCallback, METH_VARARGS, NULL}, - {(char *) "virEventInvokeTimeoutCallback", libvirt_virEventInvokeTimeoutCallback, METH_VARARGS, NULL}, - {(char *) "virNodeListDevices", libvirt_virNodeListDevices, METH_VARARGS, NULL}, - {(char *) "virNodeDeviceListCaps", libvirt_virNodeDeviceListCaps, METH_VARARGS, NULL}, - {(char *) "virSecretGetUUID", libvirt_virSecretGetUUID, METH_VARARGS, NULL}, - {(char *) "virSecretGetUUIDString", libvirt_virSecretGetUUIDString, METH_VARARGS, NULL}, - {(char *) "virSecretLookupByUUID", libvirt_virSecretLookupByUUID, METH_VARARGS, NULL}, - {(char *) "virConnectListSecrets", libvirt_virConnectListSecrets, METH_VARARGS, NULL}, - {(char *) "virSecretGetValue", libvirt_virSecretGetValue, METH_VARARGS, NULL}, - {(char *) "virSecretSetValue", libvirt_virSecretSetValue, METH_VARARGS, NULL}, - {NULL, NULL, 0, NULL} -}; - -void -#ifndef __CYGWIN__ -initlibvirtmod -#else -initcygvirtmod -#endif - (void) -{ - static int initialized = 0; - - if (initialized != 0) - return; - - virInitialize(); - - /* initialize the python extension module */ - Py_InitModule((char *) -#ifndef __CYGWIN__ - "libvirtmod" -#else - "cygvirtmod" -#endif - , libvirtMethods); - - initialized = 1; -} diff --git a/python/libvir.py b/python/libvir.py deleted file mode 100644 index 3cda8dc77c..0000000000 --- a/python/libvir.py +++ /dev/null @@ -1,154 +0,0 @@ -#!/usr/bin/python -u -# -# Those are the autogenerated Python bindings for libvirt. -# Check python/generator.py in the source distribution of libvir -# to find out more about the generation process -# - -# On cygwin, the DLL is called cygvirtmod.dll -try: - import libvirtmod -except ImportError, lib_e: - try: - import cygvirtmod as libvirtmod - except ImportError, cyg_e: - if str(cyg_e).count("No module named"): - raise lib_e - -import types - -# The root of all libvirt errors. -class libvirtError(Exception): - def __init__(self, defmsg, conn=None, dom=None, net=None, pool=None, vol=None): - - if dom is not None: - conn = dom._conn - elif net is not None: - conn = net._conn - elif pool is not None: - conn = pool._conn - elif vol is not None: - conn = vol._conn - - # Never call virConnGetLastError(). - # virGetLastError() is now thread local - err = virGetLastError() - if err is None: - msg = defmsg - else: - msg = err[2] - - Exception.__init__(self, msg) - - self.err = err - - def get_error_code(self): - if self.err is None: - return None - return self.err[0] - - def get_error_domain(self): - if self.err is None: - return None - return self.err[1] - - def get_error_message(self): - if self.err is None: - return None - return self.err[2] - - def get_error_level(self): - if self.err is None: - return None - return self.err[3] - - def get_str1(self): - if self.err is None: - return None - return self.err[4] - - def get_str2(self): - if self.err is None: - return None - return self.err[5] - - def get_str3(self): - if self.err is None: - return None - return self.err[6] - - def get_int1(self): - if self.err is None: - return None - return self.err[7] - - def get_int2(self): - if self.err is None: - return None - return self.err[8] - -# -# register the libvirt global error handler -# -def registerErrorHandler(f, ctx): - """Register a Python written function to for error reporting. - The function is called back as f(ctx, error), with error - being a list of information about the error being raised. - Returns 1 in case of success.""" - return libvirtmod.virRegisterErrorHandler(f,ctx) - -def openAuth(uri, auth, flags): - ret = libvirtmod.virConnectOpenAuth(uri, auth, flags) - if ret is None:raise libvirtError('virConnectOpenAuth() failed') - return virConnect(_obj=ret) - - -# -# Return library version. -# -def getVersion (name = None): - """If no name parameter is passed (or name is None) then the - version of the libvirt library is returned as an integer. - - If a name is passed and it refers to a driver linked to the - libvirt library, then this returns a tuple of (library version, - driver version). - - If the name passed refers to a non-existent driver, then you - will get the exception 'no support for hypervisor'. - - Versions numbers are integers: 1000000*major + 1000*minor + release.""" - if name is None: - ret = libvirtmod.virGetVersion (); - else: - ret = libvirtmod.virGetVersion (name); - if ret is None: raise libvirtError ("virGetVersion() failed") - return ret - - -# -# Invoke an EventHandle callback -# -def eventInvokeHandleCallback (watch, fd, event, callback, opaque): - """ - Invoke the Event Impl Handle Callback in C - """ - libvirtmod.virEventInvokeHandleCallback(watch, fd, event, callback, opaque); - -# -# Invoke an EventTimeout callback -# -def eventInvokeTimeoutCallback (timer, callback, opaque): - """ - Invoke the Event Impl Timeout Callback in C - """ - libvirtmod.virEventInvokeTimeoutCallback(timer, callback, opaque); - - - -# WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING -# -# Everything before this line comes from libvir.py -# Everything after this line is automatically generated -# -# WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING diff --git a/python/libvirt-override-api.xml b/python/libvirt-override-api.xml new file mode 100644 index 0000000000..148b89be11 --- /dev/null +++ b/python/libvirt-override-api.xml @@ -0,0 +1,210 @@ + + + + + Returns the list of the ID of the domains on the hypervisor + + + + + list the defined domains, stores the pointers to the names in @names + + + + + list the networks, stores the pointers to the names in @names + + + + + list the defined networks, stores the pointers to the names in @names + + + + + Try to lookup a domain on the given hypervisor based on its UUID. + + + + + + Try to lookup a network on the given hypervisor based on its UUID. + + + + + + Extract information about a domain. Note that if the connection used to get the domain is limited only a partial set of the information can be extracted. + + + + + Extract hardware information about the Node. + + + + + Extract the UUID unique Identifier of a domain. + + + + + Fetch globally unique ID of the domain as a string. + + + + + Extract the UUID unique Identifier of a network. + + + + + Fetch globally unique ID of the network as a string. + + + + + Extract the UUID unique Identifier of a storage pool. + + + + + Fetch globally unique ID of the storage pool as a string. + + + + + Extract the autostart flag for a network. + + + + + Extract the autostart flag for a domain + + + + + Extract the autostart flag for a storage pool + + + + + Extracts block device statistics for a domain + + + + + + Extracts interface device statistics for a domain + + + + + + Returns the available memory for a list of cells + + + + + + + Get the scheduler parameters, the @params array will be filled with the values. + + + + + Get the scheduler type. + + + + + Extract information about virtual CPUs of domain, store it in info array and also in cpumaps if this pointer is'nt NULL. + + + + + Dynamically change the real CPUs which can be allocated to a virtual CPU. This function requires privileged access to the hypervisor. + + + + + + + Change the scheduler parameters + + + + + + list the storage pools, stores the pointers to the names in @names + + + + + list the defined storage pool, stores the pointers to the names in @names + + + + + list the storage volumes, stores the pointers to the names in @names + + + + + Extract information about a storage pool. Note that if the connection used to get the domain is limited only a partial set of the information can be extracted. + + + + + Extract information about a storage pool. Note that if the connection used to get the domain is limited only a partial set of the information can be extracted. + + + + + list the node devices + + + + + + + list the node device's capabilities + + + + + Fetches the value associated with a secret. + + + + + + List the defined secret IDs + + + + + Associates a value with a secret. + + + + + + + Try to lookup a secret on the given hypervisor based on its UUID. + + + + + + Extract the UUID unique Identifier of a secret. + + + + + Fetch globally unique ID of the secret as a string. + + + + + diff --git a/python/libvirt-override-virConnect.py b/python/libvirt-override-virConnect.py new file mode 100644 index 0000000000..1fdf548a57 --- /dev/null +++ b/python/libvirt-override-virConnect.py @@ -0,0 +1,43 @@ + def __del__(self): + try: + for cb,opaque in self.domainEventCallbacks.items(): + del self.domainEventCallbacks[cb] + self.domainEventCallbacks = None + libvirtmod.virConnectDomainEventDeregister(self._o, self) + except AttributeError: + pass + + if self._o != None: + libvirtmod.virConnectClose(self._o) + self._o = None + + def domainEventDeregister(self, cb): + """Removes a Domain Event Callback. De-registering for a + domain callback will disable delivery of this event type """ + try: + del self.domainEventCallbacks[cb] + if len(self.domainEventCallbacks) == 0: + ret = libvirtmod.virConnectDomainEventDeregister(self._o, self) + if ret == -1: raise libvirtError ('virConnectDomainEventDeregister() failed', conn=self) + except AttributeError: + pass + + def domainEventRegister(self, cb, opaque): + """Adds a Domain Event Callback. Registering for a domain + callback will enable delivery of the events """ + try: + self.domainEventCallbacks[cb] = opaque + except AttributeError: + self.domainEventCallbacks = {cb:opaque} + ret = libvirtmod.virConnectDomainEventRegister(self._o, self) + if ret == -1: raise libvirtError ('virConnectDomainEventRegister() failed', conn=self) + + def dispatchDomainEventCallbacks(self, dom, event, detail): + """Dispatches events to python user domain event callbacks + """ + try: + for cb,opaque in self.domainEventCallbacks.items(): + cb(self,dom,event,detail,opaque) + return 0 + except AttributeError: + pass diff --git a/python/libvirt-override.c b/python/libvirt-override.c new file mode 100644 index 0000000000..5d24fd2277 --- /dev/null +++ b/python/libvirt-override.c @@ -0,0 +1,2471 @@ +/* + * libvir.c: this modules implements the main part of the glue of the + * libvir library and the Python interpreter. It provides the + * entry points where an automatically generated stub is + * unpractical + * + * Copyright (C) 2005, 2007-2009 Red Hat, Inc. + * + * Daniel Veillard + */ + +#include + +/* Horrible kludge to work around even more horrible name-space pollution + via Python.h. That file includes /usr/include/python2.5/pyconfig*.h, + which has over 180 autoconf-style HAVE_* definitions. Shame on them. */ +#undef HAVE_PTHREAD_H + +#include +#include "libvirt/libvirt.h" +#include "libvirt/virterror.h" +#include "typewrappers.h" +#include "libvirt.h" + +#ifndef __CYGWIN__ +extern void initlibvirtmod(void); +#else +extern void initcygvirtmod(void); +#endif + +/* The two-statement sequence "Py_INCREF(Py_None); return Py_None;" + is so common that we encapsulate it here. Now, each use is simply + return VIR_PY_NONE; */ +#define VIR_PY_NONE (Py_INCREF (Py_None), Py_None) +#define VIR_PY_INT_FAIL (libvirt_intWrap(-1)) +#define VIR_PY_INT_SUCCESS (libvirt_intWrap(0)) + +static char *py_str(PyObject *obj) +{ + PyObject *str = PyObject_Str(obj); + if (!str) { + PyErr_Print(); + PyErr_Clear(); + return NULL; + }; + return PyString_AsString(str); +} + + +/************************************************************************ + * * + * Statistics * + * * + ************************************************************************/ + +static PyObject * +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)) + return(NULL); + domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); + + c_retval = virDomainBlockStats(domain, path, &stats, sizeof(stats)); + if (c_retval < 0) + return VIR_PY_NONE; + + /* convert to a Python tuple of long objects */ + if ((info = PyTuple_New(5)) == NULL) + return VIR_PY_NONE; + 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); +} + +static PyObject * +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)) + return(NULL); + domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); + + c_retval = virDomainInterfaceStats(domain, path, &stats, sizeof(stats)); + if (c_retval < 0) + return VIR_PY_NONE; + + /* convert to a Python tuple of long objects */ + if ((info = PyTuple_New(8)) == NULL) + return VIR_PY_NONE; + 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); +} + + +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); + + c_retval = virDomainGetSchedulerType(domain, &nparams); + if (c_retval == NULL) + return VIR_PY_NONE; + + /* convert to a Python tuple of long objects */ + 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; + int nparams, i; + virSchedParameterPtr params; + + if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetScedulerParameters", + &pyobj_domain)) + return(NULL); + domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); + + c_retval = virDomainGetSchedulerType(domain, &nparams); + if (c_retval == NULL) + return VIR_PY_NONE; + free(c_retval); + + if ((params = malloc(sizeof(*params)*nparams)) == NULL) + return VIR_PY_NONE; + + if (virDomainGetSchedulerParameters(domain, params, &nparams) < 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_DOMAIN_SCHED_FIELD_INT: + val = PyInt_FromLong((long)params[i].value.i); + break; + + case VIR_DOMAIN_SCHED_FIELD_UINT: + val = PyInt_FromLong((long)params[i].value.ui); + break; + + case VIR_DOMAIN_SCHED_FIELD_LLONG: + val = PyLong_FromLongLong((long long)params[i].value.l); + break; + + case VIR_DOMAIN_SCHED_FIELD_ULLONG: + val = PyLong_FromLongLong((long long)params[i].value.ul); + break; + + case VIR_DOMAIN_SCHED_FIELD_DOUBLE: + val = PyFloat_FromDouble((double)params[i].value.d); + break; + + case VIR_DOMAIN_SCHED_FIELD_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); +} + +static PyObject * +libvirt_virDomainSetSchedulerParameters(PyObject *self ATTRIBUTE_UNUSED, + PyObject *args) { + virDomainPtr domain; + PyObject *pyobj_domain, *info; + char *c_retval; + int nparams, i; + virSchedParameterPtr params; + + if (!PyArg_ParseTuple(args, (char *)"OO:virDomainSetScedulerParameters", + &pyobj_domain, &info)) + return(NULL); + domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); + + c_retval = virDomainGetSchedulerType(domain, &nparams); + if (c_retval == NULL) + return VIR_PY_INT_FAIL; + free(c_retval); + + if ((params = malloc(sizeof(*params)*nparams)) == NULL) + return VIR_PY_INT_FAIL; + + if (virDomainGetSchedulerParameters(domain, params, &nparams) < 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_DOMAIN_SCHED_FIELD_INT: + params[i].value.i = (int)PyInt_AS_LONG(val); + break; + + case VIR_DOMAIN_SCHED_FIELD_UINT: + params[i].value.ui = (unsigned int)PyInt_AS_LONG(val); + break; + + case VIR_DOMAIN_SCHED_FIELD_LLONG: + params[i].value.l = (long long)PyLong_AsLongLong(val); + break; + + case VIR_DOMAIN_SCHED_FIELD_ULLONG: + params[i].value.ul = (unsigned long long)PyLong_AsLongLong(val); + break; + + case VIR_DOMAIN_SCHED_FIELD_DOUBLE: + params[i].value.d = (double)PyFloat_AsDouble(val); + break; + + case VIR_DOMAIN_SCHED_FIELD_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; + } + } + + if (virDomainSetSchedulerParameters(domain, params, nparams) < 0) { + free(params); + return VIR_PY_INT_FAIL; + } + + free(params); + return VIR_PY_INT_SUCCESS; +} + +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; + int cpumaplen, i; + + if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetVcpus", + &pyobj_domain)) + return(NULL); + domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); + + if (virNodeGetInfo(virDomainGetConnect(domain), &nodeinfo) != 0) + return VIR_PY_NONE; + + if (virDomainGetInfo(domain, &dominfo) != 0) + 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; + + if (virDomainGetVcpus(domain, + cpuinfo, dominfo.nrVirtCpu, + cpumap, cpumaplen) < 0) + goto cleanup; + + /* convert to a Python tuple of long objects */ + 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; + + if (!PyArg_ParseTuple(args, (char *)"OiO:virDomainPinVcpu", + &pyobj_domain, &vcpu, &pycpumap)) + return(NULL); + domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); + + if (virNodeGetInfo(virDomainGetConnect(domain), &nodeinfo) != 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); + } + + virDomainPinVcpu(domain, vcpu, cpumap, cpumaplen); + Py_DECREF(truth); + free(cpumap); + + return VIR_PY_INT_SUCCESS; +} + + +/************************************************************************ + * * + * Global error handler at the Python level * + * * + ************************************************************************/ + +static PyObject *libvirt_virPythonErrorFuncHandler = NULL; +static PyObject *libvirt_virPythonErrorFuncCtxt = NULL; + +static PyObject * +libvirt_virGetLastError(PyObject *self ATTRIBUTE_UNUSED, PyObject *args ATTRIBUTE_UNUSED) +{ + virError *err; + PyObject *info; + + if ((err = virGetLastError()) == NULL) + return VIR_PY_NONE; + + if ((info = PyTuple_New(9)) == NULL) + return VIR_PY_NONE; + 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)); + + return info; +} + +static PyObject * +libvirt_virConnGetLastError(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) +{ + virError *err; + PyObject *info; + virConnectPtr conn; + PyObject *pyobj_conn; + + if (!PyArg_ParseTuple(args, (char *)"O:virConGetLastError", &pyobj_conn)) + return(NULL); + conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); + + if ((err = virConnGetLastError(conn)) == NULL) + return VIR_PY_NONE; + + if ((info = PyTuple_New(9)) == NULL) + return VIR_PY_NONE; + 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)); + + return info; +} + +static void +libvirt_virErrorFuncHandler(ATTRIBUTE_UNUSED void *ctx, virErrorPtr err) +{ + PyObject *list, *info; + PyObject *result; + +#ifdef DEBUG_ERROR + printf("libvirt_virErrorFuncHandler(%p, %s, ...) called\n", ctx, + err->message); +#endif + + if ((err == NULL) || (err->code == VIR_ERR_OK)) + return; + + LIBVIRT_ENSURE_THREAD_STATE; + + 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)); + 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)); + /* TODO pass conn and dom if available */ + result = PyEval_CallObject(libvirt_virPythonErrorFuncHandler, list); + Py_XDECREF(list); + Py_XDECREF(result); + } + + LIBVIRT_RELEASE_THREAD_STATE; +} + +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); + +#ifdef DEBUG_ERROR + printf("libvirt_virRegisterErrorHandler(%p, %p) called\n", pyobj_ctx, + pyobj_f); +#endif + + 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; + libvirt_virPythonErrorFuncCtxt = NULL; + } else { + Py_XINCREF(pyobj_ctx); + Py_XINCREF(pyobj_f); + + /* TODO: check f is a function ! */ + libvirt_virPythonErrorFuncHandler = pyobj_f; + libvirt_virPythonErrorFuncCtxt = pyobj_ctx; + } + + py_retval = libvirt_intWrap(1); + return (py_retval); +} + +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; + int flags; + 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; + auth.credtype = malloc(sizeof(*auth.credtype) * auth.ncredtype); + if (auth.credtype == NULL) + return VIR_PY_NONE; + 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; + py_retval = libvirt_virConnectPtrWrap((virConnectPtr) c_retval); + return(py_retval); +} + + +/************************************************************************ + * * + * Wrappers for functions where generator fails * + * * + ************************************************************************/ + +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; + + if (c_retval == -1) + return VIR_PY_NONE; + + if (type == NULL) + return PyInt_FromLong (libVer); + else + return Py_BuildValue ((char *) "kk", libVer, typeVer); +} + + +static PyObject * +libvirt_virConnectListDomainsID(PyObject *self ATTRIBUTE_UNUSED, + PyObject *args) { + PyObject *py_retval; + int ids[500], c_retval, i; + virConnectPtr conn; + PyObject *pyobj_conn; + + + if (!PyArg_ParseTuple(args, (char *)"O:virConnectListDomains", &pyobj_conn)) + return(NULL); + conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); + + LIBVIRT_BEGIN_ALLOW_THREADS; + c_retval = virConnectListDomains(conn, &ids[0], 500); + LIBVIRT_END_ALLOW_THREADS; + if (c_retval < 0) + return VIR_PY_NONE; + py_retval = PyList_New(c_retval); + for (i = 0;i < c_retval;i++) { + PyList_SetItem(py_retval, i, libvirt_intWrap(ids[i])); + } + return(py_retval); +} + +static PyObject * +libvirt_virConnectListDefinedDomains(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:virConnectListDefinedDomains", &pyobj_conn)) + return(NULL); + conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); + + c_retval = virConnectNumOfDefinedDomains(conn); + if (c_retval < 0) + return VIR_PY_NONE; + + if (c_retval) { + names = malloc(sizeof(*names) * c_retval); + if (!names) + return VIR_PY_NONE; + c_retval = virConnectListDefinedDomains(conn, names, c_retval); + 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_virDomainGetInfo(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { + 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); + + LIBVIRT_BEGIN_ALLOW_THREADS; + c_retval = virDomainGetInfo(domain, &info); + LIBVIRT_END_ALLOW_THREADS; + if (c_retval < 0) + return VIR_PY_NONE; + py_retval = PyList_New(5); + PyList_SetItem(py_retval, 0, libvirt_intWrap((int) info.state)); + PyList_SetItem(py_retval, 1, libvirt_ulongWrap(info.maxMem)); + PyList_SetItem(py_retval, 2, libvirt_ulongWrap(info.memory)); + PyList_SetItem(py_retval, 3, libvirt_intWrap((int) info.nrVirtCpu)); + PyList_SetItem(py_retval, 4, + libvirt_longlongWrap((unsigned long long) info.cpuTime)); + return(py_retval); +} + +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); + + LIBVIRT_BEGIN_ALLOW_THREADS; + c_retval = virNodeGetInfo(conn, &info); + LIBVIRT_END_ALLOW_THREADS; + if (c_retval < 0) + return VIR_PY_NONE; + py_retval = PyList_New(8); + PyList_SetItem(py_retval, 0, libvirt_constcharPtrWrap(&info.model[0])); + PyList_SetItem(py_retval, 1, libvirt_longWrap((long) info.memory >> 10)); + 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); +} + +static PyObject * +libvirt_virDomainGetUUID(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) { + PyObject *py_retval; + unsigned char uuid[VIR_UUID_BUFLEN]; + virDomainPtr domain; + PyObject *pyobj_domain; + int c_retval; + + if (!PyArg_ParseTuple(args, (char *)"O:virDomainGetUUID", &pyobj_domain)) + return(NULL); + domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain); + + if (domain == NULL) + return VIR_PY_NONE; + LIBVIRT_BEGIN_ALLOW_THREADS; + c_retval = virDomainGetUUID(domain, &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_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); +} + +static PyObject * +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); + + if ((uuid == NULL) || (len != VIR_UUID_BUFLEN)) + return VIR_PY_NONE; + + LIBVIRT_BEGIN_ALLOW_THREADS; + c_retval = virDomainLookupByUUID(conn, uuid); + LIBVIRT_END_ALLOW_THREADS; + py_retval = libvirt_virDomainPtrWrap((virDomainPtr) c_retval); + return(py_retval); +} + + +static PyObject * +libvirt_virConnectListNetworks(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:virConnectListNetworks", &pyobj_conn)) + return(NULL); + conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); + + c_retval = virConnectNumOfNetworks(conn); + if (c_retval < 0) + return VIR_PY_NONE; + + if (c_retval) { + names = malloc(sizeof(*names) * c_retval); + if (!names) + return VIR_PY_NONE; + c_retval = virConnectListNetworks(conn, names, c_retval); + 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_virConnectListDefinedNetworks(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:virConnectListDefinedNetworks", &pyobj_conn)) + return(NULL); + conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); + + c_retval = virConnectNumOfDefinedNetworks(conn); + if (c_retval < 0) + return VIR_PY_NONE; + + if (c_retval) { + names = malloc(sizeof(*names) * c_retval); + if (!names) + return VIR_PY_NONE; + c_retval = virConnectListDefinedNetworks(conn, names, c_retval); + 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_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); + + if (domain == NULL) + return VIR_PY_NONE; + LIBVIRT_BEGIN_ALLOW_THREADS; + c_retval = virNetworkGetUUID(domain, &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_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); +} + +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); + + if ((uuid == NULL) || (len != VIR_UUID_BUFLEN)) + return VIR_PY_NONE; + + LIBVIRT_BEGIN_ALLOW_THREADS; + c_retval = virNetworkLookupByUUID(conn, uuid); + LIBVIRT_END_ALLOW_THREADS; + py_retval = libvirt_virNetworkPtrWrap((virNetworkPtr) c_retval); + return(py_retval); +} + + +static PyObject * +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; + + if (c_retval < 0) + return VIR_PY_INT_FAIL; + py_retval = libvirt_intWrap(autostart); + return(py_retval); +} + + +static PyObject * +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; + + if (c_retval < 0) + return VIR_PY_INT_FAIL; + py_retval = libvirt_intWrap(autostart); + return(py_retval); +} + +static PyObject * +libvirt_virNodeGetCellsFreeMemory(PyObject *self ATTRIBUTE_UNUSED, PyObject *args) +{ + 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); + + if ((startCell < 0) || (maxCells <= 0) || (startCell + maxCells > 10000)) + goto error; + + conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); + freeMems = + malloc(maxCells * sizeof(*freeMems)); + if (freeMems == NULL) + goto error; + + LIBVIRT_BEGIN_ALLOW_THREADS; + c_retval = virNodeGetCellsFreeMemory(conn, freeMems, startCell, maxCells); + LIBVIRT_END_ALLOW_THREADS; + + if (c_retval < 0) { + free(freeMems); +error: + return VIR_PY_NONE; + } + py_retval = PyList_New(c_retval); + for (i = 0;i < c_retval;i++) { + PyList_SetItem(py_retval, i, + libvirt_longlongWrap((long long) freeMems[i])); + } + free(freeMems); + return(py_retval); +} + + +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); + + c_retval = virConnectNumOfStoragePools(conn); + if (c_retval < 0) + return VIR_PY_NONE; + + if (c_retval) { + names = malloc(sizeof(*names) * c_retval); + if (!names) + return VIR_PY_NONE; + c_retval = virConnectListStoragePools(conn, names, c_retval); + 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); + + c_retval = virConnectNumOfDefinedStoragePools(conn); + if (c_retval < 0) + return VIR_PY_NONE; + + if (c_retval) { + names = malloc(sizeof(*names) * c_retval); + if (!names) + return VIR_PY_NONE; + c_retval = virConnectListDefinedStoragePools(conn, names, c_retval); + 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); + + c_retval = virStoragePoolNumOfVolumes(pool); + if (c_retval < 0) + return VIR_PY_NONE; + + if (c_retval) { + names = malloc(sizeof(*names) * c_retval); + if (!names) + return VIR_PY_NONE; + c_retval = virStoragePoolListVolumes(pool, names, c_retval); + 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); +} + +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); +} + +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); +} + +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); + + c_retval = virNodeNumOfDevices(conn, cap, flags); + if (c_retval < 0) + return VIR_PY_NONE; + + if (c_retval) { + names = malloc(sizeof(*names) * c_retval); + if (!names) + return VIR_PY_NONE; + c_retval = virNodeListDevices(conn, cap, names, c_retval, flags); + 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); + + c_retval = virNodeDeviceNumOfCaps(dev); + if (c_retval < 0) + return VIR_PY_NONE; + + if (c_retval) { + names = malloc(sizeof(*names) * c_retval); + if (!names) + return VIR_PY_NONE; + c_retval = virNodeDeviceListCaps(dev, names, c_retval); + 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_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); +} + + +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; +} + +/******************************************* + * 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; + +static PyObject * +getLibvirtModuleObject (void) { + if(libvirt_module) + return libvirt_module; + + // PyImport_ImportModule returns a new reference + /* Bogus (char *) cast for RHEL-5 python API brokenness */ + libvirt_module = PyImport_ImportModule((char *)"libvirt"); + if(!libvirt_module) { +#if DEBUG_ERROR + printf("%s Error importing libvirt module\n", __FUNCTION__); +#endif + 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) { +#if DEBUG_ERROR + printf("%s Error importing libvirt dictionary\n", __FUNCTION__); +#endif + 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) { +#if DEBUG_ERROR + printf("%s Error importing virDomain class\n", __FUNCTION__); +#endif + PyErr_Print(); + return NULL; + } + + Py_INCREF(libvirt_dom_class); + return libvirt_dom_class; +} +/******************************************* + * Domain Events + *******************************************/ + +static int +libvirt_virConnectDomainEventCallback(virConnectPtr conn ATTRIBUTE_UNUSED, + virDomainPtr dom, + int event, + int detail, + void *opaque) +{ + PyObject *pyobj_ret; + + PyObject *pyobj_conn_inst = (PyObject*)opaque; + PyObject *pyobj_dom; + + PyObject *pyobj_dom_args; + PyObject *pyobj_dom_inst; + + PyObject *dom_class; + int ret = -1; + + LIBVIRT_ENSURE_THREAD_STATE; + + /* Create a python instance of this virDomainPtr */ + virDomainRef(dom); + pyobj_dom = libvirt_virDomainPtrWrap(dom); + pyobj_dom_args = PyTuple_New(2); + if(PyTuple_SetItem(pyobj_dom_args, 0, pyobj_conn_inst)!=0) { +#if DEBUG_ERROR + printf("%s error creating tuple",__FUNCTION__); +#endif + goto cleanup; + } + if(PyTuple_SetItem(pyobj_dom_args, 1, pyobj_dom)!=0) { +#if DEBUG_ERROR + printf("%s error creating tuple",__FUNCTION__); +#endif + goto cleanup; + } + Py_INCREF(pyobj_conn_inst); + + dom_class = getLibvirtDomainClassObject(); + if(!PyClass_Check(dom_class)) { +#if DEBUG_ERROR + printf("%s dom_class is not a class!\n", __FUNCTION__); +#endif + goto cleanup; + } + + pyobj_dom_inst = PyInstance_New(dom_class, + pyobj_dom_args, + NULL); + + Py_DECREF(pyobj_dom_args); + + if(!pyobj_dom_inst) { +#if DEBUG_ERROR + printf("%s Error creating a python instance of virDomain\n", __FUNCTION__); +#endif + PyErr_Print(); + goto cleanup; + } + + /* Call the Callback Dispatcher */ + pyobj_ret = PyObject_CallMethod(pyobj_conn_inst, + (char*)"dispatchDomainEventCallbacks", + (char*)"Oii", + pyobj_dom_inst, + event, + detail); + + Py_DECREF(pyobj_dom_inst); + + if(!pyobj_ret) { +#if DEBUG_ERROR + printf("%s - ret:%p\n", __FUNCTION__, pyobj_ret); +#endif + PyErr_Print(); + } else { + Py_DECREF(pyobj_ret); + ret = 0; + } + + +cleanup: + LIBVIRT_RELEASE_THREAD_STATE; + return ret; +} + +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)) { +#if DEBUG_ERROR + printf("%s failed parsing tuple\n", __FUNCTION__); +#endif + return VIR_PY_INT_FAIL; + } + +#ifdef DEBUG_ERROR + printf("libvirt_virConnectDomainEventRegister(%p %p) called\n", + pyobj_conn, pyobj_conn_inst); +#endif + conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); + + Py_INCREF(pyobj_conn_inst); + + LIBVIRT_BEGIN_ALLOW_THREADS; + + ret = virConnectDomainEventRegister(conn, + libvirt_virConnectDomainEventCallback, + (void *)pyobj_conn_inst, NULL); + + LIBVIRT_END_ALLOW_THREADS; + + 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); + +#ifdef DEBUG_ERROR + printf("libvirt_virConnectDomainEventDeregister(%p) called\n", pyobj_conn); +#endif + + conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); + + LIBVIRT_BEGIN_ALLOW_THREADS; + + ret = virConnectDomainEventDeregister(conn, libvirt_virConnectDomainEventCallback); + + LIBVIRT_END_ALLOW_THREADS; + + Py_DECREF(pyobj_conn_inst); + py_retval = libvirt_intWrap(ret); + return (py_retval); +} + +/******************************************* + * Event Impl + *******************************************/ +static PyObject *addHandleObj = NULL; +static char *addHandleName = NULL; +static PyObject *updateHandleObj = NULL; +static char *updateHandleName = NULL; +static PyObject *removeHandleObj = NULL; +static char *removeHandleName = NULL; +static PyObject *addTimeoutObj = NULL; +static char *addTimeoutName = NULL; +static PyObject *updateTimeoutObj = NULL; +static char *updateTimeoutName = NULL; +static PyObject *removeTimeoutObj = NULL; +static char *removeTimeoutName = NULL; + +#define NAME(fn) ( fn ## Name ? fn ## Name : # fn ) + +static int +libvirt_virEventAddHandleFunc (int fd, + int event, + virEventHandleCallback cb, + void *opaque, + virFreeCallback ff) +{ + PyObject *result; + PyObject *python_cb; + PyObject *cb_obj; + PyObject *ff_obj; + PyObject *opaque_obj; + PyObject *cb_args; + PyObject *pyobj_args; + int retval = -1; + + LIBVIRT_ENSURE_THREAD_STATE; + + /* Lookup the python callback */ + python_cb = PyDict_GetItemString(getLibvirtDictObject(), + "eventInvokeHandleCallback"); + if(!python_cb) { +#if DEBUG_ERROR + printf("%s: Error finding eventInvokeHandleCallback\n", __FUNCTION__); +#endif + PyErr_Print(); + PyErr_Clear(); + goto cleanup; + } + if (!PyCallable_Check(python_cb)) { +#if DEBUG_ERROR + char *name = py_str(python_cb); + printf("%s: %s is not callable\n", __FUNCTION__, + name ? name : "libvirt.eventInvokeHandleCallback"); + free(name); +#endif + goto cleanup; + } + Py_INCREF(python_cb); + + /* create tuple for cb */ + cb_obj = libvirt_virEventHandleCallbackWrap(cb); + ff_obj = libvirt_virFreeCallbackWrap(ff); + opaque_obj = libvirt_virVoidPtrWrap(opaque); + + cb_args = PyTuple_New(3); + PyTuple_SetItem(cb_args, 0, cb_obj); + PyTuple_SetItem(cb_args, 1, opaque_obj); + PyTuple_SetItem(cb_args, 2, ff_obj); + + 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); + + result = PyEval_CallObject(addHandleObj, pyobj_args); + if (!result) { + PyErr_Print(); + PyErr_Clear(); + } else if (!PyInt_Check(result)) { +#if DEBUG_ERROR + printf("%s: %s should return an int\n", __FUNCTION__, NAME(addHandle)); +#endif + } else { + retval = (int)PyInt_AsLong(result); + } + + Py_XDECREF(result); + Py_DECREF(pyobj_args); + +cleanup: + LIBVIRT_RELEASE_THREAD_STATE; + + return retval; +} + +static void +libvirt_virEventUpdateHandleFunc(int watch, int event) +{ + PyObject *result; + PyObject *pyobj_args; + + LIBVIRT_ENSURE_THREAD_STATE; + + pyobj_args = PyTuple_New(2); + PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(watch)); + PyTuple_SetItem(pyobj_args, 1, libvirt_intWrap(event)); + + result = PyEval_CallObject(updateHandleObj, pyobj_args); + if (!result) { + PyErr_Print(); + PyErr_Clear(); + } + + Py_XDECREF(result); + Py_DECREF(pyobj_args); + + LIBVIRT_RELEASE_THREAD_STATE; +} + + +static int +libvirt_virEventRemoveHandleFunc(int watch) +{ + PyObject *result; + PyObject *pyobj_args; + PyObject *opaque; + PyObject *ff; + int retval = -1; + virFreeCallback cff; + + LIBVIRT_ENSURE_THREAD_STATE; + + pyobj_args = PyTuple_New(1); + PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(watch)); + + result = PyEval_CallObject(removeHandleObj, pyobj_args); + if (!result) { + PyErr_Print(); + PyErr_Clear(); + } else if (!PyTuple_Check(result) || PyTuple_Size(result) != 3) { +#if DEBUG_ERROR + printf("%s: %s must return opaque obj registered with %s" + "to avoid leaking libvirt memory\n", + __FUNCTION__, NAME(removeHandle), NAME(addHandle)); +#endif + } else { + opaque = PyTuple_GetItem(result, 1); + ff = PyTuple_GetItem(result, 2); + cff = PyvirFreeCallback_Get(ff); + if (cff) + (*cff)(PyvirVoidPtr_Get(opaque)); + retval = 0; + } + + Py_XDECREF(result); + Py_DECREF(pyobj_args); + + LIBVIRT_RELEASE_THREAD_STATE; + + return retval; +} + +static int +libvirt_virEventAddTimeoutFunc(int timeout, + virEventTimeoutCallback cb, + void *opaque, + virFreeCallback ff) +{ + PyObject *result; + + PyObject *python_cb; + + PyObject *cb_obj; + PyObject *ff_obj; + PyObject *opaque_obj; + PyObject *cb_args; + PyObject *pyobj_args; + int retval = -1; + + LIBVIRT_ENSURE_THREAD_STATE; + + /* Lookup the python callback */ + python_cb = PyDict_GetItemString(getLibvirtDictObject(), + "eventInvokeTimeoutCallback"); + if(!python_cb) { +#if DEBUG_ERROR + printf("%s: Error finding eventInvokeTimeoutCallback\n", __FUNCTION__); +#endif + PyErr_Print(); + PyErr_Clear(); + goto cleanup; + } + if (!PyCallable_Check(python_cb)) { +#if DEBUG_ERROR + char *name = py_str(python_cb); + printf("%s: %s is not callable\n", __FUNCTION__, + name ? name : "libvirt.eventInvokeTimeoutCallback"); + free(name); +#endif + goto cleanup; + } + Py_INCREF(python_cb); + + /* create tuple for cb */ + cb_obj = libvirt_virEventTimeoutCallbackWrap(cb); + ff_obj = libvirt_virFreeCallbackWrap(ff); + opaque_obj = libvirt_virVoidPtrWrap(opaque); + + cb_args = PyTuple_New(3); + PyTuple_SetItem(cb_args, 0, cb_obj); + PyTuple_SetItem(cb_args, 1, opaque_obj); + PyTuple_SetItem(cb_args, 2, ff_obj); + + 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); + + result = PyEval_CallObject(addTimeoutObj, pyobj_args); + if (!result) { + PyErr_Print(); + PyErr_Clear(); + } else if (!PyInt_Check(result)) { +#if DEBUG_ERROR + printf("%s: %s should return an int\n", __FUNCTION__, NAME(addTimeout)); +#endif + } else { + retval = (int)PyInt_AsLong(result); + } + + Py_XDECREF(result); + Py_DECREF(pyobj_args); + +cleanup: + LIBVIRT_RELEASE_THREAD_STATE; + return retval; +} + +static void +libvirt_virEventUpdateTimeoutFunc(int timer, int timeout) +{ + PyObject *result = NULL; + PyObject *pyobj_args; + + LIBVIRT_ENSURE_THREAD_STATE; + + pyobj_args = PyTuple_New(2); + PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(timer)); + PyTuple_SetItem(pyobj_args, 1, libvirt_intWrap(timeout)); + + result = PyEval_CallObject(updateTimeoutObj, pyobj_args); + if (!result) { + PyErr_Print(); + PyErr_Clear(); + } + + Py_XDECREF(result); + Py_DECREF(pyobj_args); + + LIBVIRT_RELEASE_THREAD_STATE; +} + +static int +libvirt_virEventRemoveTimeoutFunc(int timer) +{ + PyObject *result = NULL; + PyObject *pyobj_args; + PyObject *opaque; + PyObject *ff; + int retval = -1; + virFreeCallback cff; + + LIBVIRT_ENSURE_THREAD_STATE; + + pyobj_args = PyTuple_New(1); + PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(timer)); + + result = PyEval_CallObject(removeTimeoutObj, pyobj_args); + if (!result) { + PyErr_Print(); + PyErr_Clear(); + } else if (!PyTuple_Check(result) || PyTuple_Size(result) != 3) { +#if DEBUG_ERROR + printf("%s: %s must return opaque obj registered with %s" + "to avoid leaking libvirt memory\n", + __FUNCTION__, NAME(removeTimeout), NAME(addTimeout)); +#endif + } else { + opaque = PyTuple_GetItem(result, 1); + ff = PyTuple_GetItem(result, 2); + cff = PyvirFreeCallback_Get(ff); + if (cff) + (*cff)(PyvirVoidPtr_Get(opaque)); + retval = 0; + } + + Py_XDECREF(result); + Py_DECREF(pyobj_args); + + LIBVIRT_RELEASE_THREAD_STATE; + + return retval; +} + +static PyObject * +libvirt_virEventRegisterImpl(ATTRIBUTE_UNUSED PyObject * self, + PyObject * args) +{ + /* Unref the previously-registered impl (if any) */ + Py_XDECREF(addHandleObj); + free(addHandleName); + Py_XDECREF(updateHandleObj); + free(updateHandleName); + Py_XDECREF(removeHandleObj); + free(removeHandleName); + Py_XDECREF(addTimeoutObj); + free(addTimeoutName); + Py_XDECREF(updateTimeoutObj); + free(updateTimeoutName); + Py_XDECREF(removeTimeoutObj); + free(removeTimeoutName); + + /* 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)) + return VIR_PY_INT_FAIL; + + /* Get argument string representations (for error reporting) */ + addHandleName = py_str(addTimeoutObj); + 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. + */ + Py_INCREF(addHandleObj); + Py_INCREF(updateHandleObj); + Py_INCREF(removeHandleObj); + Py_INCREF(addTimeoutObj); + Py_INCREF(updateTimeoutObj); + Py_INCREF(removeTimeoutObj); + + LIBVIRT_BEGIN_ALLOW_THREADS; + + /* Now register our C EventImpl, which will dispatch + * to the Python callbacks passed in as args. + */ + virEventRegisterImpl(libvirt_virEventAddHandleFunc, + libvirt_virEventUpdateHandleFunc, + libvirt_virEventRemoveHandleFunc, + libvirt_virEventAddTimeoutFunc, + libvirt_virEventUpdateTimeoutFunc, + libvirt_virEventRemoveTimeoutFunc); + + LIBVIRT_END_ALLOW_THREADS; + + return VIR_PY_INT_SUCCESS; +} + +static PyObject * +libvirt_virEventInvokeHandleCallback(PyObject *self ATTRIBUTE_UNUSED, + PyObject *args) +{ + int watch, fd, event; + PyObject *py_f; + PyObject *py_opaque; + virEventHandleCallback cb; + void *opaque; + + if (!PyArg_ParseTuple + (args, (char *) "iiiOO:virEventInvokeHandleCallback", + &watch, &fd, &event, &py_f, &py_opaque + )) + return VIR_PY_INT_FAIL; + + cb = (virEventHandleCallback) PyvirEventHandleCallback_Get(py_f); + opaque = (void *) PyvirVoidPtr_Get(py_opaque); + + if(cb) + cb (watch, fd, event, opaque); + + 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); + if(cb) + cb (timer, opaque); + + return VIR_PY_INT_SUCCESS; +} + +/************************************************************************ + * * + * The registration stuff * + * * + ************************************************************************/ +static PyMethodDef libvirtMethods[] = { +#include "libvirt-export.c" + {(char *) "virGetVersion", libvirt_virGetVersion, METH_VARARGS, NULL}, + {(char *) "virConnectOpenAuth", libvirt_virConnectOpenAuth, METH_VARARGS, NULL}, + {(char *) "virConnectListDomainsID", libvirt_virConnectListDomainsID, METH_VARARGS, NULL}, + {(char *) "virConnectListDefinedDomains", libvirt_virConnectListDefinedDomains, METH_VARARGS, NULL}, + {(char *) "virConnectDomainEventRegister", libvirt_virConnectDomainEventRegister, METH_VARARGS, NULL}, + {(char *) "virConnectDomainEventDeregister", libvirt_virConnectDomainEventDeregister, METH_VARARGS, NULL}, + {(char *) "virDomainGetInfo", libvirt_virDomainGetInfo, METH_VARARGS, NULL}, + {(char *) "virNodeGetInfo", libvirt_virNodeGetInfo, METH_VARARGS, NULL}, + {(char *) "virDomainGetUUID", libvirt_virDomainGetUUID, METH_VARARGS, NULL}, + {(char *) "virDomainGetUUIDString", libvirt_virDomainGetUUIDString, METH_VARARGS, NULL}, + {(char *) "virDomainLookupByUUID", libvirt_virDomainLookupByUUID, METH_VARARGS, NULL}, + {(char *) "virRegisterErrorHandler", libvirt_virRegisterErrorHandler, METH_VARARGS, NULL}, + {(char *) "virGetLastError", libvirt_virGetLastError, METH_VARARGS, NULL}, + {(char *) "virConnGetLastError", libvirt_virConnGetLastError, METH_VARARGS, NULL}, + {(char *) "virConnectListNetworks", libvirt_virConnectListNetworks, METH_VARARGS, NULL}, + {(char *) "virConnectListDefinedNetworks", libvirt_virConnectListDefinedNetworks, METH_VARARGS, NULL}, + {(char *) "virNetworkGetUUID", libvirt_virNetworkGetUUID, METH_VARARGS, NULL}, + {(char *) "virNetworkGetUUIDString", libvirt_virNetworkGetUUIDString, METH_VARARGS, NULL}, + {(char *) "virNetworkLookupByUUID", libvirt_virNetworkLookupByUUID, METH_VARARGS, NULL}, + {(char *) "virDomainGetAutostart", libvirt_virDomainGetAutostart, METH_VARARGS, NULL}, + {(char *) "virNetworkGetAutostart", libvirt_virNetworkGetAutostart, METH_VARARGS, NULL}, + {(char *) "virDomainBlockStats", libvirt_virDomainBlockStats, METH_VARARGS, NULL}, + {(char *) "virDomainInterfaceStats", libvirt_virDomainInterfaceStats, METH_VARARGS, NULL}, + {(char *) "virNodeGetCellsFreeMemory", libvirt_virNodeGetCellsFreeMemory, METH_VARARGS, NULL}, + {(char *) "virDomainGetSchedulerType", libvirt_virDomainGetSchedulerType, METH_VARARGS, NULL}, + {(char *) "virDomainGetSchedulerParameters", libvirt_virDomainGetSchedulerParameters, METH_VARARGS, NULL}, + {(char *) "virDomainSetSchedulerParameters", libvirt_virDomainSetSchedulerParameters, METH_VARARGS, NULL}, + {(char *) "virDomainGetVcpus", libvirt_virDomainGetVcpus, METH_VARARGS, NULL}, + {(char *) "virDomainPinVcpu", libvirt_virDomainPinVcpu, METH_VARARGS, NULL}, + {(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}, + {(char *) "virStoragePoolGetUUIDString", libvirt_virStoragePoolGetUUIDString, METH_VARARGS, NULL}, + {(char *) "virStoragePoolLookupByUUID", libvirt_virStoragePoolLookupByUUID, METH_VARARGS, NULL}, + {(char *) "virEventRegisterImpl", libvirt_virEventRegisterImpl, METH_VARARGS, NULL}, + {(char *) "virEventInvokeHandleCallback", libvirt_virEventInvokeHandleCallback, METH_VARARGS, NULL}, + {(char *) "virEventInvokeTimeoutCallback", libvirt_virEventInvokeTimeoutCallback, METH_VARARGS, NULL}, + {(char *) "virNodeListDevices", libvirt_virNodeListDevices, METH_VARARGS, NULL}, + {(char *) "virNodeDeviceListCaps", libvirt_virNodeDeviceListCaps, METH_VARARGS, NULL}, + {(char *) "virSecretGetUUID", libvirt_virSecretGetUUID, METH_VARARGS, NULL}, + {(char *) "virSecretGetUUIDString", libvirt_virSecretGetUUIDString, METH_VARARGS, NULL}, + {(char *) "virSecretLookupByUUID", libvirt_virSecretLookupByUUID, METH_VARARGS, NULL}, + {(char *) "virConnectListSecrets", libvirt_virConnectListSecrets, METH_VARARGS, NULL}, + {(char *) "virSecretGetValue", libvirt_virSecretGetValue, METH_VARARGS, NULL}, + {(char *) "virSecretSetValue", libvirt_virSecretSetValue, METH_VARARGS, NULL}, + {NULL, NULL, 0, NULL} +}; + +void +#ifndef __CYGWIN__ +initlibvirtmod +#else +initcygvirtmod +#endif + (void) +{ + static int initialized = 0; + + if (initialized != 0) + return; + + virInitialize(); + + /* initialize the python extension module */ + Py_InitModule((char *) +#ifndef __CYGWIN__ + "libvirtmod" +#else + "cygvirtmod" +#endif + , libvirtMethods); + + initialized = 1; +} diff --git a/python/libvirt-override.py b/python/libvirt-override.py new file mode 100644 index 0000000000..92c6e03bbe --- /dev/null +++ b/python/libvirt-override.py @@ -0,0 +1,144 @@ +# +# Manually written part of python bindings for libvirt +# + +# On cygwin, the DLL is called cygvirtmod.dll +try: + import libvirtmod +except ImportError, lib_e: + try: + import cygvirtmod as libvirtmod + except ImportError, cyg_e: + if str(cyg_e).count("No module named"): + raise lib_e + +import types + +# The root of all libvirt errors. +class libvirtError(Exception): + def __init__(self, defmsg, conn=None, dom=None, net=None, pool=None, vol=None): + + if dom is not None: + conn = dom._conn + elif net is not None: + conn = net._conn + elif pool is not None: + conn = pool._conn + elif vol is not None: + conn = vol._conn + + # Never call virConnGetLastError(). + # virGetLastError() is now thread local + err = virGetLastError() + if err is None: + msg = defmsg + else: + msg = err[2] + + Exception.__init__(self, msg) + + self.err = err + + def get_error_code(self): + if self.err is None: + return None + return self.err[0] + + def get_error_domain(self): + if self.err is None: + return None + return self.err[1] + + def get_error_message(self): + if self.err is None: + return None + return self.err[2] + + def get_error_level(self): + if self.err is None: + return None + return self.err[3] + + def get_str1(self): + if self.err is None: + return None + return self.err[4] + + def get_str2(self): + if self.err is None: + return None + return self.err[5] + + def get_str3(self): + if self.err is None: + return None + return self.err[6] + + def get_int1(self): + if self.err is None: + return None + return self.err[7] + + def get_int2(self): + if self.err is None: + return None + return self.err[8] + +# +# register the libvirt global error handler +# +def registerErrorHandler(f, ctx): + """Register a Python written function to for error reporting. + The function is called back as f(ctx, error), with error + being a list of information about the error being raised. + Returns 1 in case of success.""" + return libvirtmod.virRegisterErrorHandler(f,ctx) + +def openAuth(uri, auth, flags): + ret = libvirtmod.virConnectOpenAuth(uri, auth, flags) + if ret is None:raise libvirtError('virConnectOpenAuth() failed') + return virConnect(_obj=ret) + + +# +# Return library version. +# +def getVersion (name = None): + """If no name parameter is passed (or name is None) then the + version of the libvirt library is returned as an integer. + + If a name is passed and it refers to a driver linked to the + libvirt library, then this returns a tuple of (library version, + driver version). + + If the name passed refers to a non-existent driver, then you + will get the exception 'no support for hypervisor'. + + Versions numbers are integers: 1000000*major + 1000*minor + release.""" + if name is None: + ret = libvirtmod.virGetVersion (); + else: + ret = libvirtmod.virGetVersion (name); + if ret is None: raise libvirtError ("virGetVersion() failed") + return ret + + +# +# Invoke an EventHandle callback +# +def eventInvokeHandleCallback (watch, fd, event, callback, opaque): + """ + Invoke the Event Impl Handle Callback in C + """ + libvirtmod.virEventInvokeHandleCallback(watch, fd, event, callback, opaque); + +# +# Invoke an EventTimeout callback +# +def eventInvokeTimeoutCallback (timer, callback, opaque): + """ + Invoke the Event Impl Timeout Callback in C + """ + libvirtmod.virEventInvokeTimeoutCallback(timer, callback, opaque); + + diff --git a/python/libvirt-python-api.xml b/python/libvirt-python-api.xml deleted file mode 100644 index 148b89be11..0000000000 --- a/python/libvirt-python-api.xml +++ /dev/null @@ -1,210 +0,0 @@ - - - - - Returns the list of the ID of the domains on the hypervisor - - - - - list the defined domains, stores the pointers to the names in @names - - - - - list the networks, stores the pointers to the names in @names - - - - - list the defined networks, stores the pointers to the names in @names - - - - - Try to lookup a domain on the given hypervisor based on its UUID. - - - - - - Try to lookup a network on the given hypervisor based on its UUID. - - - - - - Extract information about a domain. Note that if the connection used to get the domain is limited only a partial set of the information can be extracted. - - - - - Extract hardware information about the Node. - - - - - Extract the UUID unique Identifier of a domain. - - - - - Fetch globally unique ID of the domain as a string. - - - - - Extract the UUID unique Identifier of a network. - - - - - Fetch globally unique ID of the network as a string. - - - - - Extract the UUID unique Identifier of a storage pool. - - - - - Fetch globally unique ID of the storage pool as a string. - - - - - Extract the autostart flag for a network. - - - - - Extract the autostart flag for a domain - - - - - Extract the autostart flag for a storage pool - - - - - Extracts block device statistics for a domain - - - - - - Extracts interface device statistics for a domain - - - - - - Returns the available memory for a list of cells - - - - - - - Get the scheduler parameters, the @params array will be filled with the values. - - - - - Get the scheduler type. - - - - - Extract information about virtual CPUs of domain, store it in info array and also in cpumaps if this pointer is'nt NULL. - - - - - Dynamically change the real CPUs which can be allocated to a virtual CPU. This function requires privileged access to the hypervisor. - - - - - - - Change the scheduler parameters - - - - - - list the storage pools, stores the pointers to the names in @names - - - - - list the defined storage pool, stores the pointers to the names in @names - - - - - list the storage volumes, stores the pointers to the names in @names - - - - - Extract information about a storage pool. Note that if the connection used to get the domain is limited only a partial set of the information can be extracted. - - - - - Extract information about a storage pool. Note that if the connection used to get the domain is limited only a partial set of the information can be extracted. - - - - - list the node devices - - - - - - - list the node device's capabilities - - - - - Fetches the value associated with a secret. - - - - - - List the defined secret IDs - - - - - Associates a value with a secret. - - - - - - - Try to lookup a secret on the given hypervisor based on its UUID. - - - - - - Extract the UUID unique Identifier of a secret. - - - - - Fetch globally unique ID of the secret as a string. - - - - - diff --git a/python/libvirt_wrap.h b/python/libvirt_wrap.h deleted file mode 100644 index 99d5805f2b..0000000000 --- a/python/libvirt_wrap.h +++ /dev/null @@ -1,196 +0,0 @@ -/* - * libvirt_wrap.h: type wrappers for libvir python bindings - * - * Copyright (C) 2005 Red Hat, Inc. - * - * Daniel Veillard - */ - -#include -#include "libvirt/libvirt.h" -#include "libvirt/virterror.h" - -#ifdef __GNUC__ -#ifdef ATTRIBUTE_UNUSED -#undef ATTRIBUTE_UNUSED -#endif -#ifndef ATTRIBUTE_UNUSED -#define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) -#endif /* ATTRIBUTE_UNUSED */ -#else -#define ATTRIBUTE_UNUSED -#endif - -#define PyvirConnect_Get(v) (((v) == Py_None) ? NULL : \ - (((PyvirConnect_Object *)(v))->obj)) - -typedef struct { - PyObject_HEAD - virConnectPtr obj; -} PyvirConnect_Object; - - -#define PyvirDomain_Get(v) (((v) == Py_None) ? NULL : \ - (((PyvirDomain_Object *)(v))->obj)) - -typedef struct { - PyObject_HEAD - virDomainPtr obj; -} PyvirDomain_Object; - - -#define PyvirNetwork_Get(v) (((v) == Py_None) ? NULL : \ - (((PyvirNetwork_Object *)(v))->obj)) - -typedef struct { - PyObject_HEAD - virNetworkPtr obj; -} PyvirNetwork_Object; - - -#define PyvirInterface_Get(v) (((v) == Py_None) ? NULL : \ - (((PyvirInterface_Object *)(v))->obj)) - -typedef struct { - PyObject_HEAD - virInterfacePtr obj; -} PyvirInterface_Object; - - -#define PyvirStoragePool_Get(v) (((v) == Py_None) ? NULL : \ - (((PyvirStoragePool_Object *)(v))->obj)) - -typedef struct { - PyObject_HEAD - virStoragePoolPtr obj; -} PyvirStoragePool_Object; - - -#define PyvirStorageVol_Get(v) (((v) == Py_None) ? NULL : \ - (((PyvirStorageVol_Object *)(v))->obj)) - -typedef struct { - PyObject_HEAD - virStorageVolPtr obj; -} PyvirStorageVol_Object; - - -#define PyvirNodeDevice_Get(v) (((v) == Py_None) ? NULL : \ - (((PyvirNodeDevice_Object *)(v))->obj)) - -typedef struct { - PyObject_HEAD - virNodeDevicePtr obj; -} PyvirNodeDevice_Object; - -#define PyvirSecret_Get(v) (((v) == Py_None) ? NULL : \ - (((PyvirSecret_Object *)(v))->obj)) - -typedef struct { - PyObject_HEAD - virSecretPtr obj; -} PyvirSecret_Object; - - -#define PyvirEventHandleCallback_Get(v) (((v) == Py_None) ? NULL : \ - (((PyvirEventHandleCallback_Object *)(v))->obj)) - -typedef struct { - PyObject_HEAD - virEventHandleCallback obj; -} PyvirEventHandleCallback_Object; - -#define PyvirEventTimeoutCallback_Get(v) (((v) == Py_None) ? NULL : \ - (((PyvirEventTimeoutCallback_Object *)(v))->obj)) - -typedef struct { - PyObject_HEAD - virEventTimeoutCallback obj; -} PyvirEventTimeoutCallback_Object; - -#define PyvirFreeCallback_Get(v) (((v) == Py_None) ? NULL : \ - (((PyvirFreeCallback_Object *)(v))->obj)) - -typedef struct { - PyObject_HEAD - virFreeCallback obj; -} PyvirFreeCallback_Object; - -#define PyvirVoidPtr_Get(v) (((v) == Py_None) ? NULL : \ - (((PyvirVoidPtr_Object *)(v))->obj)) - -typedef struct { - PyObject_HEAD - void* obj; -} PyvirVoidPtr_Object; - - -PyObject * libvirt_intWrap(int val); -PyObject * libvirt_longWrap(long val); -PyObject * libvirt_ulongWrap(unsigned long val); -PyObject * libvirt_longlongWrap(long long val); -PyObject * libvirt_charPtrWrap(char *str); -PyObject * libvirt_constcharPtrWrap(const char *str); -PyObject * libvirt_charPtrConstWrap(const char *str); -PyObject * libvirt_virConnectPtrWrap(virConnectPtr node); -PyObject * libvirt_virDomainPtrWrap(virDomainPtr node); -PyObject * libvirt_virNetworkPtrWrap(virNetworkPtr node); -PyObject * libvirt_virInterfacePtrWrap(virInterfacePtr node); -PyObject * libvirt_virStoragePoolPtrWrap(virStoragePoolPtr node); -PyObject * libvirt_virStorageVolPtrWrap(virStorageVolPtr node); -PyObject * libvirt_virEventHandleCallbackWrap(virEventHandleCallback node); -PyObject * libvirt_virEventTimeoutCallbackWrap(virEventTimeoutCallback node); -PyObject * libvirt_virFreeCallbackWrap(virFreeCallback node); -PyObject * libvirt_virVoidPtrWrap(void* node); -PyObject * libvirt_virNodeDevicePtrWrap(virNodeDevicePtr node); -PyObject * libvirt_virSecretPtrWrap(virSecretPtr node); - - -/* Provide simple macro statement wrappers (adapted from GLib, in turn from Perl): - * LIBVIRT_STMT_START { statements; } LIBVIRT_STMT_END; - * can be used as a single statement, as in - * if (x) LIBVIRT_STMT_START { ... } LIBVIRT_STMT_END; else ... - * - * When GCC is compiling C code in non-ANSI mode, it will use the - * compiler __extension__ to wrap the statements within `({' and '})' braces. - * When compiling on platforms where configure has defined - * HAVE_DOWHILE_MACROS, statements will be wrapped with `do' and `while (0)'. - * For any other platforms (SunOS4 is known to have this issue), wrap the - * statements with `if (1)' and `else (void) 0'. - */ -#if !(defined (LIBVIRT_STMT_START) && defined (LIBVIRT_STMT_END)) -# if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus) -# define LIBVIRT_STMT_START (void) __extension__ ( -# define LIBVIRT_STMT_END ) -# else /* !(__GNUC__ && !__STRICT_ANSI__ && !__cplusplus) */ -# if defined (HAVE_DOWHILE_MACROS) -# define LIBVIRT_STMT_START do -# define LIBVIRT_STMT_END while (0) -# else /* !HAVE_DOWHILE_MACROS */ -# define LIBVIRT_STMT_START if (1) -# define LIBVIRT_STMT_END else (void) 0 -# endif /* !HAVE_DOWHILE_MACROS */ -# endif /* !(__GNUC__ && !__STRICT_ANSI__ && !__cplusplus) */ -#endif - -#define LIBVIRT_BEGIN_ALLOW_THREADS \ - LIBVIRT_STMT_START { \ - PyThreadState *_save = NULL; \ - if (PyEval_ThreadsInitialized()) \ - _save = PyEval_SaveThread(); - -#define LIBVIRT_END_ALLOW_THREADS \ - if (PyEval_ThreadsInitialized()) \ - PyEval_RestoreThread(_save); \ - } LIBVIRT_STMT_END - -#define LIBVIRT_ENSURE_THREAD_STATE \ - LIBVIRT_STMT_START { \ - PyGILState_STATE _save = PyGILState_UNLOCKED; \ - if (PyEval_ThreadsInitialized()) \ - _save = PyGILState_Ensure(); - -#define LIBVIRT_RELEASE_THREAD_STATE \ - if (PyEval_ThreadsInitialized()) \ - PyGILState_Release(_save); \ - } LIBVIRT_STMT_END diff --git a/python/types.c b/python/types.c deleted file mode 100644 index c445f5fa52..0000000000 --- a/python/types.c +++ /dev/null @@ -1,269 +0,0 @@ -/* - * types.c: converter functions between the internal representation - * and the Python objects - * - * Copyright (C) 2005, 2007 Red Hat, Inc. - * - * Daniel Veillard - */ - -#include - -/* Horrible kludge to work around even more horrible name-space pollution - * via Python.h. That file includes /usr/include/python2.5/pyconfig*.h, - * which has over 180 autoconf-style HAVE_* definitions. Shame on them. */ -#undef HAVE_PTHREAD_H - -#include "libvirt_wrap.h" - -PyObject * -libvirt_intWrap(int val) -{ - PyObject *ret; - ret = PyInt_FromLong((long) val); - return (ret); -} - -PyObject * -libvirt_longWrap(long val) -{ - PyObject *ret; - ret = PyInt_FromLong(val); - return (ret); -} - -PyObject * -libvirt_ulongWrap(unsigned long val) -{ - PyObject *ret; - ret = PyLong_FromLong(val); - return (ret); -} - -PyObject * -libvirt_longlongWrap(long long val) -{ - PyObject *ret; - ret = PyLong_FromUnsignedLongLong((unsigned long long) val); - return (ret); -} - -PyObject * -libvirt_charPtrWrap(char *str) -{ - PyObject *ret; - - if (str == NULL) { - Py_INCREF(Py_None); - return (Py_None); - } - ret = PyString_FromString(str); - free(str); - return (ret); -} - -PyObject * -libvirt_constcharPtrWrap(const char *str) -{ - PyObject *ret; - - if (str == NULL) { - Py_INCREF(Py_None); - return (Py_None); - } - ret = PyString_FromString(str); - return (ret); -} - -PyObject * -libvirt_charPtrConstWrap(const char *str) -{ - PyObject *ret; - - if (str == NULL) { - Py_INCREF(Py_None); - return (Py_None); - } - ret = PyString_FromString(str); - return (ret); -} - -PyObject * -libvirt_virDomainPtrWrap(virDomainPtr node) -{ - PyObject *ret; - - if (node == NULL) { - Py_INCREF(Py_None); - return (Py_None); - } - ret = - PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "virDomainPtr", - NULL); - return (ret); -} - -PyObject * -libvirt_virNetworkPtrWrap(virNetworkPtr node) -{ - PyObject *ret; - - if (node == NULL) { - Py_INCREF(Py_None); - return (Py_None); - } - ret = - PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "virNetworkPtr", - NULL); - return (ret); -} - -PyObject * -libvirt_virInterfacePtrWrap(virInterfacePtr node) -{ - PyObject *ret; - - if (node == NULL) { - Py_INCREF(Py_None); - return (Py_None); - } - ret = - PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "virInterfacePtr", - NULL); - return (ret); -} - -PyObject * -libvirt_virStoragePoolPtrWrap(virStoragePoolPtr node) -{ - PyObject *ret; - - if (node == NULL) { - Py_INCREF(Py_None); - return (Py_None); - } - ret = - PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "virStoragePoolPtr", - NULL); - return (ret); -} - -PyObject * -libvirt_virStorageVolPtrWrap(virStorageVolPtr node) -{ - PyObject *ret; - - if (node == NULL) { - Py_INCREF(Py_None); - return (Py_None); - } - ret = - PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "virStorageVolPtr", - NULL); - return (ret); -} - -PyObject * -libvirt_virConnectPtrWrap(virConnectPtr node) -{ - PyObject *ret; - - if (node == NULL) { - Py_INCREF(Py_None); - return (Py_None); - } - ret = - PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "virConnectPtr", - NULL); - return (ret); -} - -PyObject * -libvirt_virNodeDevicePtrWrap(virNodeDevicePtr node) -{ - PyObject *ret; - - if (node == NULL) { - Py_INCREF(Py_None); - return (Py_None); - } - ret = - PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "virNodeDevicePtr", - NULL); - return (ret); -} - -PyObject * -libvirt_virSecretPtrWrap(virSecretPtr node) -{ - PyObject *ret; - - if (node == NULL) { - Py_INCREF(Py_None); - return Py_None; - } - ret = PyCObject_FromVoidPtrAndDesc(node, (char *) "virSecretPtr", NULL); - return (ret); -} - -PyObject * -libvirt_virEventHandleCallbackWrap(virEventHandleCallback node) -{ - PyObject *ret; - - if (node == NULL) { - Py_INCREF(Py_None); - printf("%s: WARNING - Wrapping None\n", __func__); - return (Py_None); - } - ret = - PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "virEventHandleCallback", - NULL); - return (ret); -} - -PyObject * -libvirt_virEventTimeoutCallbackWrap(virEventTimeoutCallback node) -{ - PyObject *ret; - - if (node == NULL) { - printf("%s: WARNING - Wrapping None\n", __func__); - Py_INCREF(Py_None); - return (Py_None); - } - ret = - PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "virEventTimeoutCallback", - NULL); - return (ret); -} - -PyObject * -libvirt_virFreeCallbackWrap(virFreeCallback node) -{ - PyObject *ret; - - if (node == NULL) { - Py_INCREF(Py_None); - return (Py_None); - } - ret = - PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "virFreeCallback", - NULL); - return (ret); -} - -PyObject * -libvirt_virVoidPtrWrap(void* node) -{ - PyObject *ret; - - if (node == NULL) { - Py_INCREF(Py_None); - return (Py_None); - } - ret = - PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "void*", - NULL); - return (ret); -} diff --git a/python/typewrappers.c b/python/typewrappers.c new file mode 100644 index 0000000000..0d8ac97583 --- /dev/null +++ b/python/typewrappers.c @@ -0,0 +1,269 @@ +/* + * types.c: converter functions between the internal representation + * and the Python objects + * + * Copyright (C) 2005, 2007 Red Hat, Inc. + * + * Daniel Veillard + */ + +#include + +/* Horrible kludge to work around even more horrible name-space pollution + * via Python.h. That file includes /usr/include/python2.5/pyconfig*.h, + * which has over 180 autoconf-style HAVE_* definitions. Shame on them. */ +#undef HAVE_PTHREAD_H + +#include "typewrappers.h" + +PyObject * +libvirt_intWrap(int val) +{ + PyObject *ret; + ret = PyInt_FromLong((long) val); + return (ret); +} + +PyObject * +libvirt_longWrap(long val) +{ + PyObject *ret; + ret = PyInt_FromLong(val); + return (ret); +} + +PyObject * +libvirt_ulongWrap(unsigned long val) +{ + PyObject *ret; + ret = PyLong_FromLong(val); + return (ret); +} + +PyObject * +libvirt_longlongWrap(long long val) +{ + PyObject *ret; + ret = PyLong_FromUnsignedLongLong((unsigned long long) val); + return (ret); +} + +PyObject * +libvirt_charPtrWrap(char *str) +{ + PyObject *ret; + + if (str == NULL) { + Py_INCREF(Py_None); + return (Py_None); + } + ret = PyString_FromString(str); + free(str); + return (ret); +} + +PyObject * +libvirt_constcharPtrWrap(const char *str) +{ + PyObject *ret; + + if (str == NULL) { + Py_INCREF(Py_None); + return (Py_None); + } + ret = PyString_FromString(str); + return (ret); +} + +PyObject * +libvirt_charPtrConstWrap(const char *str) +{ + PyObject *ret; + + if (str == NULL) { + Py_INCREF(Py_None); + return (Py_None); + } + ret = PyString_FromString(str); + return (ret); +} + +PyObject * +libvirt_virDomainPtrWrap(virDomainPtr node) +{ + PyObject *ret; + + if (node == NULL) { + Py_INCREF(Py_None); + return (Py_None); + } + ret = + PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "virDomainPtr", + NULL); + return (ret); +} + +PyObject * +libvirt_virNetworkPtrWrap(virNetworkPtr node) +{ + PyObject *ret; + + if (node == NULL) { + Py_INCREF(Py_None); + return (Py_None); + } + ret = + PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "virNetworkPtr", + NULL); + return (ret); +} + +PyObject * +libvirt_virInterfacePtrWrap(virInterfacePtr node) +{ + PyObject *ret; + + if (node == NULL) { + Py_INCREF(Py_None); + return (Py_None); + } + ret = + PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "virInterfacePtr", + NULL); + return (ret); +} + +PyObject * +libvirt_virStoragePoolPtrWrap(virStoragePoolPtr node) +{ + PyObject *ret; + + if (node == NULL) { + Py_INCREF(Py_None); + return (Py_None); + } + ret = + PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "virStoragePoolPtr", + NULL); + return (ret); +} + +PyObject * +libvirt_virStorageVolPtrWrap(virStorageVolPtr node) +{ + PyObject *ret; + + if (node == NULL) { + Py_INCREF(Py_None); + return (Py_None); + } + ret = + PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "virStorageVolPtr", + NULL); + return (ret); +} + +PyObject * +libvirt_virConnectPtrWrap(virConnectPtr node) +{ + PyObject *ret; + + if (node == NULL) { + Py_INCREF(Py_None); + return (Py_None); + } + ret = + PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "virConnectPtr", + NULL); + return (ret); +} + +PyObject * +libvirt_virNodeDevicePtrWrap(virNodeDevicePtr node) +{ + PyObject *ret; + + if (node == NULL) { + Py_INCREF(Py_None); + return (Py_None); + } + ret = + PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "virNodeDevicePtr", + NULL); + return (ret); +} + +PyObject * +libvirt_virSecretPtrWrap(virSecretPtr node) +{ + PyObject *ret; + + if (node == NULL) { + Py_INCREF(Py_None); + return Py_None; + } + ret = PyCObject_FromVoidPtrAndDesc(node, (char *) "virSecretPtr", NULL); + return (ret); +} + +PyObject * +libvirt_virEventHandleCallbackWrap(virEventHandleCallback node) +{ + PyObject *ret; + + if (node == NULL) { + Py_INCREF(Py_None); + printf("%s: WARNING - Wrapping None\n", __func__); + return (Py_None); + } + ret = + PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "virEventHandleCallback", + NULL); + return (ret); +} + +PyObject * +libvirt_virEventTimeoutCallbackWrap(virEventTimeoutCallback node) +{ + PyObject *ret; + + if (node == NULL) { + printf("%s: WARNING - Wrapping None\n", __func__); + Py_INCREF(Py_None); + return (Py_None); + } + ret = + PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "virEventTimeoutCallback", + NULL); + return (ret); +} + +PyObject * +libvirt_virFreeCallbackWrap(virFreeCallback node) +{ + PyObject *ret; + + if (node == NULL) { + Py_INCREF(Py_None); + return (Py_None); + } + ret = + PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "virFreeCallback", + NULL); + return (ret); +} + +PyObject * +libvirt_virVoidPtrWrap(void* node) +{ + PyObject *ret; + + if (node == NULL) { + Py_INCREF(Py_None); + return (Py_None); + } + ret = + PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "void*", + NULL); + return (ret); +} diff --git a/python/typewrappers.h b/python/typewrappers.h new file mode 100644 index 0000000000..99d5805f2b --- /dev/null +++ b/python/typewrappers.h @@ -0,0 +1,196 @@ +/* + * libvirt_wrap.h: type wrappers for libvir python bindings + * + * Copyright (C) 2005 Red Hat, Inc. + * + * Daniel Veillard + */ + +#include +#include "libvirt/libvirt.h" +#include "libvirt/virterror.h" + +#ifdef __GNUC__ +#ifdef ATTRIBUTE_UNUSED +#undef ATTRIBUTE_UNUSED +#endif +#ifndef ATTRIBUTE_UNUSED +#define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) +#endif /* ATTRIBUTE_UNUSED */ +#else +#define ATTRIBUTE_UNUSED +#endif + +#define PyvirConnect_Get(v) (((v) == Py_None) ? NULL : \ + (((PyvirConnect_Object *)(v))->obj)) + +typedef struct { + PyObject_HEAD + virConnectPtr obj; +} PyvirConnect_Object; + + +#define PyvirDomain_Get(v) (((v) == Py_None) ? NULL : \ + (((PyvirDomain_Object *)(v))->obj)) + +typedef struct { + PyObject_HEAD + virDomainPtr obj; +} PyvirDomain_Object; + + +#define PyvirNetwork_Get(v) (((v) == Py_None) ? NULL : \ + (((PyvirNetwork_Object *)(v))->obj)) + +typedef struct { + PyObject_HEAD + virNetworkPtr obj; +} PyvirNetwork_Object; + + +#define PyvirInterface_Get(v) (((v) == Py_None) ? NULL : \ + (((PyvirInterface_Object *)(v))->obj)) + +typedef struct { + PyObject_HEAD + virInterfacePtr obj; +} PyvirInterface_Object; + + +#define PyvirStoragePool_Get(v) (((v) == Py_None) ? NULL : \ + (((PyvirStoragePool_Object *)(v))->obj)) + +typedef struct { + PyObject_HEAD + virStoragePoolPtr obj; +} PyvirStoragePool_Object; + + +#define PyvirStorageVol_Get(v) (((v) == Py_None) ? NULL : \ + (((PyvirStorageVol_Object *)(v))->obj)) + +typedef struct { + PyObject_HEAD + virStorageVolPtr obj; +} PyvirStorageVol_Object; + + +#define PyvirNodeDevice_Get(v) (((v) == Py_None) ? NULL : \ + (((PyvirNodeDevice_Object *)(v))->obj)) + +typedef struct { + PyObject_HEAD + virNodeDevicePtr obj; +} PyvirNodeDevice_Object; + +#define PyvirSecret_Get(v) (((v) == Py_None) ? NULL : \ + (((PyvirSecret_Object *)(v))->obj)) + +typedef struct { + PyObject_HEAD + virSecretPtr obj; +} PyvirSecret_Object; + + +#define PyvirEventHandleCallback_Get(v) (((v) == Py_None) ? NULL : \ + (((PyvirEventHandleCallback_Object *)(v))->obj)) + +typedef struct { + PyObject_HEAD + virEventHandleCallback obj; +} PyvirEventHandleCallback_Object; + +#define PyvirEventTimeoutCallback_Get(v) (((v) == Py_None) ? NULL : \ + (((PyvirEventTimeoutCallback_Object *)(v))->obj)) + +typedef struct { + PyObject_HEAD + virEventTimeoutCallback obj; +} PyvirEventTimeoutCallback_Object; + +#define PyvirFreeCallback_Get(v) (((v) == Py_None) ? NULL : \ + (((PyvirFreeCallback_Object *)(v))->obj)) + +typedef struct { + PyObject_HEAD + virFreeCallback obj; +} PyvirFreeCallback_Object; + +#define PyvirVoidPtr_Get(v) (((v) == Py_None) ? NULL : \ + (((PyvirVoidPtr_Object *)(v))->obj)) + +typedef struct { + PyObject_HEAD + void* obj; +} PyvirVoidPtr_Object; + + +PyObject * libvirt_intWrap(int val); +PyObject * libvirt_longWrap(long val); +PyObject * libvirt_ulongWrap(unsigned long val); +PyObject * libvirt_longlongWrap(long long val); +PyObject * libvirt_charPtrWrap(char *str); +PyObject * libvirt_constcharPtrWrap(const char *str); +PyObject * libvirt_charPtrConstWrap(const char *str); +PyObject * libvirt_virConnectPtrWrap(virConnectPtr node); +PyObject * libvirt_virDomainPtrWrap(virDomainPtr node); +PyObject * libvirt_virNetworkPtrWrap(virNetworkPtr node); +PyObject * libvirt_virInterfacePtrWrap(virInterfacePtr node); +PyObject * libvirt_virStoragePoolPtrWrap(virStoragePoolPtr node); +PyObject * libvirt_virStorageVolPtrWrap(virStorageVolPtr node); +PyObject * libvirt_virEventHandleCallbackWrap(virEventHandleCallback node); +PyObject * libvirt_virEventTimeoutCallbackWrap(virEventTimeoutCallback node); +PyObject * libvirt_virFreeCallbackWrap(virFreeCallback node); +PyObject * libvirt_virVoidPtrWrap(void* node); +PyObject * libvirt_virNodeDevicePtrWrap(virNodeDevicePtr node); +PyObject * libvirt_virSecretPtrWrap(virSecretPtr node); + + +/* Provide simple macro statement wrappers (adapted from GLib, in turn from Perl): + * LIBVIRT_STMT_START { statements; } LIBVIRT_STMT_END; + * can be used as a single statement, as in + * if (x) LIBVIRT_STMT_START { ... } LIBVIRT_STMT_END; else ... + * + * When GCC is compiling C code in non-ANSI mode, it will use the + * compiler __extension__ to wrap the statements within `({' and '})' braces. + * When compiling on platforms where configure has defined + * HAVE_DOWHILE_MACROS, statements will be wrapped with `do' and `while (0)'. + * For any other platforms (SunOS4 is known to have this issue), wrap the + * statements with `if (1)' and `else (void) 0'. + */ +#if !(defined (LIBVIRT_STMT_START) && defined (LIBVIRT_STMT_END)) +# if defined (__GNUC__) && !defined (__STRICT_ANSI__) && !defined (__cplusplus) +# define LIBVIRT_STMT_START (void) __extension__ ( +# define LIBVIRT_STMT_END ) +# else /* !(__GNUC__ && !__STRICT_ANSI__ && !__cplusplus) */ +# if defined (HAVE_DOWHILE_MACROS) +# define LIBVIRT_STMT_START do +# define LIBVIRT_STMT_END while (0) +# else /* !HAVE_DOWHILE_MACROS */ +# define LIBVIRT_STMT_START if (1) +# define LIBVIRT_STMT_END else (void) 0 +# endif /* !HAVE_DOWHILE_MACROS */ +# endif /* !(__GNUC__ && !__STRICT_ANSI__ && !__cplusplus) */ +#endif + +#define LIBVIRT_BEGIN_ALLOW_THREADS \ + LIBVIRT_STMT_START { \ + PyThreadState *_save = NULL; \ + if (PyEval_ThreadsInitialized()) \ + _save = PyEval_SaveThread(); + +#define LIBVIRT_END_ALLOW_THREADS \ + if (PyEval_ThreadsInitialized()) \ + PyEval_RestoreThread(_save); \ + } LIBVIRT_STMT_END + +#define LIBVIRT_ENSURE_THREAD_STATE \ + LIBVIRT_STMT_START { \ + PyGILState_STATE _save = PyGILState_UNLOCKED; \ + if (PyEval_ThreadsInitialized()) \ + _save = PyGILState_Ensure(); + +#define LIBVIRT_RELEASE_THREAD_STATE \ + if (PyEval_ThreadsInitialized()) \ + PyGILState_Release(_save); \ + } LIBVIRT_STMT_END diff --git a/python/virConnect.py b/python/virConnect.py deleted file mode 100644 index 1fdf548a57..0000000000 --- a/python/virConnect.py +++ /dev/null @@ -1,43 +0,0 @@ - def __del__(self): - try: - for cb,opaque in self.domainEventCallbacks.items(): - del self.domainEventCallbacks[cb] - self.domainEventCallbacks = None - libvirtmod.virConnectDomainEventDeregister(self._o, self) - except AttributeError: - pass - - if self._o != None: - libvirtmod.virConnectClose(self._o) - self._o = None - - def domainEventDeregister(self, cb): - """Removes a Domain Event Callback. De-registering for a - domain callback will disable delivery of this event type """ - try: - del self.domainEventCallbacks[cb] - if len(self.domainEventCallbacks) == 0: - ret = libvirtmod.virConnectDomainEventDeregister(self._o, self) - if ret == -1: raise libvirtError ('virConnectDomainEventDeregister() failed', conn=self) - except AttributeError: - pass - - def domainEventRegister(self, cb, opaque): - """Adds a Domain Event Callback. Registering for a domain - callback will enable delivery of the events """ - try: - self.domainEventCallbacks[cb] = opaque - except AttributeError: - self.domainEventCallbacks = {cb:opaque} - ret = libvirtmod.virConnectDomainEventRegister(self._o, self) - if ret == -1: raise libvirtError ('virConnectDomainEventRegister() failed', conn=self) - - def dispatchDomainEventCallbacks(self, dom, event, detail): - """Dispatches events to python user domain event callbacks - """ - try: - for cb,opaque in self.domainEventCallbacks.items(): - cb(self,dom,event,detail,opaque) - return 0 - except AttributeError: - pass