On Mon, Dec 9, 2013 at 9:15 AM, Daniel P. Berrange <berrange(a)redhat.com> wrote:
From: "Daniel P. Berrange" <berrange(a)redhat.com>
Instead of using a 'z#i' format string to receive byte array,
use 'O' and then libvirt_charPtrSizeUnwrap. This lets us hide
the Python 3 vs 2 differences in typewrappers.c
Signed-off-by: Daniel P. Berrange <berrange(a)redhat.com>
---
libvirt-override.c | 11 ++++++-----
typewrappers.c | 19 +++++++++++++++++++
typewrappers.h | 1 +
3 files changed, 26 insertions(+), 5 deletions(-)
diff --git a/libvirt-override.c b/libvirt-override.c
index 77c0af2..7e54cf6 100644
--- a/libvirt-override.c
+++ b/libvirt-override.c
@@ -6770,21 +6770,22 @@ libvirt_virStreamSend(PyObject *self ATTRIBUTE_UNUSED,
{
PyObject *py_retval;
PyObject *pyobj_stream;
+ PyObject *pyobj_data;
virStreamPtr stream;
char *data;
- int datalen;
+ Py_ssize_t datalen;
int ret;
- int nbytes;
- if (!PyArg_ParseTuple(args, (char *) "Oz#i:virStreamRecv",
- &pyobj_stream, &data, &datalen, &nbytes)) {
+ if (!PyArg_ParseTuple(args, (char *) "OO:virStreamRecv",
+ &pyobj_stream, &pyobj_data)) {
DEBUG("%s failed to parse tuple\n", __FUNCTION__);
return VIR_PY_INT_FAIL;
}
stream = PyvirStream_Get(pyobj_stream);
+ libvirt_charPtrSizeUnwrap(pyobj_data, &data, &datalen);
LIBVIRT_BEGIN_ALLOW_THREADS;
- ret = virStreamSend(stream, data, nbytes);
+ ret = virStreamSend(stream, data, datalen);
LIBVIRT_END_ALLOW_THREADS;
DEBUG("StreamSend ret=%d\n", ret);
diff --git a/typewrappers.c b/typewrappers.c
index 7331cbd..a8cca30 100644
--- a/typewrappers.c
+++ b/typewrappers.c
@@ -385,6 +385,25 @@ libvirt_charPtrUnwrap(PyObject *obj, char **str)
return 0;
}
+int libvirt_charPtrSizeUnwrap(PyObject *obj, char **str, Py_ssize_t *size)
+{
+ int ret;
+ *str = NULL;
+ *size = 0;
+ if (!obj) {
+ PyErr_SetString(PyExc_TypeError, "unexpected type");
+ return -1;
+ }
+
+#if PY_MAJOR_VERSION > 2
+ ret = PyBytes_AsStringAndSize(obj, str, size);
+#else
+ ret = PyString_AsStringAndSize(obj, str, size);
+#endif
+
+ return ret;
+}
+
PyObject *
libvirt_virDomainPtrWrap(virDomainPtr node)
{
diff --git a/typewrappers.h b/typewrappers.h
index 6bb193c..ed1e4a3 100644
--- a/typewrappers.h
+++ b/typewrappers.h
@@ -175,6 +175,7 @@ int libvirt_ulonglongUnwrap(PyObject *obj, unsigned long long *val);
int libvirt_doubleUnwrap(PyObject *obj, double *val);
int libvirt_boolUnwrap(PyObject *obj, bool *val);
int libvirt_charPtrUnwrap(PyObject *obj, char **str);
+int libvirt_charPtrSizeUnwrap(PyObject *obj, char **str, Py_ssize_t *size);
PyObject * libvirt_virConnectPtrWrap(virConnectPtr node);
PyObject * libvirt_virDomainPtrWrap(virDomainPtr node);
PyObject * libvirt_virNetworkPtrWrap(virNetworkPtr node);
--
1.8.3.1
--
libvir-list mailing list
libvir-list(a)redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
I don't really know the format specifier but it seems reasonably
correct that O is object and then you're unwrapping it which makes
sense so ACK.
--
Doug Goldstein