diff options
author | Runxi Yu <me@runxiyu.org> | 2025-04-05 11:05:43 +0800 |
---|---|---|
committer | Runxi Yu <me@runxiyu.org> | 2025-04-05 11:07:05 +0800 |
commit | 84ec0dd08c75344513fb4c912f835cadf5b28e49 (patch) | |
tree | 60c49797b602eb39551829b5fa0cd7c02252195a /git2d/rw.c | |
parent | Makefile: Statically build Go (diff) | |
download | forge-84ec0dd08c75344513fb4c912f835cadf5b28e49.tar.gz forge-84ec0dd08c75344513fb4c912f835cadf5b28e49.tar.zst forge-84ec0dd08c75344513fb4c912f835cadf5b28e49.zip |
git2d: Separate the files a bit
Diffstat (limited to '')
-rw-r--r-- | git2d/rw.c | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/git2d/rw.c b/git2d/rw.c new file mode 100644 index 0000000..a3e40e1 --- /dev/null +++ b/git2d/rw.c @@ -0,0 +1,31 @@ +#include "x.h" + +bare_error +conn_read(void *buffer, void *dst, uint64_t sz) +{ + conn_io_t *io = buffer; + ssize_t rsz = read(io->fd, dst, sz); + return (rsz == (ssize_t) sz) ? BARE_ERROR_NONE : BARE_ERROR_READ_FAILED; +} + +bare_error +conn_write(void *buffer, const void *src, uint64_t sz) +{ + conn_io_t *io = buffer; + const uint8_t *data = src; + uint64_t total = 0; + + while (total < sz) { + ssize_t written = write(io->fd, data + total, sz - total); + if (written < 0) { + if (errno == EINTR) + continue; + return BARE_ERROR_WRITE_FAILED; + } + if (written == 0) + break; + total += written; + } + + return (total == sz) ? BARE_ERROR_NONE : BARE_ERROR_WRITE_FAILED; +} |