8000 py/stream: Add adapter methods with POSIX-compatible signatures. · sparkfun/circuitpython@4f1b029 · GitHub
[go: up one dir, main page]

Skip to content

Commit 4f1b029

Browse files
committed
py/stream: Add adapter methods with POSIX-compatible signatures.
Previoussly such read() and write() methods were used by modussl_axtls, move to py/stream for reuse.
1 parent abd5a57 commit 4f1b029

File tree

3 files changed

+64
-30
lines changed

3 files changed

+64
-30
lines changed

extmod/modussl_axtls.c

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -200,34 +200,4 @@ const mp_obj_module_t mp_module_ussl = {
200200
.globals = (mp_obj_dict_t*)&mp_module_ssl_globals,
201201
};
202202

203-
204-
// These functions might be split to stream_posix.c. They are referenced by
205-
// axtls os_port.h .
206-
ssize_t mp_stream_posix_write(void *sock_obj, const void *buf, size_t len);
207-
ssize_t mp_stream_posix_read(void *sock_obj, void *buf, size_t len);
208-
209-
int mp_stream_errno;
210-
211-
ssize_t mp_stream_posix_write(void *sock_obj, const void *buf, size_t len) {
212-
struct _mp_obj_base_t *o = (struct _mp_obj_base_t *)sock_obj;
213-
const mp_stream_p_t *stream_p = o->type->protocol;
214-
mp_uint_t out_sz = stream_p->write(o, buf, len, &mp_stream_errno);
215-
if (out_sz == MP_STREAM_ERROR) {
216-
return -1;
217-
} else {
218-
return out_sz;
219-
}
220-
}
221-
222-
ssize_t mp_stream_posix_read(void *sock_obj, void *buf, size_t len) {
223-
struct _mp_obj_base_t *o = (struct _mp_obj_base_t *)sock_obj;
224-
const mp_stream_p_t *stream_p = o->type->protocol;
225-
mp_uint_t out_sz = stream_p->read(o, buf, len, &mp_stream_errno);
226-
if (out_sz == MP_STREAM_ERROR) {
227-
return -1;
228-
} else {
229-
return out_sz;
230-
}
231-
}
232-
233203
#endif // MICROPY_PY_USSL

py/stream.c

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,3 +510,61 @@ STATIC mp_obj_t stream_ioctl(size_t n_args, const mp_obj_t *args) {
510510
return mp_obj_new_int(res);
511511
}
512512
MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN(mp_stream_ioctl_obj, 2, 3, stream_ioctl);
513+
514+
/*
515+
* POSIX-like functions
516+
*
517+
* These functions have POSIX-compatible signature (except for "void *stream"
518+
* first argument instead of "int fd"). They are useful to port existing
519+
* POSIX-compatible software to work with MicroPython streams.
520+
*/
521+
522+
523+
// errno-like variable. If any of the functions below returned with error
524+
// status, this variable will contain error no.
525+
int mp_stream_errno;
526+
527+
ssize_t mp_stream_posix_write(mp_obj_t stream, const void *buf, size_t len) {
528+
mp_obj_base_t* o = (mp_obj_base_t*)MP_OBJ_TO_PTR(stream);
529+
const mp_stream_p_t *stream_p = o->type->protocol;
530+
mp_uint_t out_sz = stream_p->write(stream, buf, len, &mp_stream_errno);
531+
if (out_sz == MP_STREAM_ERROR) {
532+
return -1;
533+
} else {
534+
return out_sz;
535+
}
536+
}
537+
538+
ssize_t mp_stream_posix_read(mp_obj_t stream, void *buf, size_t len) {
539+
mp_obj_base_t* o = (mp_obj_base_t*)MP_OBJ_TO_PTR(stream);
540+
const mp_stream_p_t *stream_p = o->type->protocol;
541+
mp_uint_t out_sz = stream_p->read(stream, buf, len, &mp_stream_errno);
542+
if (out_sz == MP_STREAM_ERROR) {
543+
return -1;
544+
} else {
545+
return out_sz;
546+
}
547+
}
548+
549+
off_t mp_stream_posix_lseek(mp_obj_t stream, off_t offset, int whence) {
550+
const mp_obj_base_t* o = (mp_obj_base_t*)MP_OBJ_TO_PTR(stream);
551+
const mp_stream_p_t *stream_p = o->type->protocol;
552+
struct mp_stream_seek_t seek_s;
553+
seek_s.offset = offset;
554+
seek_s.whence = whence;
555+
mp_uint_t res = stream_p->ioctl(stream, MP_STREAM_SEEK, (mp_uint_t)(uintptr_t)&seek_s, &mp_stream_errno);
556+
if (res == MP_STREAM_ERROR) {
557+
return -1;
558+
}
559+
return seek_s.offset;
560+
}
561+
562+
int mp_stream_posix_fsync(mp_obj_t stream) {
563+
mp_obj_base_t* o = (mp_obj_base_t*)MP_OBJ_TO_PTR(stream);
564+
const mp_stream_p_t *stream_p = o->type->protocol;
565+
mp_uint_t res = stream_p->ioctl(stream, MP_STREAM_FLUSH, 0, &mp_stream_errno);
566+
if (res == MP_STREAM_ERROR) {
567+
return -1;
568+
}
569+
return res;
570+
}

py/stream.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,12 @@ mp_uint_t mp_stream_rw(mp_obj_t stream, void *buf, mp_uint_t size, int *errcode,
8484

8585
void mp_stream_write_adaptor(void *self, const char *buf, size_t len);
8686

87+
// Functions with POSIX-compatible signatures
88+
ssize_t mp_stream_posix_write(mp_obj_t stream, const void *buf, size_t len);
89+
ssize_t mp_stream_posix_read(mp_obj_t stream, void *buf, size_t len);
90+
off_t mp_stream_posix_lseek(mp_obj_t stream, off_t offset, int whence);
91+
int mp_stream_posix_fsync(mp_obj_t stream);
92+
8793
#if MICROPY_STREAMS_NON_BLOCK
8894
#define mp_is_nonblocking_error(errno) ((errno) == EAGAIN || (errno) == EWOULDBLOCK)
8995
#else

0 commit comments

Comments
 (0)
0