From: "Daniel P. Berrange" <berrange@xxxxxxxxxx> 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@xxxxxxxxxx> --- 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@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list