*.loT
libvirt.py
libvirt-export.c
-libvirtclass.txt
-libvirt-py.[ch]
-libvirtclass.py
-gen_prog
+libvirt.c
+libvirt.h
*.pyc
generated.stamp
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)
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@
@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)
$(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:
uninstall-local:
rm -f $(DESTDIR)$(pythondir)/libvirt.py
-CLEANFILES= $(GENERATED) generated.stamp libvirt.py
+CLEANFILES= $(GENERATED) generated.stamp
else
all:
--- /dev/null
+ 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
#######################################################################
#
-# 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
#
#######################################################################
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)
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:
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)
(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:
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")
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")
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:
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")
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:
+++ /dev/null
-/*
- * 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;
-}
+++ /dev/null
-#!/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
--- /dev/null
+<?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'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>
--- /dev/null
+ 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
--- /dev/null
+/*
+ * 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;
+}
--- /dev/null
+#
+# 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);
+
+
+++ /dev/null
-<?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'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>
+++ /dev/null
-/*
- * 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
+++ /dev/null
-/*
- * 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);
-}
--- /dev/null
+/*
+ * 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);
+}
--- /dev/null
+/*
+ * 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
+++ /dev/null
- 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