py/modio: Allow uio.IOBase streams to return errno for read/write error.
This allows user code that inherits from uio.IOBase to return an errno error code from the user readinto/write function, by returning a negative value. Eg returning -123 means an errno of 123. This is already how the custom ioctl works.
This commit is contained in:
parent
e08ca78f40
commit
bd6ca15444
11
py/modio.c
11
py/modio.c
@ -59,12 +59,17 @@ STATIC mp_uint_t iobase_read_write(mp_obj_t obj, void *buf, mp_uint_t size, int
|
|||||||
mp_load_method(obj, qst, dest);
|
mp_load_method(obj, qst, dest);
|
||||||
mp_obj_array_t ar = {{&mp_type_bytearray}, BYTEARRAY_TYPECODE, 0, size, buf};
|
mp_obj_array_t ar = {{&mp_type_bytearray}, BYTEARRAY_TYPECODE, 0, size, buf};
|
||||||
dest[2] = MP_OBJ_FROM_PTR(&ar);
|
dest[2] = MP_OBJ_FROM_PTR(&ar);
|
||||||
mp_obj_t ret = mp_call_method_n_kw(1, 0, dest);
|
mp_obj_t ret_obj = mp_call_method_n_kw(1, 0, dest);
|
||||||
if (ret == mp_const_none) {
|
if (ret_obj == mp_const_none) {
|
||||||
*errcode = MP_EAGAIN;
|
*errcode = MP_EAGAIN;
|
||||||
return MP_STREAM_ERROR;
|
return MP_STREAM_ERROR;
|
||||||
|
}
|
||||||
|
mp_int_t ret = mp_obj_get_int(ret_obj);
|
||||||
|
if (ret >= 0) {
|
||||||
|
return ret;
|
||||||
} else {
|
} else {
|
||||||
return mp_obj_get_int(ret);
|
*errcode = -ret;
|
||||||
|
return MP_STREAM_ERROR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
STATIC mp_uint_t iobase_read(mp_obj_t obj, void *buf, mp_uint_t size, int *errcode) {
|
STATIC mp_uint_t iobase_read(mp_obj_t obj, void *buf, mp_uint_t size, int *errcode) {
|
||||||
|
Loading…
Reference in New Issue
Block a user