int (*rename)(struct fs_file *src, struct fs_file *dest);
int (*delete_file)(struct fs_file *file);
- struct fs_iter *(*iter_init)(struct fs *fs, const char *path,
- enum fs_iter_flags flags);
+ struct fs_iter *(*iter_alloc)(void);
+ void (*iter_init)(struct fs_iter *iter, const char *path,
+ enum fs_iter_flags flags);
const char *(*iter_next)(struct fs_iter *iter);
int (*iter_deinit)(struct fs_iter *iter);
iter = i_new(struct fs_iter, 1);
iter->fs = fs;
} else T_BEGIN {
- iter = fs->v.iter_init(fs, path, flags);
+ iter = fs->v.iter_alloc();
+ iter->fs = fs;
+ fs->v.iter_init(iter, path, flags);
} T_END;
iter->start_time = now;
DLLIST_PREPEND(&fs->iters, iter);
return 0;
}
-static struct fs_iter *
-fs_dict_iter_init(struct fs *_fs, const char *path, enum fs_iter_flags flags)
+static struct fs_iter *fs_dict_iter_alloc(void)
{
- struct dict_fs *fs = (struct dict_fs *)_fs;
- struct dict_fs_iter *iter;
+ struct dict_fs_iter *iter = i_new(struct dict_fs_iter, 1);
+ return &iter->iter;
+}
+
+static void
+fs_dict_iter_init(struct fs_iter *_iter, const char *path,
+ enum fs_iter_flags flags)
+{
+ struct dict_fs_iter *iter = (struct dict_fs_iter *)_iter;
+ struct dict_fs *fs = (struct dict_fs *)_iter->fs;
- iter = i_new(struct dict_fs_iter, 1);
- iter->iter.fs = _fs;
iter->iter.flags = flags;
if (fs->path_prefix != NULL)
path = t_strconcat(fs->path_prefix, path, NULL);
iter->dict_iter = dict_iterate_init(fs->dict, path, 0);
- return &iter->iter;
}
static const char *fs_dict_iter_next(struct fs_iter *_iter)
fs_default_copy,
NULL,
fs_dict_delete,
+ fs_dict_iter_alloc,
fs_dict_iter_init,
fs_dict_iter_next,
fs_dict_iter_deinit,
fs_metawrap_copy,
fs_wrapper_rename,
fs_wrapper_delete,
+ fs_wrapper_iter_alloc,
fs_wrapper_iter_init,
fs_wrapper_iter_next,
fs_wrapper_iter_deinit,
return 0;
}
-static struct fs_iter *
-fs_posix_iter_init(struct fs *_fs, const char *path, enum fs_iter_flags flags)
+static struct fs_iter *fs_posix_iter_alloc(void)
{
- struct posix_fs *fs = (struct posix_fs *)_fs;
- struct posix_fs_iter *iter;
+ struct posix_fs_iter *iter = i_new(struct posix_fs_iter, 1);
+ return &iter->iter;
+}
+
+static void
+fs_posix_iter_init(struct fs_iter *_iter, const char *path,
+ enum fs_iter_flags flags)
+{
+ struct posix_fs_iter *iter = (struct posix_fs_iter *)_iter;
+ struct posix_fs *fs = (struct posix_fs *)_iter->fs;
- iter = i_new(struct posix_fs_iter, 1);
- iter->iter.fs = _fs;
iter->iter.flags = flags;
iter->path = fs->path_prefix == NULL ? i_strdup(path) :
i_strconcat(fs->path_prefix, path, NULL);
iter->dir = opendir(iter->path);
if (iter->dir == NULL && errno != ENOENT) {
iter->err = errno;
- fs_set_error(_fs, "opendir(%s) failed: %m", iter->path);
+ fs_set_error(_iter->fs, "opendir(%s) failed: %m", iter->path);
}
- return &iter->iter;
}
static bool fs_posix_iter_want(struct posix_fs_iter *iter, const char *fname)
fs_posix_copy,
fs_posix_rename,
fs_posix_delete,
+ fs_posix_iter_alloc,
fs_posix_iter_init,
fs_posix_iter_next,
fs_posix_iter_deinit,
return fs_file_random_fail_end(file, ret, FS_OP_DELETE);
}
-static struct fs_iter *
-fs_randomfail_iter_init(struct fs *_fs, const char *path,
- enum fs_iter_flags flags)
+static struct fs_iter *fs_randomfail_iter_alloc(void)
{
- struct randomfail_fs_iter *iter;
+ struct randomfail_fs_iter *iter = i_new(struct randomfail_fs_iter, 1);
+ return &iter->iter;
+}
+
+static void
+fs_randomfail_iter_init(struct fs_iter *_iter, const char *path,
+ enum fs_iter_flags flags)
+{
+ struct randomfail_fs_iter *iter = (struct randomfail_fs_iter *)_iter;
uoff_t pos;
- iter = i_new(struct randomfail_fs_iter, 1);
- iter->iter.fs = _fs;
iter->iter.flags = flags;
- iter->super = fs_iter_init(_fs->parent, path, flags);
- if (fs_random_fail_range(_fs, FS_OP_ITER, &pos))
+ iter->super = fs_iter_init(_iter->fs->parent, path, flags);
+ if (fs_random_fail_range(_iter->fs, FS_OP_ITER, &pos))
iter->fail_pos = pos + 1;
- return &iter->iter;
}
static const char *fs_randomfail_iter_next(struct fs_iter *_iter)
fs_randomfail_copy,
fs_randomfail_rename,
fs_randomfail_delete,
+ fs_randomfail_iter_alloc,
fs_randomfail_iter_init,
fs_randomfail_iter_next,
fs_randomfail_iter_deinit,
fs_wrapper_copy,
fs_wrapper_rename,
fs_sis_queue_delete,
+ fs_wrapper_iter_alloc,
fs_wrapper_iter_init,
NULL,
NULL,
fs_wrapper_copy,
fs_wrapper_rename,
fs_sis_delete,
+ fs_wrapper_iter_alloc,
fs_wrapper_iter_init,
NULL,
NULL,
return 0;
}
-static struct fs_iter *
-fs_test_iter_init(struct fs *_fs, const char *path,
+static struct fs_iter *fs_test_iter_alloc(void)
+{
+ struct test_fs_iter *iter = i_new(struct test_fs_iter, 1);
+ return &iter->iter;
+}
+
+static void
+fs_test_iter_init(struct fs_iter *_iter, const char *path,
enum fs_iter_flags flags)
{
- struct test_fs *fs = (struct test_fs *)_fs;
- struct test_fs_iter *iter;
+ struct test_fs_iter *iter = (struct test_fs_iter *)_iter;
+ struct test_fs *fs = (struct test_fs *)_iter->fs;
- iter = i_new(struct test_fs_iter, 1);
- iter->iter.fs = _fs;
iter->iter.flags = flags;
iter->prefix = i_strdup(path);
iter->prefix_len = strlen(iter->prefix);
iter->prev_dir = i_strdup("");
array_sort(&fs->iter_files, i_strcmp_p);
- return &iter->iter;
}
static const char *fs_test_iter_next(struct fs_iter *_iter)
fs_test_copy,
fs_test_rename,
fs_test_delete,
+ fs_test_iter_alloc,
fs_test_iter_init,
fs_test_iter_next,
fs_test_iter_deinit,
return fs_delete(file->parent);
}
-struct fs_iter *
-fs_wrapper_iter_init(struct fs *fs, const char *path,
- enum fs_iter_flags flags)
+struct fs_iter *fs_wrapper_iter_alloc(void)
{
- struct wrapper_fs_iter *iter;
+ struct wrapper_fs_iter *iter = i_new(struct wrapper_fs_iter, 1);
+ return &iter->iter;
+}
+
+void fs_wrapper_iter_init(struct fs_iter *_iter, const char *path,
+ enum fs_iter_flags flags)
+{
+ struct wrapper_fs_iter *iter = (struct wrapper_fs_iter *)_iter;
- iter = i_new(struct wrapper_fs_iter, 1);
- iter->iter.fs = fs;
iter->iter.flags = flags;
- iter->parent = fs_iter_init(fs->parent, path, flags);
- return &iter->iter;
+ iter->parent = fs_iter_init(_iter->fs->parent, path, flags);
}
const char *fs_wrapper_iter_next(struct fs_iter *_iter)
int fs_wrapper_copy(struct fs_file *src, struct fs_file *dest);
int fs_wrapper_rename(struct fs_file *src, struct fs_file *dest);
int fs_wrapper_delete(struct fs_file *file);
-struct fs_iter *
-fs_wrapper_iter_init(struct fs *fs, const char *path,
- enum fs_iter_flags flags);
+struct fs_iter *fs_wrapper_iter_alloc(void);
+void fs_wrapper_iter_init(struct fs_iter *iter, const char *path,
+ enum fs_iter_flags flags);
const char *fs_wrapper_iter_next(struct fs_iter *iter);
int fs_wrapper_iter_deinit(struct fs_iter *iter);
fs_wrapper_copy,
fs_wrapper_rename,
fs_wrapper_delete,
+ fs_wrapper_iter_alloc,
fs_wrapper_iter_init,
fs_wrapper_iter_next,
fs_wrapper_iter_deinit,
fs_wrapper_copy,
fs_wrapper_rename,
fs_wrapper_delete,
+ fs_wrapper_iter_alloc,
fs_wrapper_iter_init,
fs_wrapper_iter_next,
fs_wrapper_iter_deinit,
fs_wrapper_copy,
fs_wrapper_rename,
fs_wrapper_delete,
+ fs_wrapper_iter_alloc,
fs_wrapper_iter_init,
fs_wrapper_iter_next,
fs_wrapper_iter_deinit,