From fb383b792d1044405188e42c4b827858c4a3a038 Mon Sep 17 00:00:00 2001 From: Gediminas Jakutis Date: Mon, 15 Feb 2021 09:18:31 +0200 Subject: now with generating lists! Signed-off-by: Gediminas Jakutis --- src/io.c | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) (limited to 'src/io.c') diff --git a/src/io.c b/src/io.c index 41c5880..9dae2e1 100644 --- a/src/io.c +++ b/src/io.c @@ -218,11 +218,35 @@ err: int stream_flush_list(struct stream * const in) { - int ret = ENOSYS; + ssize_t ret = 0; + size_t remaining; + ssize_t written; + size_t i; + + /* adjust pointers to have a base starting at 0, to cater to disk storage format. + * File offsets are otherwise 1:1 to memory addresses, which is neat. + * Just don't process the last offset, as that is always NULL/zero. + * */ - (void) in; + for (i = 0; i < (in->n - 1); ++i) { + in->cache_l[i].offset = (char *) in->cache_l[i].next - in->cache; + } - rin_warn("stub!"); + /* dump the bloody list */ + written = 0; + remaining = in->n * in->settings->stride; + do { + ret = write(in->fd, in->cache + written, remaining); + if (ret < 0) { + try(errno != EAGAIN, err, errno, "Writing to stream failed with %zi", ret); + } else { + written += ret; + remaining -= ret; + ret = 0; + } + } while (remaining); + +err: return ret; } -- cgit v1.2.3