]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-fs: fs-metawrap now fully wraps fs_iter_* to fix tracking struct fs.iters
authorTimo Sirainen <tss@iki.fi>
Mon, 15 Sep 2014 21:43:36 +0000 (00:43 +0300)
committerTimo Sirainen <tss@iki.fi>
Mon, 15 Sep 2014 21:43:36 +0000 (00:43 +0300)
src/lib-fs/fs-metawrap.c

index 669f0f2cc8171245114cc5ca25b7611c989d5ebc..f45c515d57df3514ad82ccc2d8b226cd359ab363 100644 (file)
@@ -28,6 +28,11 @@ struct metawrap_fs_file {
        bool metadata_read;
 };
 
+struct metawrap_fs_iter {
+       struct fs_iter iter;
+       struct fs_iter *super;
+};
+
 static struct fs *fs_metawrap_alloc(void)
 {
        struct metawrap_fs *fs;
@@ -406,9 +411,32 @@ static int fs_metawrap_delete(struct fs_file *_file)
 
 static struct fs_iter *
 fs_metawrap_iter_init(struct fs *_fs, const char *path,
-                         enum fs_iter_flags flags)
+                     enum fs_iter_flags flags)
 {
-       return fs_iter_init(_fs->parent, path, flags);
+       struct metawrap_fs_iter *iter;
+
+       iter = i_new(struct metawrap_fs_iter, 1);
+       iter->iter.fs = _fs;
+       iter->iter.flags = flags;
+       iter->super = fs_iter_init(_fs->parent, path, flags);
+       return &iter->iter;
+}
+
+static const char *fs_metawrap_iter_next(struct fs_iter *_iter)
+{
+       struct metawrap_fs_iter *iter = (struct metawrap_fs_iter *)_iter;
+
+       return fs_iter_next(iter->super);
+}
+
+static int fs_metawrap_iter_deinit(struct fs_iter *_iter)
+{
+       struct metawrap_fs_iter *iter = (struct metawrap_fs_iter *)_iter;
+       int ret;
+
+       ret = fs_iter_deinit(&iter->super);
+       i_free(iter);
+       return ret;
 }
 
 const struct fs fs_class_metawrap = {
@@ -440,7 +468,7 @@ const struct fs fs_class_metawrap = {
                fs_metawrap_rename,
                fs_metawrap_delete,
                fs_metawrap_iter_init,
-               NULL,
-               NULL
+               fs_metawrap_iter_next,
+               fs_metawrap_iter_deinit
        }
 };