]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-fs: Change fs_iter_deinit() API to return error_r string
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 25 Nov 2019 09:13:08 +0000 (11:13 +0200)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Wed, 11 Dec 2019 10:12:30 +0000 (10:12 +0000)
src/doveadm/doveadm-fs.c
src/lib-dict-extra/dict-fs.c
src/lib-fs/fs-api.c
src/lib-fs/fs-api.h
src/lib-fs/fs-randomfail.c
src/lib-fs/fs-wrapper.c
src/lib-fs/test-fs-posix.c

index 7dde6118b4df6db8168700470e35a461d3045904..86cd98a30658105ecddc6519d57d28c78ad62fd1 100644 (file)
@@ -331,7 +331,7 @@ cmd_fs_delete_dir_recursive(struct fs *fs, unsigned int async_count,
        struct fs_iter *iter;
        ARRAY_TYPE(const_string) fnames;
        struct fs_delete_ctx ctx;
-       const char *fname, *const *fnamep;
+       const char *fname, *const *fnamep, *error;
        int ret;
 
        i_zero(&ctx);
@@ -351,9 +351,9 @@ cmd_fs_delete_dir_recursive(struct fs *fs, unsigned int async_count,
                fname = t_strconcat(fname, "/", NULL);
                array_push_back(&fnames, &fname);
        }
-       if (fs_iter_deinit(&iter) < 0) {
+       if (fs_iter_deinit(&iter, &error) < 0) {
                i_error("fs_iter_deinit(%s) failed: %s",
-                       path_prefix, fs_last_error(fs));
+                       path_prefix, error);
                doveadm_exit_code = EX_TEMPFAIL;
        }
        array_foreach(&fnames, fnamep) T_BEGIN {
@@ -373,9 +373,9 @@ cmd_fs_delete_dir_recursive(struct fs *fs, unsigned int async_count,
                fname = t_strdup(fname);
                array_push_back(&fnames, &fname);
        }
-       if (fs_iter_deinit(&iter) < 0) {
+       if (fs_iter_deinit(&iter, &error) < 0) {
                i_error("fs_iter_deinit(%s) failed: %s",
-                       path_prefix, fs_last_error(fs));
+                       path_prefix, error);
                doveadm_exit_code = EX_TEMPFAIL;
        }
 
@@ -483,7 +483,7 @@ static void cmd_fs_iter_full(int argc, char *argv[], enum fs_iter_flags flags,
 {
        struct fs *fs;
        struct fs_iter *iter;
-       const char *fname;
+       const char *fname, *error;
        int c;
 
        while ((c = getopt(argc, argv, "CO")) > 0) {
@@ -510,9 +510,9 @@ static void cmd_fs_iter_full(int argc, char *argv[], enum fs_iter_flags flags,
        while ((fname = fs_iter_next(iter)) != NULL) {
                doveadm_print(fname);
        }
-       if (fs_iter_deinit(&iter) < 0) {
+       if (fs_iter_deinit(&iter, &error) < 0) {
                i_error("fs_iter_deinit(%s) failed: %s",
-                       argv[0], fs_last_error(fs));
+                       argv[0], error);
                doveadm_exit_code = EX_TEMPFAIL;
        }
        fs_deinit(&fs);
index 98ab453525c8007fd755a37904b05ef1f24ec1fa..d79b33c0f8f6a39bdecd92738199e016422a6fb6 100644 (file)
@@ -158,8 +158,8 @@ static bool fs_dict_iterate(struct dict_iterate_context *ctx,
 
        *key_r = fs_iter_next(iter->fs_iter);
        if (*key_r == NULL) {
-               if (fs_iter_deinit(&iter->fs_iter) < 0) {
-                       iter->error = i_strdup(fs_last_error(dict->fs));
+               if (fs_iter_deinit(&iter->fs_iter, &error) < 0) {
+                       iter->error = i_strdup(error);
                        return FALSE;
                }
                if (iter->paths[++iter->path_idx] == NULL)
@@ -192,11 +192,11 @@ static int fs_dict_iterate_deinit(struct dict_iterate_context *ctx,
 {
        struct fs_dict_iterate_context *iter =
                (struct fs_dict_iterate_context *)ctx;
-       struct fs_dict *dict = (struct fs_dict *)ctx->dict;
+       const char *error;
        int ret;
 
-       if (fs_iter_deinit(&iter->fs_iter) < 0 && iter->error == NULL)
-               iter->error = i_strdup(fs_last_error(dict->fs));
+       if (fs_iter_deinit(&iter->fs_iter, &error) < 0 && iter->error == NULL)
+               iter->error = i_strdup(error);
 
        ret = iter->error != NULL ? -1 : 0;
        *error_r = t_strdup(iter->error);
index f5836ec6a129dfe8ccff4390cc9c56a027c0f42d..6f5815c881fe730604c50a4ca8eee34ab8ca729f 100644 (file)
@@ -1145,27 +1145,31 @@ fs_iter_init_with_event(struct fs *fs, struct event *event,
        return iter;
 }
 
-int fs_iter_deinit(struct fs_iter **_iter)
+int fs_iter_deinit(struct fs_iter **_iter, const char **error_r)
 {
        struct fs_iter *iter = *_iter;
+       struct fs *fs;
        struct event *event;
        int ret;
 
        if (iter == NULL)
                return 0;
 
+       fs = iter->fs;
        event = iter->event;
 
        *_iter = NULL;
-       DLLIST_REMOVE(&iter->fs->iters, iter);
+       DLLIST_REMOVE(&fs->iters, iter);
 
-       if (iter->fs->v.iter_deinit == NULL) {
-               fs_set_error(iter->fs, "FS iteration not supported");
+       if (fs->v.iter_deinit == NULL) {
+               fs_set_error(fs, "FS iteration not supported");
                i_free(iter);
                ret = -1;
        } else T_BEGIN {
                ret = iter->fs->v.iter_deinit(iter);
        } T_END;
+       if (ret < 0)
+               *error_r = fs_last_error(fs);
        event_unref(&event);
        return ret;
 }
index 7d4ebd2b17dd441ce42cece10bb4a853edbd15c5..8cd6f92591f8ae35a20e8f5a3b8107158e88051b 100644 (file)
@@ -353,7 +353,7 @@ struct fs_iter *
 fs_iter_init_with_event(struct fs *fs, struct event *event,
                        const char *path, enum fs_iter_flags flags);
 /* Returns 0 if ok, -1 if iteration failed. */
-int fs_iter_deinit(struct fs_iter **iter);
+int fs_iter_deinit(struct fs_iter **iter, const char **error_r);
 /* Returns the next filename. */
 const char *fs_iter_next(struct fs_iter *iter);
 
index 87bb1ee42b43d871c1400e5a3f8d14e3839bb6f6..0a32cf747046ab5c3da4c69228978c275226ba27 100644 (file)
@@ -499,9 +499,11 @@ static const char *fs_randomfail_iter_next(struct fs_iter *_iter)
 static int fs_randomfail_iter_deinit(struct fs_iter *_iter)
 {
        struct randomfail_fs_iter *iter = (struct randomfail_fs_iter *)_iter;
+       const char *error;
        int ret;
 
-       ret = fs_iter_deinit(&iter->super);
+       if ((ret = fs_iter_deinit(&iter->super, &error)) < 0)
+               fs_set_error(_iter->fs, "%s", error);
        if (iter->fail_pos == 1) {
                fs_set_error(_iter->fs, RANDOMFAIL_ERROR);
                errno = EIO;
index 10acb33965856ef8dc33aa9bacd9667bda68a065..a16d803c29dea80b12abed40dfc9fd29bdfae78e 100644 (file)
@@ -162,9 +162,11 @@ const char *fs_wrapper_iter_next(struct fs_iter *_iter)
 int fs_wrapper_iter_deinit(struct fs_iter *_iter)
 {
        struct wrapper_fs_iter *iter = (struct wrapper_fs_iter *)_iter;
+       const char *error;
        int ret;
 
-       ret = fs_iter_deinit(&iter->parent);
+       if ((ret = fs_iter_deinit(&iter->parent, &error)) < 0)
+               fs_set_error(_iter->fs, "%s", error);
        i_free(iter);
        return ret;
 }
index 611d3d12ee9bf2ddf6d2ef3268c6c73744a89bac..68211790fd98ff0bcf5bf77995f48df618b0afa0 100644 (file)
@@ -84,7 +84,7 @@ static void test_fs_posix(void)
        filename = fs_iter_next(iter);
        test_assert_strcmp(filename, "good1");
        test_assert(fs_iter_next(iter) == NULL);
-       fs_iter_deinit(&iter);
+       fs_iter_deinit(&iter, &error);
        test_end();
 
        struct stat st;