From: Timo Sirainen Date: Mon, 25 Nov 2019 09:13:08 +0000 (+0200) Subject: lib-fs: Change fs_iter_deinit() API to return error_r string X-Git-Tag: 2.3.10~221 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f51f18694e393f8bcef1167192d9ac0f05cb461e;p=thirdparty%2Fdovecot%2Fcore.git lib-fs: Change fs_iter_deinit() API to return error_r string --- diff --git a/src/doveadm/doveadm-fs.c b/src/doveadm/doveadm-fs.c index 7dde6118b4..86cd98a306 100644 --- a/src/doveadm/doveadm-fs.c +++ b/src/doveadm/doveadm-fs.c @@ -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); diff --git a/src/lib-dict-extra/dict-fs.c b/src/lib-dict-extra/dict-fs.c index 98ab453525..d79b33c0f8 100644 --- a/src/lib-dict-extra/dict-fs.c +++ b/src/lib-dict-extra/dict-fs.c @@ -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); diff --git a/src/lib-fs/fs-api.c b/src/lib-fs/fs-api.c index f5836ec6a1..6f5815c881 100644 --- a/src/lib-fs/fs-api.c +++ b/src/lib-fs/fs-api.c @@ -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; } diff --git a/src/lib-fs/fs-api.h b/src/lib-fs/fs-api.h index 7d4ebd2b17..8cd6f92591 100644 --- a/src/lib-fs/fs-api.h +++ b/src/lib-fs/fs-api.h @@ -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); diff --git a/src/lib-fs/fs-randomfail.c b/src/lib-fs/fs-randomfail.c index 87bb1ee42b..0a32cf7470 100644 --- a/src/lib-fs/fs-randomfail.c +++ b/src/lib-fs/fs-randomfail.c @@ -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; diff --git a/src/lib-fs/fs-wrapper.c b/src/lib-fs/fs-wrapper.c index 10acb33965..a16d803c29 100644 --- a/src/lib-fs/fs-wrapper.c +++ b/src/lib-fs/fs-wrapper.c @@ -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; } diff --git a/src/lib-fs/test-fs-posix.c b/src/lib-fs/test-fs-posix.c index 611d3d12ee..68211790fd 100644 --- a/src/lib-fs/test-fs-posix.c +++ b/src/lib-fs/test-fs-posix.c @@ -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;