rcx

library of miscellaneous bits of C code
git clone git://git.rr3.xyz/rcx
Log | Files | Refs | README | LICENSE

commit 79a944325f45499e3bf4e150c0b7375664af205f
parent 7fc80a6d5d3387ccbcd3200480b5b999f01f52b7
Author: Robert Russell <robertrussell.72001@gmail.com>
Date:   Sat,  7 Jan 2023 18:52:02 -0800

Add read_all and write_all functions

Diffstat:
MMakefile | 2++
Minc/rcx/all.h | 1+
Ainc/rcx/unix.h | 6++++++
Asrc/unix.c | 35+++++++++++++++++++++++++++++++++++
4 files changed, 44 insertions(+), 0 deletions(-)

diff --git a/Makefile b/Makefile @@ -8,6 +8,7 @@ SRC =\ src/log.c\ src/str.c\ src/unicode.c\ + src/unix.c\ src/utf8.c # src/opt.c needs work @@ -23,6 +24,7 @@ src/log.o: src/log.c inc/rcx/def.h inc/rcx/log.h inc/rcx/rcx.h config.mk src/opt.o: src/opt.c inc/rcx/def.h inc/rcx/opt.h inc/rcx/rcx.h config.mk src/str.o: src/str.c inc/rcx/alloc.h inc/rcx/def.h inc/rcx/log.h inc/rcx/rcx.h inc/rcx/str.h config.mk src/unicode.o: src/unicode.c inc/rcx/def.h inc/rcx/rcx.h gen/ucattab.inc config.mk +src/unix.o: src/unix.c inc/rcx/def.h inc/rcx/rcx.h config.mk src/utf8.o: src/utf8.c inc/rcx/def.h inc/rcx/rcx.h inc/rcx/utf8.h config.mk gen/ucattab.inc: gen tool/ucattab gen/UnicodeData.txt diff --git a/inc/rcx/all.h b/inc/rcx/all.h @@ -6,5 +6,6 @@ #include "rcx/rcx.h" #include "rcx/str.h" #include "rcx/unicode.h" +#include "rcx/unix.h" #include "rcx/utf8.h" #include "rcx/vector.h" diff --git a/inc/rcx/unix.h b/inc/rcx/unix.h @@ -0,0 +1,6 @@ +#pragma once + +#include "rcx/def.h" + +int r_read_all(usize *n, int fd, void *buf, usize len); +int r_write_all(usize *n, int fd, void *buf, usize len); diff --git a/src/unix.c b/src/unix.c @@ -0,0 +1,35 @@ +#include <errno.h> +#include <unistd.h> + +#include "rcx/rcx.h" + +typedef isize (*IoOp)(int, void *, usize); + +static int +perform_io(usize *n_, IoOp op, int fd, void *buf, usize len) { + usize n = 0; + do { + isize ret = op(fd, (char *)buf + n, len - n); + if (ret < 0) { + if (errno == EINTR) + continue; + *n_ = n; + return -1; + } + n += ret; + } while (n < len); + + *n_ = n; + return 0; +} + +int +r_read_all(usize *n, int fd, void *buf, usize len) { + return perform_io(n, read, fd, buf, len); +} + +int +r_write_all(usize *n, int fd, void *buf, usize len) { + /* Cast off const-ness from write. */ + return perform_io(n, (IoOp)write, fd, buf, len); +}