From 1bcfe887515845678f8f648c6dfecffd01813b0f Mon Sep 17 00:00:00 2001 From: Gediminas Jakutis Date: Wed, 19 Feb 2020 14:55:34 +0200 Subject: now with a special generation mode! Signed-off-by: Gediminas Jakutis --- src/io.c | 181 ++++++++++++++++++++++++++++++++++++++++----------------------- 1 file changed, 116 insertions(+), 65 deletions(-) (limited to 'src/io.c') diff --git a/src/io.c b/src/io.c index a8dfa2f..f10269c 100644 --- a/src/io.c +++ b/src/io.c @@ -10,11 +10,12 @@ #include #include "io.h" -int stream_open(struct stream *in) +static int stream_open_in(struct stream * const in); +static int stream_open_out(struct stream * const in); +static int stream_open_special(struct stream * const in); + +int stream_open(struct stream * const in) { - struct stat st; - mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP; - char *dname = NULL; int ret = 0; if (!in || in->fd > 0 || !in->name) { @@ -22,74 +23,19 @@ int stream_open(struct stream *in) goto err; } - if (in->out) { - char *tmp[2]; - - tmp[0] = strdup(in->name); - tmp[1] = dirname(tmp[0]); - dname = strdup(tmp[1]); - free(tmp[0]); - - if (stat(dname, &st)) { - ret = errno; - /* TODO: error message */ - goto err; - } - - if(!(st.st_mode & S_IFDIR)) { - ret = EINVAL; - /* TODO: error message */ - goto err; - } - - if (!stat(in->name, &st)) { - if (!(st.st_mode & S_IFREG)) { - ret = EINVAL; - /* TODO: error message */ - goto err; - } - mode = st.st_mode; - } - } else if (stat(in->name, &st)) { - ret = errno; - /* TODO: error message */ - goto err; - } else if (!(st.st_mode & S_IFREG) || !st.st_size || (st.st_size % in->stride)) { - ret = EINVAL; - /* TODO: error message */ - goto err; + if (in->out == 1) { + ret = stream_open_out(in); + } else if (!in->out) { + ret = stream_open_in(in); } else { - in->n = st.st_size / in->stride; - } - - if (in->out) { - in->fd = open(dname, O_TMPFILE | O_WRONLY, mode); - if (in->fd < 0) { - ret = errno; - /* TODO: error message */ - goto err; - } - - if (ftruncate(in->fd, in->stride * in->n)) { - ret = errno; - /* TODO: error message */ - goto err; - } - } else { - in->fd = open(in->name, O_RDONLY | O_NOATIME); - if (in->fd < 0) { - ret = errno; - /* TODO: error message */ - goto err; - } + ret = stream_open_special(in); } err: - free(dname); return ret; } -int stream_close(struct stream *in) +int stream_close(struct stream * const in) { int ret = 0; @@ -135,3 +81,108 @@ err: early_err: return ret; } + +static int stream_open_out(struct stream * const in) +{ + struct stat st; + mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP; + char *dname = NULL; + char *tmp[2]; + int ret = 0; + + tmp[0] = strdup(in->name); + tmp[1] = dirname(tmp[0]); + dname = strdup(tmp[1]); + free(tmp[0]); + + if (stat(dname, &st)) { + ret = errno; + /* TODO: error message */ + goto err; + } + + if(!(st.st_mode & S_IFDIR)) { + ret = EINVAL; + /* TODO: error message */ + goto err; + } + + if (!stat(in->name, &st)) { + if (!(st.st_mode & S_IFREG)) { + ret = EINVAL; + /* TODO: error message */ + goto err; + } + mode = st.st_mode; + } + + in->fd = open(dname, O_TMPFILE | O_WRONLY, mode); + + if (in->fd < 0) { + ret = errno; + /* TODO: error message */ + goto err; + } + + if (ftruncate(in->fd, in->stride * in->n)) { + ret = errno; + /* TODO: error message */ + goto err; + } + +err: + free(dname); + return ret; +} + +static int stream_open_in(struct stream * const in) +{ + struct stat st; + int ret = 0; + + if (stat(in->name, &st)) { + ret = errno; + /* TODO: error message */ + goto err; + } else if (!(st.st_mode & S_IFREG) || !st.st_size || (st.st_size % in->stride)) { + ret = EINVAL; + /* TODO: error message */ + goto err; + } else { + in->n = st.st_size / in->stride; + } + + in->fd = open(in->name, O_RDONLY | O_NOATIME); + + if (in->fd < 0) { + ret = errno; + /* TODO: error message */ + goto err; + } + +err: + return ret; +} + +static int stream_open_special(struct stream * const in) +{ + struct stat st; + int ret = 0; + + if (stat(in->name, &st)) { + ret = errno; + /* TODO: error message */ + goto err; + } + + in->fd = open(in->name, O_RDONLY | O_NOATIME); + + if (in->fd < 0) { + ret = errno; + /* TODO: error message */ + goto err; + } + +err: + return ret; +} -- cgit v1.2.3