On Mon, Dec 9, 2013 at 9:15 AM, Daniel P. Berrange <berra...@redhat.com> wrote:
> From: "Daniel P. Berrange" <berra...@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 <berra...@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@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

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list

Reply via email to