From 8b4c2c3194dbf9b18ecf475597d257ee7125a1e1 Mon Sep 17 00:00:00 2001 From: Gediminas Jakutis Date: Thu, 19 Mar 2020 21:45:02 +0200 Subject: we print error messages now, bois. --- meson.build | 4 +++- src/cache.c | 12 ++++++------ src/defs.h | 5 ++++- src/io.c | 29 +++++++++++++++-------------- src/main.c | 11 +++++++---- 5 files changed, 35 insertions(+), 26 deletions(-) diff --git a/meson.build b/meson.build index 3d101a4..4718a70 100644 --- a/meson.build +++ b/meson.build @@ -2,6 +2,8 @@ project('usurpation', 'c', license : 'LGPL2.1', default_options : ['c_std=gnu11', 'buildtype=release', 'warning_level=2']) +deps = [dependency('rin', version : '>= 0.0.4')] + progname = 'alg' add_project_arguments('-D', '_GNU_SOURCE', language : 'c') @@ -9,4 +11,4 @@ add_project_arguments('-fplan9-extensions', language : 'c') subdir('src') -executable(progname, sources, install : true) +executable(progname, sources, dependencies : deps, install : true) diff --git a/src/cache.c b/src/cache.c index c88cc78..ebe1047 100644 --- a/src/cache.c +++ b/src/cache.c @@ -11,7 +11,7 @@ int cache_create(struct stream * const restrict in, const struct settings * cons int ret; void *cache; - try(!(cache = calloc(in->n, s->stride)), err, ENOMEM); + try(!(cache = calloc(in->n, s->stride)), err, ENOMEM, "out of memory"); in->cache = cache; err: @@ -23,8 +23,8 @@ int cache_populate(struct stream * const restrict in) int ret = 0; ssize_t i; - for (i = 0; i < in->n; ++i) { - try_s((ret = in->get_element(in, i, in->cache + i)), err); + for (i = 0; i < in->n && !ret; ++i) { + ret = in->get_element(in, i, in->cache + i); } err: @@ -36,8 +36,8 @@ int cache_flush(struct stream * const in) int ret; ssize_t i; - for (i = 0; i < in->n; ++i) { - try_s((ret = in->put_element(in, i, in->cache + i)), err); + for (i = 0; i < in->n && !ret; ++i) { + ret = in->put_element(in, i, in->cache + i); } err: @@ -48,7 +48,7 @@ int cache_destroy(struct stream * const in) { int ret; - try(!in->cache, err, EINVAL); + try(!in->cache, err, EINVAL, "trying to destroy cache of uncached streadm"); free(in->cache); in->cache = NULL; err: diff --git a/src/defs.h b/src/defs.h index 3b8f1c1..ff19102 100644 --- a/src/defs.h +++ b/src/defs.h @@ -8,18 +8,21 @@ #include #include #include +#include #define try_s(a,l) do {\ if(a) {\ goto l;\ }} while (0); -#define try(a,l,e) do {\ +#define try(a,l,e,m,...) do {\ if(a) {\ ret = e;\ + rin_err(m __VA_OPT__(,) __VA_ARGS__);\ goto l;\ }} while (0); + #define get(in, idx, data) (in->cached ? in->get_element_cache(in, idx, data) | in->get_element(in, idx, data)) #define put(in, idx, data) (in->cached ? in->put_element_cache(in, idx, data) | in->put_element(in, idx, data)) diff --git a/src/io.c b/src/io.c index b18cc00..9fdad38 100644 --- a/src/io.c +++ b/src/io.c @@ -25,7 +25,7 @@ int stream_open(struct stream * const in, const struct settings * const s) { int ret = 0; - try(!in || in->fd > 0 || !in->name || !s, err, EINVAL); + try(!in || in->fd > 0 || !in->name || !s, err, EINVAL, "invalid argunent"); if (in->out == 1) { ret = stream_open_out(in, s); @@ -43,7 +43,7 @@ int stream_close(struct stream * const in) { int ret = 0; - try(!in || in->fd < 0, early_err, EINVAL); + try(!in || in->fd < 0, early_err, EINVAL, "invalid argunent"); if (!in->out) { goto out; @@ -60,13 +60,14 @@ int stream_close(struct stream * const in) unlink(in->name); } else { ret = EINVAL; - /* TODO: error message */ + rin_err("the given output file already exists and is not a regular file"); goto err; } } - try(linkat(AT_FDCWD, path, AT_FDCWD, in->name, AT_SYMLINK_FOLLOW), err, errno); + try(linkat(AT_FDCWD, path, AT_FDCWD, in->name, AT_SYMLINK_FOLLOW), err, errno, "error linking output file to filesystem: %s", strerror(ret)); } else { + rin_err("no output filename given"); ret = EINVAL; goto err; } @@ -92,17 +93,17 @@ static int stream_open_out(struct stream * const in, const struct settings * con dname = strdup(tmp[1]); free(tmp[0]); - try(stat(dname, &st), err, errno); - try(!(st.st_mode & S_IFDIR), err, EINVAL); /* TODO: err msg */ + try(stat(dname, &st), err, errno, "stat failed: %s", strerror(ret)); + try(!(st.st_mode & S_IFDIR), err, EINVAL, "invalid output path"); if (!stat(in->name, &st)) { - try(!(st.st_mode & S_IFREG), err, EINVAL); /* TODO: err msg */ + try(!(st.st_mode & S_IFREG), err, EINVAL, "the given output file already exists and is not a regular file"); mode = st.st_mode; } in->fd = open(dname, O_TMPFILE | O_WRONLY, mode); - try(in->fd < 0, err, errno); /* TODO: err msg */ - try(ftruncate(in->fd, s->stride * in->n), err, errno); /* TODO: err msg */ + try(in->fd < 0, err, errno, "failed creating temporary output file: %s", strerror(ret)); + try(ftruncate(in->fd, s->stride * in->n), err, errno, "failed setting output file size: %s", strerror(ret)); err: free(dname); @@ -114,11 +115,11 @@ static int stream_open_in(struct stream * const in, const struct settings * cons struct stat st; int ret = 0; - 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 */ + try(stat(in->name, &st), err, errno, "stat failed: %s", strerror(ret)); + try(!(st.st_mode & S_IFREG) || !st.st_size || (st.st_size % s->stride), err, EINVAL, "invalid input file"); in->n = st.st_size / s->stride; in->fd = open(in->name, O_RDONLY | O_NOATIME); - try(in->fd < 0, err, errno); /* TODO: err msg */ + try(in->fd < 0, err, errno, "failed opening input file: %s", strerror(ret)); if (in->cached) { cache_create(in, s); cache_populate(in); @@ -133,9 +134,9 @@ static int stream_open_special(struct stream * const in) struct stat st; int ret = 0; - try(stat(in->name, &st), err, errno); /* TODO: err msg */ + try(stat(in->name, &st), err, errno, "stat failed: %s", strerror(ret)); in->fd = open(in->name, O_RDONLY | O_NOATIME); - try(in->fd < 0, err, errno); /* TODO: err msg */ + try(in->fd < 0, err, errno, "failed opening input file: %s", strerror(ret)); err: return ret; diff --git a/src/main.c b/src/main.c index fabc612..ddae024 100644 --- a/src/main.c +++ b/src/main.c @@ -7,6 +7,7 @@ #include #include #include +#include #include "io.h" #include "defs.h" @@ -24,24 +25,26 @@ int main(int argc, char **argv) { int ret = 0; - try_s((ret = parseargs(argc, argv, &settings)), out); + rin_diag_init(); + try_s((ret = parseargs(argc, argv, &settings)), early_out); if (settings.opmode == mode_generate) { file_in.name = randfile; file_in.out = -1; file_in.n = settings.to; - file_out.n = settings.to; } else { file_in.name = settings.filein; } file_out.name = settings.fileout ? settings.fileout : settings.filein; - try_s(( ret = stream_open(&file_in, &settings)) || - (ret = stream_open(&file_out, &settings)), out); + try_s((ret = stream_open(&file_in, &settings)), out); + file_out.n = file_in.n; + try_s((ret = stream_open(&file_out, &settings)), out); out: stream_close(&file_in); stream_close(&file_out); +early_out: return ret; } -- cgit v1.2.3