[Libguestfs] [PATCH 2/2] python: unicode decode handler error scheme setter
Pino Toscano
ptoscano at redhat.com
Fri Jun 16 09:43:49 UTC 2017
On Sunday, 21 May 2017 18:29:03 CEST Matteo Cafasso wrote:
> The set_decode_error_handler function allows the User to set the
> decoding error scheme to be used when non UTF8 characters are
> encountered in Python 3.
s/User/user/, and s/UTF8/UTF-8/
> The function has no effect in Python 2.
>
> Signed-off-by: Matteo Cafasso <noxdafox at gmail.com>
> ---
> generator/python.ml | 16 ++++++++++++++++
> python/handle.c | 18 ++++++++++++++++--
> python/t/test830RHBZ1406906.py | 6 ++++++
> 3 files changed, 38 insertions(+), 2 deletions(-)
>
> diff --git a/generator/python.ml b/generator/python.ml
> index f7c1f80bb..66bb7f27d 100644
> --- a/generator/python.ml
> +++ b/generator/python.ml
> @@ -82,6 +82,7 @@ put_handle (guestfs_h *g)
> }
>
> extern void guestfs_int_py_extend_module (PyObject *module);
> +extern PyObject *guestfs_int_py_set_decode_error_handler (PyObject *self, PyObject *args);
>
> extern PyObject *guestfs_int_py_create (PyObject *self, PyObject *args);
> extern PyObject *guestfs_int_py_close (PyObject *self, PyObject *args);
> @@ -577,6 +578,8 @@ and generate_python_module () =
>
> (* Table of functions. *)
> pr "static PyMethodDef methods[] = {\n";
> + pr " { (char *) \"set_decode_error_handler\", \n";
> + pr " guestfs_int_py_set_decode_error_handler, METH_VARARGS, NULL },\n";
This is implemented as global for the whole module, which means
changing the behaviour for an handle changes it for all the existing
handles (and in a racy behaviour, even). This IMHO should be a
per-handle setting.
> pr " { (char *) \"create\", guestfs_int_py_create, METH_VARARGS, NULL },\n";
> pr " { (char *) \"close\", guestfs_int_py_close, METH_VARARGS, NULL },\n";
> pr " { (char *) \"set_event_callback\",\n";
> @@ -728,6 +731,19 @@ class ClosedHandle(ValueError):
> pass
>
>
> +def set_decode_error_handler(handler):
'handler' usually is a function/callback, while in this case is a
behaviour/mode, so I'd use a different naming.
> + \"\"\"Set the error handling scheme to use for the handling
> + of decoding errors.
> + The default is 'strict' meaning that decoding errors raise a
> + UnicodeDecodeError.
> +
> + The other possible value is 'surrogateescape', see PEP383 for reference.
> +
> + Return the previous error handler.
> + \"\"\"
> + return libguestfsmod.set_decode_error_handler(handler)
> +
> +
> class GuestFS(object):
> \"\"\"Instances of this class are libguestfs API handles.\"\"\"
>
> diff --git a/python/handle.c b/python/handle.c
> index 52c36f1d2..b665bb899 100644
> --- a/python/handle.c
> +++ b/python/handle.c
> @@ -35,6 +35,8 @@
>
> #include "actions.h"
>
> +static const char *decode_error_handler = "strict";
> +
> static PyObject **get_all_event_callbacks (guestfs_h *g, size_t *len_rtn);
>
> void
> @@ -45,6 +47,17 @@ guestfs_int_py_extend_module (PyObject *module)
> }
>
> PyObject *
> +guestfs_int_py_set_decode_error_handler (PyObject *self, PyObject *args)
> +{
> + const char *previous_handler = decode_error_handler;
> +
> + if (!PyArg_ParseTuple (args, (char *) "s:set_decode_error_handler", &decode_error_handler))
> + return NULL;
I really doubt "decode_error_handler" will hold a valid pointer after
guestfs_int_py_set_decode_error_handler is done (and the args PyObject
is disposed.
--
Pino Toscano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part.
URL: <http://listman.redhat.com/archives/libguestfs/attachments/20170616/5ae30d18/attachment.sig>
More information about the Libguestfs
mailing list