This returns the raw C pointer to the underlying object, eg:
conn = libvirt.open(None)
print "0x%x" % conn.c_pointer() # returns virConnectPtr of the connection
dom = conn.lookupByName("test")
print "0x%x" % dom.c_pointer() # returns virDomainPtr of the domain
The reason behind this is to allow us to transparently pass Python dom
objects through the libguestfs Python API.
https://bugzilla.redhat.com/show_bug.cgi?id=1075164
---
generator.py | 32 ++++++++++++++++++++++++++++++++
sanitytest.py | 2 ++
2 files changed, 34 insertions(+)
diff --git a/generator.py b/generator.py
index 20df54f..cf044c9 100755
--- a/generator.py
+++ b/generator.py
@@ -821,6 +821,27 @@ def print_function_wrapper(module, name, output, export, include):
return 0
return 1
+def print_c_pointer(classname, output, export, include):
+ output.write("PyObject *\n")
+ output.write("libvirt_%s_pointer(PyObject *self ATTRIBUTE_UNUSED, PyObject
*args)\n" % classname)
+ output.write("{\n")
+ output.write(" %sPtr ptr;\n" % classname)
+ output.write(" PyObject *pyptr;\n")
+ output.write(" PyObject *pylong;\n")
+ output.write("\n")
+ output.write(" if (!PyArg_ParseTuple(args, (char *) \"O\",
&pyptr))\n")
+ output.write(" return NULL;\n")
+ output.write(" ptr = (%sPtr) Py%s_Get(pyptr);\n" % (classname,
classname))
+ output.write(" pylong = PyLong_FromVoidPtr(ptr);\n")
+ output.write(" return pylong;\n")
+ output.write("}\n")
+ output.write("\n")
+
+ include.write("PyObject *libvirt_%s_pointer(PyObject *self, PyObject
*args);\n" % classname)
+
+ export.write(" { (char *)\"%s_pointer\", libvirt_%s_pointer,
METH_VARARGS, NULL },\n" %
+ (classname, classname))
+
def buildStubs(module, api_xml):
global py_types
global py_return_types
@@ -917,6 +938,12 @@ def buildStubs(module, api_xml):
del funcs[function]
if ret == 1:
nb_wrap = nb_wrap + 1
+
+ if module == "libvirt":
+ # Write C pointer conversion functions.
+ for classname in primary_classes:
+ print_c_pointer(classname, wrapper, export, include)
+
include.close()
export.close()
wrapper.close()
@@ -1496,6 +1523,11 @@ def buildWrappers(module):
classes.write(" def domain(self):\n")
classes.write(" return self._dom\n\n")
+ classes.write(" def c_pointer(self):\n")
+ classes.write(" \"\"\"Get C pointer to underlying
object\"\"\"\n")
+ classes.write(" return libvirtmod.%s_pointer(self._o)\n\n"
%
+ classname)
+
flist = function_classes[classname]
flist.sort(key=functionSortKey)
oldfile = ""
diff --git a/sanitytest.py b/sanitytest.py
index f5337fc..9907f3d 100644
--- a/sanitytest.py
+++ b/sanitytest.py
@@ -109,6 +109,8 @@ for klassname in gottypes:
for name in dir(klassobj):
if name[0] == '_':
continue
+ if name == 'c_pointer':
+ continue
thing = getattr(klassobj, name)
if callable(thing):
gotfunctions[klassname].append(name)
--
2.1.0