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 <[email protected]> > --- > 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
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ Libguestfs mailing list [email protected] https://www.redhat.com/mailman/listinfo/libguestfs
