]> xenbits.xensource.com Git - libvirt.git/commitdiff
Re-arrange python generator to make it clear what's auto-generated
authorDaniel P. Berrange <berrange@redhat.com>
Wed, 16 Sep 2009 13:03:53 +0000 (14:03 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Mon, 21 Sep 2009 13:41:46 +0000 (14:41 +0100)
* 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

16 files changed:
python/.gitignore
python/Makefile.am
python/README [new file with mode: 0644]
python/generator.py
python/libvir.c [deleted file]
python/libvir.py [deleted file]
python/libvirt-override-api.xml [new file with mode: 0644]
python/libvirt-override-virConnect.py [new file with mode: 0644]
python/libvirt-override.c [new file with mode: 0644]
python/libvirt-override.py [new file with mode: 0644]
python/libvirt-python-api.xml [deleted file]
python/libvirt_wrap.h [deleted file]
python/types.c [deleted file]
python/typewrappers.c [new file with mode: 0644]
python/typewrappers.h [new file with mode: 0644]
python/virConnect.py [deleted file]

index db6c70679677a8379411a8fc788a2c321a49b8f5..c191f74206c6cb0ffb791d4423e2f66b44acc86f 100644 (file)
@@ -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
index a7c342e7cf74109e3eda624b695b9b0fd7c6ef2d..95ae84d2e466f8cf0d97d730cdf7a34c97176203 100644 (file)
@@ -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 (file)
index 0000000..02d4cc4
--- /dev/null
@@ -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
index ad9c54423b3a6b2958eea57dfc33f539869c8601..c34cb347022f9af42f082d04dfcdaaeab48d62d7 100755 (executable)
@@ -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 <Python.h>\n")
     wrapper.write("#include <libvirt/libvirt.h>\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 "<classname>.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 (file)
index d4f1eb2..0000000
+++ /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 <veillard@redhat.com>
- */
-
-#include <config.h>
-
-/* Horrible kludge to work around even more horrible name-space pollution
-   via Python.h.  That file includes /usr/include/python2.5/pyconfig*.h,
-   which has over 180 autoconf-style HAVE_* definitions.  Shame on them.  */
-#undef HAVE_PTHREAD_H
-
-#include <Python.h>
-#include "libvirt/libvirt.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 (file)
index 3cda8dc..0000000
+++ /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 (file)
index 0000000..148b89b
--- /dev/null
@@ -0,0 +1,210 @@
+<?xml version="1.0"?>
+<api name='libvir-python'>
+  <symbols>
+    <function name="virConnectListDomainsID" file='python'>
+      <info>Returns the list of the ID of the domains on the hypervisor</info>
+      <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
+      <return type='int *' info="the list of ID or None in case of error"/>
+    </function>
+    <function name='virConnectListDefinedDomains' file='python'>
+      <info>list the defined domains, stores the pointers to the names in @names</info>
+      <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
+      <return type='str *' info='the list of Names of None in case of error'/>
+    </function>
+    <function name='virConnectListNetworks' file='python'>
+      <info>list the networks, stores the pointers to the names in @names</info>
+      <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
+      <return type='str *' info='the list of Names of None in case of error'/>
+    </function>
+    <function name='virConnectListDefinedNetworks' file='python'>
+      <info>list the defined networks, stores the pointers to the names in @names</info>
+      <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
+      <return type='str *' info='the list of Names of None in case of error'/>
+    </function>
+    <function name='virDomainLookupByUUID' file='python'>
+      <info>Try to lookup a domain on the given hypervisor based on its UUID.</info>
+      <return type='virDomainPtr' info='a new domain object or NULL in case of failure'/>
+      <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
+      <arg name='uuid' type='const unsigned char *' info='the UUID string for the domain, must be 16 bytes'/>
+    </function>
+    <function name='virNetworkLookupByUUID' file='python'>
+      <info>Try to lookup a network on the given hypervisor based on its UUID.</info>
+      <return type='virNetworkPtr' info='a new network object or NULL in case of failure'/>
+      <arg name='conn' type='virNetworkPtr' info='pointer to the hypervisor connection'/>
+      <arg name='uuid' type='const unsigned char *' info='the UUID string for the network, must be 16 bytes'/>
+    </function>
+    <function name='virDomainGetInfo' file='python'>
+      <info>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.</info>
+      <return type='int *' info='the list of information or None in case of error'/>
+      <arg name='domain' type='virDomainPtr' info='a domain object'/>
+    </function>
+    <function name='virNodeGetInfo' file='python'>
+      <info>Extract hardware information about the Node.</info>
+      <return type='int *' info='the list of information or None in case of error'/>
+      <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
+    </function>
+    <function name='virDomainGetUUID' file='python'>
+      <info>Extract the UUID unique Identifier of a domain.</info>
+      <return type='char *' info='the 16 bytes string or None in case of error'/>
+      <arg name='domain' type='virDomainPtr' info='a domain object'/>
+    </function>
+    <function name='virDomainGetUUIDString' file='python'>
+      <info>Fetch globally unique ID of the domain as a string.</info>
+      <return type='char *' info='the UUID string or None in case of error'/>
+      <arg name='pool' type='virDomainPtr' info='a domain object'/>
+    </function>
+    <function name='virNetworkGetUUID' file='python'>
+      <info>Extract the UUID unique Identifier of a network.</info>
+      <return type='char *' info='the 16 bytes string or None in case of error'/>
+      <arg name='domain' type='virNetworkPtr' info='a network object'/>
+    </function>
+    <function name='virNetworkGetUUIDString' file='python'>
+      <info>Fetch globally unique ID of the network as a string.</info>
+      <return type='char *' info='the UUID string or None in case of error'/>
+      <arg name='net' type='virNetworkPtr' info='a network object'/>
+    </function>
+    <function name='virStoragePoolGetUUID' file='python'>
+      <info>Extract the UUID unique Identifier of a storage pool.</info>
+      <return type='char *' info='the 16 bytes string or None in case of error'/>
+      <arg name='pool' type='virStoragePoolPtr' info='a storage pool object'/>
+    </function>
+    <function name='virStoragePoolGetUUIDString' file='python'>
+      <info>Fetch globally unique ID of the storage pool as a string.</info>
+      <return type='char *' info='the UUID string or None in case of error'/>
+      <arg name='pool' type='virStoragePoolPtr' info='a storage pool object'/>
+    </function>
+    <function name='virNetworkGetAutostart' file='python'>
+      <info>Extract the autostart flag for a network.</info>
+      <return type='int' info='the autostart flag, or None in case of error'/>
+      <arg name='domain' type='virNetworkPtr' info='a network object'/>
+    </function>
+    <function name='virDomainGetAutostart' file='python'>
+      <info>Extract the autostart flag for a domain</info>
+      <return type='int' info='the autostart flag, or None in case of error'/>
+      <arg name='domain' type='virDomainPtr' info='a network object'/>
+    </function>
+    <function name='virStoragePoolGetAutostart' file='python'>
+      <info>Extract the autostart flag for a storage pool</info>
+      <return type='int' info='the autostart flag, or None in case of error'/>
+      <arg name='pool' type='virStoragePoolPtr' info='a storage pool object'/>
+    </function>
+    <function name='virDomainBlockStats' file='python'>
+      <info>Extracts block device statistics for a domain</info>
+      <return type='virDomainBlockStats' info='a tuple of statistics'/>
+      <arg name='domain' type='virDomainPtr' info='a domain object'/>
+      <arg name='path' type='char *' info='the path for the block device'/>
+    </function>
+    <function name='virDomainInterfaceStats' file='python'>
+      <info>Extracts interface device statistics for a domain</info>
+      <return type='virDomainInterfaceStats' info='a tuple of statistics'/>
+      <arg name='domain' type='virDomainPtr' info='a domain object'/>
+      <arg name='path' type='char *' info='the path for the interface device'/>
+    </function>
+    <function name="virNodeGetCellsFreeMemory" file='python'>
+      <info>Returns the available memory for a list of cells</info>
+      <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
+      <arg name='startCell' type='int' info='first cell in the list'/>
+      <arg name='maxCells' type='int' info='number of cell in the list'/>
+      <return type='int *' info="the list available memory in the cells"/>
+    </function>
+    <function name='virDomainGetSchedulerParameters' file='python'>
+      <info>Get the scheduler parameters, the @params array will be filled with the values.</info>
+      <return type='int' info='-1 in case of error, 0 in case of success.'/>
+      <arg name='domain' type='virDomainPtr' info='pointer to domain object'/>
+    </function>
+    <function name='virDomainGetSchedulerType' file='python'>
+      <info>Get the scheduler type.</info>
+      <return type='char *' info='NULL in case of error. The caller must free the returned string.'/>
+      <arg name='domain' type='virDomainPtr' info='pointer to domain object'/>
+    </function>
+    <function name='virDomainGetVcpus' file='python'>
+      <info>Extract information about virtual CPUs of domain, store it in info array and also in cpumaps if this pointer is&apos;nt NULL.</info>
+      <return type='int' info='the number of info filled in case of success, -1 in case of failure.'/>
+      <arg name='domain' type='virDomainPtr' info='pointer to domain object, or NULL for Domain0'/>
+    </function>
+    <function name='virDomainPinVcpu' file='python'>
+      <info>Dynamically change the real CPUs which can be allocated to a virtual CPU. This function requires privileged access to the hypervisor.</info>
+      <return type='int' info='0 in case of success, -1 in case of failure.'/>
+      <arg name='domain' type='virDomainPtr' info='pointer to domain object, or NULL for Domain0'/>
+      <arg name='vcpu' type='unsigned int' info='virtual CPU number'/>
+      <arg name='cpumap' type='unsigned char *' info='pointer to a bit map of real CPUs (in 8-bit bytes) (IN) Each bit set to 1 means that corresponding CPU is usable. Bytes are stored in little-endian order: CPU0-7, 8-15... In each byte, lowest CPU number is least significant bit.'/>
+    </function>
+    <function name='virDomainSetSchedulerParameters' file='python'>
+      <info>Change the scheduler parameters</info>
+      <return type='int' info='-1 in case of error, 0 in case of success.'/>
+      <arg name='domain' type='virDomainPtr' info='pointer to domain object'/>
+      <arg name='params' type='virSchedParameterPtr' info='pointer to scheduler parameter objects'/>
+    </function>
+    <function name='virConnectListStoragePools' file='python'>
+      <info>list the storage pools, stores the pointers to the names in @names</info>
+      <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
+      <return type='str *' info='the list of Names of None in case of error'/>
+    </function>
+    <function name='virConnectListDefinedStoragePools' file='python'>
+      <info>list the defined storage pool, stores the pointers to the names in @names</info>
+      <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
+      <return type='str *' info='the list of Names of None in case of error'/>
+    </function>
+    <function name='virStoragePoolListVolumes' file='python'>
+      <info>list the storage volumes, stores the pointers to the names in @names</info>
+      <arg name='pool' type='virStoragePoolPtr' info='pointer to the storage pool'/>
+      <return type='str *' info='the list of Names of None in case of error'/>
+    </function>
+    <function name='virStoragePoolGetInfo' file='python'>
+      <info>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.</info>
+      <return type='int *' info='the list of information or None in case of error'/>
+      <arg name='pool' type='virStoragePoolPtr' info='a storage pool object'/>
+    </function>
+    <function name='virStorageVolGetInfo' file='python'>
+      <info>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.</info>
+      <return type='int *' info='the list of information or None in case of error'/>
+      <arg name='vol' type='virStorageVolPtr' info='a storage vol object'/>
+    </function>
+    <function name='virNodeListDevices' file='python'>
+      <info>list the node devices</info>
+      <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
+      <arg name='cap' type='const unsigned char *' info='capability name'/>
+      <arg name='flags' type='unsigned int' info='flags (unused; pass 0)'/>
+      <return type='str *' info='the list of Names or None in case of error'/>
+    </function>
+    <function name='virNodeDeviceListCaps' file='python'>
+      <info>list the node device's capabilities</info>
+      <arg name='dev' type='virNodeDevicePtr' info='pointer to the node device'/>
+      <return type='str *' info='the list of Names or None in case of error'/>
+    </function>
+    <function name='virSecretGetValue' file='libvirt' module='libvirt'>
+      <info>Fetches the value associated with a secret.</info>
+      <return type='char *' info='the secret value or None in case of error'/>
+      <arg name='secret' type='virSecretPtr' info='virSecret secret'/>
+      <arg name='flags' type='unsigned int' info='flags (unused; pass 0)'/>
+    </function>
+    <function name='virConnectListSecrets' file='libvirt' module='libvirt'>
+      <info>List the defined secret IDs</info>
+      <arg name='conn' type='virConnectPtr' info='virConnect connection'/>
+      <return type='str *' info='the list of secret IDs or None in case of error'/>
+    </function>
+    <function name='virSecretSetValue' file='libvirt' module='libvirt'>
+      <info>Associates a value with a secret.</info>
+      <return type='int' info='0 on success, -1 on failure.'/>
+      <arg name='secret' type='virSecretPtr' info='virSecret secret'/>
+      <arg name='value' type='const char *' info='The secret value'/>
+      <arg name='flags' type='unsigned int' info='flags (unused; pass 0)'/>
+    </function>
+    <function name='virSecretLookupByUUID' file='python'>
+      <info>Try to lookup a secret on the given hypervisor based on its UUID.</info>
+      <return type='virSecretPtr' info='a new secret object or NULL in case of failure'/>
+      <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
+      <arg name='uuid' type='const unsigned char *' info='the UUID string for the secret, must be 16 bytes'/>
+    </function>
+    <function name='virSecretGetUUID' file='python'>
+      <info>Extract the UUID unique Identifier of a secret.</info>
+      <return type='char *' info='the 16 bytes string or None in case of error'/>
+      <arg name='secret' type='virSecretPtr' info='a secret object'/>
+    </function>
+    <function name='virSecretGetUUIDString' file='python'>
+      <info>Fetch globally unique ID of the secret as a string.</info>
+      <return type='char *' info='the UUID string or None in case of error'/>
+      <arg name='secret' type='virSecretPtr' info='a secret object'/>
+    </function>
+  </symbols>
+</api>
diff --git a/python/libvirt-override-virConnect.py b/python/libvirt-override-virConnect.py
new file mode 100644 (file)
index 0000000..1fdf548
--- /dev/null
@@ -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 (file)
index 0000000..5d24fd2
--- /dev/null
@@ -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 <veillard@redhat.com>
+ */
+
+#include <config.h>
+
+/* Horrible kludge to work around even more horrible name-space pollution
+   via Python.h.  That file includes /usr/include/python2.5/pyconfig*.h,
+   which has over 180 autoconf-style HAVE_* definitions.  Shame on them.  */
+#undef HAVE_PTHREAD_H
+
+#include <Python.h>
+#include "libvirt/libvirt.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 (file)
index 0000000..92c6e03
--- /dev/null
@@ -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 (file)
index 148b89b..0000000
+++ /dev/null
@@ -1,210 +0,0 @@
-<?xml version="1.0"?>
-<api name='libvir-python'>
-  <symbols>
-    <function name="virConnectListDomainsID" file='python'>
-      <info>Returns the list of the ID of the domains on the hypervisor</info>
-      <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
-      <return type='int *' info="the list of ID or None in case of error"/>
-    </function>
-    <function name='virConnectListDefinedDomains' file='python'>
-      <info>list the defined domains, stores the pointers to the names in @names</info>
-      <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
-      <return type='str *' info='the list of Names of None in case of error'/>
-    </function>
-    <function name='virConnectListNetworks' file='python'>
-      <info>list the networks, stores the pointers to the names in @names</info>
-      <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
-      <return type='str *' info='the list of Names of None in case of error'/>
-    </function>
-    <function name='virConnectListDefinedNetworks' file='python'>
-      <info>list the defined networks, stores the pointers to the names in @names</info>
-      <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
-      <return type='str *' info='the list of Names of None in case of error'/>
-    </function>
-    <function name='virDomainLookupByUUID' file='python'>
-      <info>Try to lookup a domain on the given hypervisor based on its UUID.</info>
-      <return type='virDomainPtr' info='a new domain object or NULL in case of failure'/>
-      <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
-      <arg name='uuid' type='const unsigned char *' info='the UUID string for the domain, must be 16 bytes'/>
-    </function>
-    <function name='virNetworkLookupByUUID' file='python'>
-      <info>Try to lookup a network on the given hypervisor based on its UUID.</info>
-      <return type='virNetworkPtr' info='a new network object or NULL in case of failure'/>
-      <arg name='conn' type='virNetworkPtr' info='pointer to the hypervisor connection'/>
-      <arg name='uuid' type='const unsigned char *' info='the UUID string for the network, must be 16 bytes'/>
-    </function>
-    <function name='virDomainGetInfo' file='python'>
-      <info>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.</info>
-      <return type='int *' info='the list of information or None in case of error'/>
-      <arg name='domain' type='virDomainPtr' info='a domain object'/>
-    </function>
-    <function name='virNodeGetInfo' file='python'>
-      <info>Extract hardware information about the Node.</info>
-      <return type='int *' info='the list of information or None in case of error'/>
-      <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
-    </function>
-    <function name='virDomainGetUUID' file='python'>
-      <info>Extract the UUID unique Identifier of a domain.</info>
-      <return type='char *' info='the 16 bytes string or None in case of error'/>
-      <arg name='domain' type='virDomainPtr' info='a domain object'/>
-    </function>
-    <function name='virDomainGetUUIDString' file='python'>
-      <info>Fetch globally unique ID of the domain as a string.</info>
-      <return type='char *' info='the UUID string or None in case of error'/>
-      <arg name='pool' type='virDomainPtr' info='a domain object'/>
-    </function>
-    <function name='virNetworkGetUUID' file='python'>
-      <info>Extract the UUID unique Identifier of a network.</info>
-      <return type='char *' info='the 16 bytes string or None in case of error'/>
-      <arg name='domain' type='virNetworkPtr' info='a network object'/>
-    </function>
-    <function name='virNetworkGetUUIDString' file='python'>
-      <info>Fetch globally unique ID of the network as a string.</info>
-      <return type='char *' info='the UUID string or None in case of error'/>
-      <arg name='net' type='virNetworkPtr' info='a network object'/>
-    </function>
-    <function name='virStoragePoolGetUUID' file='python'>
-      <info>Extract the UUID unique Identifier of a storage pool.</info>
-      <return type='char *' info='the 16 bytes string or None in case of error'/>
-      <arg name='pool' type='virStoragePoolPtr' info='a storage pool object'/>
-    </function>
-    <function name='virStoragePoolGetUUIDString' file='python'>
-      <info>Fetch globally unique ID of the storage pool as a string.</info>
-      <return type='char *' info='the UUID string or None in case of error'/>
-      <arg name='pool' type='virStoragePoolPtr' info='a storage pool object'/>
-    </function>
-    <function name='virNetworkGetAutostart' file='python'>
-      <info>Extract the autostart flag for a network.</info>
-      <return type='int' info='the autostart flag, or None in case of error'/>
-      <arg name='domain' type='virNetworkPtr' info='a network object'/>
-    </function>
-    <function name='virDomainGetAutostart' file='python'>
-      <info>Extract the autostart flag for a domain</info>
-      <return type='int' info='the autostart flag, or None in case of error'/>
-      <arg name='domain' type='virDomainPtr' info='a network object'/>
-    </function>
-    <function name='virStoragePoolGetAutostart' file='python'>
-      <info>Extract the autostart flag for a storage pool</info>
-      <return type='int' info='the autostart flag, or None in case of error'/>
-      <arg name='pool' type='virStoragePoolPtr' info='a storage pool object'/>
-    </function>
-    <function name='virDomainBlockStats' file='python'>
-      <info>Extracts block device statistics for a domain</info>
-      <return type='virDomainBlockStats' info='a tuple of statistics'/>
-      <arg name='domain' type='virDomainPtr' info='a domain object'/>
-      <arg name='path' type='char *' info='the path for the block device'/>
-    </function>
-    <function name='virDomainInterfaceStats' file='python'>
-      <info>Extracts interface device statistics for a domain</info>
-      <return type='virDomainInterfaceStats' info='a tuple of statistics'/>
-      <arg name='domain' type='virDomainPtr' info='a domain object'/>
-      <arg name='path' type='char *' info='the path for the interface device'/>
-    </function>
-    <function name="virNodeGetCellsFreeMemory" file='python'>
-      <info>Returns the available memory for a list of cells</info>
-      <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
-      <arg name='startCell' type='int' info='first cell in the list'/>
-      <arg name='maxCells' type='int' info='number of cell in the list'/>
-      <return type='int *' info="the list available memory in the cells"/>
-    </function>
-    <function name='virDomainGetSchedulerParameters' file='python'>
-      <info>Get the scheduler parameters, the @params array will be filled with the values.</info>
-      <return type='int' info='-1 in case of error, 0 in case of success.'/>
-      <arg name='domain' type='virDomainPtr' info='pointer to domain object'/>
-    </function>
-    <function name='virDomainGetSchedulerType' file='python'>
-      <info>Get the scheduler type.</info>
-      <return type='char *' info='NULL in case of error. The caller must free the returned string.'/>
-      <arg name='domain' type='virDomainPtr' info='pointer to domain object'/>
-    </function>
-    <function name='virDomainGetVcpus' file='python'>
-      <info>Extract information about virtual CPUs of domain, store it in info array and also in cpumaps if this pointer is&apos;nt NULL.</info>
-      <return type='int' info='the number of info filled in case of success, -1 in case of failure.'/>
-      <arg name='domain' type='virDomainPtr' info='pointer to domain object, or NULL for Domain0'/>
-    </function>
-    <function name='virDomainPinVcpu' file='python'>
-      <info>Dynamically change the real CPUs which can be allocated to a virtual CPU. This function requires privileged access to the hypervisor.</info>
-      <return type='int' info='0 in case of success, -1 in case of failure.'/>
-      <arg name='domain' type='virDomainPtr' info='pointer to domain object, or NULL for Domain0'/>
-      <arg name='vcpu' type='unsigned int' info='virtual CPU number'/>
-      <arg name='cpumap' type='unsigned char *' info='pointer to a bit map of real CPUs (in 8-bit bytes) (IN) Each bit set to 1 means that corresponding CPU is usable. Bytes are stored in little-endian order: CPU0-7, 8-15... In each byte, lowest CPU number is least significant bit.'/>
-    </function>
-    <function name='virDomainSetSchedulerParameters' file='python'>
-      <info>Change the scheduler parameters</info>
-      <return type='int' info='-1 in case of error, 0 in case of success.'/>
-      <arg name='domain' type='virDomainPtr' info='pointer to domain object'/>
-      <arg name='params' type='virSchedParameterPtr' info='pointer to scheduler parameter objects'/>
-    </function>
-    <function name='virConnectListStoragePools' file='python'>
-      <info>list the storage pools, stores the pointers to the names in @names</info>
-      <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
-      <return type='str *' info='the list of Names of None in case of error'/>
-    </function>
-    <function name='virConnectListDefinedStoragePools' file='python'>
-      <info>list the defined storage pool, stores the pointers to the names in @names</info>
-      <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
-      <return type='str *' info='the list of Names of None in case of error'/>
-    </function>
-    <function name='virStoragePoolListVolumes' file='python'>
-      <info>list the storage volumes, stores the pointers to the names in @names</info>
-      <arg name='pool' type='virStoragePoolPtr' info='pointer to the storage pool'/>
-      <return type='str *' info='the list of Names of None in case of error'/>
-    </function>
-    <function name='virStoragePoolGetInfo' file='python'>
-      <info>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.</info>
-      <return type='int *' info='the list of information or None in case of error'/>
-      <arg name='pool' type='virStoragePoolPtr' info='a storage pool object'/>
-    </function>
-    <function name='virStorageVolGetInfo' file='python'>
-      <info>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.</info>
-      <return type='int *' info='the list of information or None in case of error'/>
-      <arg name='vol' type='virStorageVolPtr' info='a storage vol object'/>
-    </function>
-    <function name='virNodeListDevices' file='python'>
-      <info>list the node devices</info>
-      <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
-      <arg name='cap' type='const unsigned char *' info='capability name'/>
-      <arg name='flags' type='unsigned int' info='flags (unused; pass 0)'/>
-      <return type='str *' info='the list of Names or None in case of error'/>
-    </function>
-    <function name='virNodeDeviceListCaps' file='python'>
-      <info>list the node device's capabilities</info>
-      <arg name='dev' type='virNodeDevicePtr' info='pointer to the node device'/>
-      <return type='str *' info='the list of Names or None in case of error'/>
-    </function>
-    <function name='virSecretGetValue' file='libvirt' module='libvirt'>
-      <info>Fetches the value associated with a secret.</info>
-      <return type='char *' info='the secret value or None in case of error'/>
-      <arg name='secret' type='virSecretPtr' info='virSecret secret'/>
-      <arg name='flags' type='unsigned int' info='flags (unused; pass 0)'/>
-    </function>
-    <function name='virConnectListSecrets' file='libvirt' module='libvirt'>
-      <info>List the defined secret IDs</info>
-      <arg name='conn' type='virConnectPtr' info='virConnect connection'/>
-      <return type='str *' info='the list of secret IDs or None in case of error'/>
-    </function>
-    <function name='virSecretSetValue' file='libvirt' module='libvirt'>
-      <info>Associates a value with a secret.</info>
-      <return type='int' info='0 on success, -1 on failure.'/>
-      <arg name='secret' type='virSecretPtr' info='virSecret secret'/>
-      <arg name='value' type='const char *' info='The secret value'/>
-      <arg name='flags' type='unsigned int' info='flags (unused; pass 0)'/>
-    </function>
-    <function name='virSecretLookupByUUID' file='python'>
-      <info>Try to lookup a secret on the given hypervisor based on its UUID.</info>
-      <return type='virSecretPtr' info='a new secret object or NULL in case of failure'/>
-      <arg name='conn' type='virConnectPtr' info='pointer to the hypervisor connection'/>
-      <arg name='uuid' type='const unsigned char *' info='the UUID string for the secret, must be 16 bytes'/>
-    </function>
-    <function name='virSecretGetUUID' file='python'>
-      <info>Extract the UUID unique Identifier of a secret.</info>
-      <return type='char *' info='the 16 bytes string or None in case of error'/>
-      <arg name='secret' type='virSecretPtr' info='a secret object'/>
-    </function>
-    <function name='virSecretGetUUIDString' file='python'>
-      <info>Fetch globally unique ID of the secret as a string.</info>
-      <return type='char *' info='the UUID string or None in case of error'/>
-      <arg name='secret' type='virSecretPtr' info='a secret object'/>
-    </function>
-  </symbols>
-</api>
diff --git a/python/libvirt_wrap.h b/python/libvirt_wrap.h
deleted file mode 100644 (file)
index 99d5805..0000000
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * libvirt_wrap.h: type wrappers for libvir python bindings
- *
- * Copyright (C) 2005 Red Hat, Inc.
- *
- * Daniel Veillard <veillard@redhat.com>
- */
-
-#include <Python.h>
-#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 (file)
index c445f5f..0000000
+++ /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 <veillard@redhat.com>
- */
-
-#include <config.h>
-
-/* Horrible kludge to work around even more horrible name-space pollution
- *    via Python.h.  That file includes /usr/include/python2.5/pyconfig*.h,
- *       which has over 180 autoconf-style HAVE_* definitions.  Shame on them.  */
-#undef HAVE_PTHREAD_H
-
-#include "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 (file)
index 0000000..0d8ac97
--- /dev/null
@@ -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 <veillard@redhat.com>
+ */
+
+#include <config.h>
+
+/* Horrible kludge to work around even more horrible name-space pollution
+ *    via Python.h.  That file includes /usr/include/python2.5/pyconfig*.h,
+ *       which has over 180 autoconf-style HAVE_* definitions.  Shame on them.  */
+#undef HAVE_PTHREAD_H
+
+#include "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 (file)
index 0000000..99d5805
--- /dev/null
@@ -0,0 +1,196 @@
+/*
+ * libvirt_wrap.h: type wrappers for libvir python bindings
+ *
+ * Copyright (C) 2005 Red Hat, Inc.
+ *
+ * Daniel Veillard <veillard@redhat.com>
+ */
+
+#include <Python.h>
+#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 (file)
index 1fdf548..0000000
+++ /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