diff options
-rw-r--r-- | src/defs.h | 11 | ||||
-rw-r--r-- | src/io.c | 85 | ||||
-rw-r--r-- | src/main.c | 12 |
3 files changed, 29 insertions, 79 deletions
@@ -5,6 +5,17 @@ #include <stdint.h> #include <sys/types.h> +#define try_s(a,l) do {\ + if(a) {\ + goto l;\ + }} while (0); + +#define try(a,l,e) do {\ + if(a) {\ + ret = e;\ + goto l;\ + }} while (0); + /* for array implementation */ struct entry { uint64_t val; @@ -20,10 +20,7 @@ int stream_open(struct stream * const in, const struct settings * const s) { int ret = 0; - if (!in || in->fd > 0 || !in->name || !s) { - ret = EINVAL; - goto err; - } + try(!in || in->fd > 0 || !in->name || !s, err, EINVAL); if (in->out == 1) { ret = stream_open_out(in, s); @@ -41,10 +38,7 @@ int stream_close(struct stream * const in) { int ret = 0; - if (!in || in->fd < 0) { - ret = EINVAL; - goto early_err; - } + try(!in || in->fd < 0, early_err, EINVAL); if (!in->out) { goto out; @@ -66,11 +60,7 @@ int stream_close(struct stream * const in) } } - if (linkat(AT_FDCWD, path, AT_FDCWD, in->name, AT_SYMLINK_FOLLOW)) { - ret = errno; - /* TODO: error message */ - goto err; - } + try(linkat(AT_FDCWD, path, AT_FDCWD, in->name, AT_SYMLINK_FOLLOW), err, errno); } else { ret = EINVAL; goto err; @@ -116,40 +106,17 @@ static int stream_open_out(struct stream * const in, const struct settings * con 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; - } + try(stat(dname, &st), err, errno); + try(!(st.st_mode & S_IFDIR), err, EINVAL); /* TODO: err msg */ if (!stat(in->name, &st)) { - if (!(st.st_mode & S_IFREG)) { - ret = EINVAL; - /* TODO: error message */ - goto err; - } + try(!(st.st_mode & S_IFREG), err, EINVAL); /* TODO: err msg */ 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, s->stride * in->n)) { - ret = errno; - /* TODO: error message */ - goto err; - } + try(in->fd < 0, err, errno); /* TODO: err msg */ + try(ftruncate(in->fd, s->stride * in->n), err, errno); /* TODO: err msg */ err: free(dname); @@ -161,25 +128,11 @@ static int stream_open_in(struct stream * const in, const struct settings * cons 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 % s->stride)) { - ret = EINVAL; - /* TODO: error message */ - goto err; - } else { - in->n = st.st_size / s->stride; - } - + try(stat(in->name, &st), err, errno); /* TODO: err msg */ + try(!(st.st_mode & S_IFREG) || !st.st_size || (st.st_size % s->stride), err, EINVAL); /* TODO: err msg */ + in->n = st.st_size / s->stride; in->fd = open(in->name, O_RDONLY | O_NOATIME); - - if (in->fd < 0) { - ret = errno; - /* TODO: error message */ - goto err; - } + try(in->fd < 0, err, errno); /* TODO: err msg */ err: return ret; @@ -190,19 +143,9 @@ 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; - } - + try(stat(in->name, &st), err, errno); /* TODO: err msg */ in->fd = open(in->name, O_RDONLY | O_NOATIME); - - if (in->fd < 0) { - ret = errno; - /* TODO: error message */ - goto err; - } + try(in->fd < 0, err, errno); /* TODO: err msg */ err: return ret; @@ -4,6 +4,7 @@ #include <stdio.h> #include <string.h> #include "io.h" +#include "defs.h" static const unsigned int FLAG_DATA_FORMAT = (1 << 0); static const unsigned int FLAG_DATA_ACCESS = (1 << 1); @@ -22,9 +23,7 @@ int main(int argc, char **argv) { int ret = 0; - if ((ret = parseargs(argc, argv, &settings))) { - goto out; - } + try_s((ret = parseargs(argc, argv, &settings)), out); if (settings.opmode == mode_generate) { file_in.name = randfile; @@ -36,11 +35,8 @@ int main(int argc, char **argv) } file_out.name = settings.fileout ? settings.fileout : settings.filein; - - if ((ret = stream_open(&file_in, &settings)) || - (ret = stream_open(&file_out, &settings))) { - goto out; - } + try_s(( ret = stream_open(&file_in, &settings)) || + (ret = stream_open(&file_out, &settings)), out); out: stream_close(&file_in); |