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);
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 {
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;
}
{
struct fs *fs;
struct fs_iter *iter;
- const char *fname;
+ const char *fname, *error;
int c;
while ((c = getopt(argc, argv, "CO")) > 0) {
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);
*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)
{
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);
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;
}
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);
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;
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;
}
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;