On Mon, Dec 9, 2013 at 9:15 AM, Daniel P. Berrange <berrange@xxxxxxxxxx> wrote: > 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 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list