]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-fs: Added support for asynchronous fs iteration.
authorTimo Sirainen <tss@iki.fi>
Tue, 10 Sep 2013 01:11:03 +0000 (04:11 +0300)
committerTimo Sirainen <tss@iki.fi>
Tue, 10 Sep 2013 01:11:03 +0000 (04:11 +0300)
src/lib-fs/fs-api-private.h
src/lib-fs/fs-api.c
src/lib-fs/fs-api.h

index d1acff6b9485bf59a5346f2b1f385cbc29035fef..f1500f30e98c26fa3703802f95f58fb2014bc90d 100644 (file)
@@ -93,6 +93,10 @@ struct fs_lock {
 struct fs_iter {
        struct fs *fs;
        enum fs_iter_flags flags;
+
+       bool async_have_more;
+       fs_file_async_callback_t *async_callback;
+       void *async_context;
 };
 
 extern const struct fs fs_class_posix;
index 3554e6d32fb8a0910c6ae4c69fe2d060fc7782b3..5fb99584dda17fb145e4957b6ae63a0a9c6b06ed 100644 (file)
@@ -670,6 +670,19 @@ const char *fs_iter_next(struct fs_iter *iter)
        return iter->fs->v.iter_next(iter);
 }
 
+void fs_iter_set_async_callback(struct fs_iter *iter,
+                               fs_file_async_callback_t *callback,
+                               void *context)
+{
+       iter->async_callback = callback;
+       iter->async_context = context;
+}
+
+bool fs_iter_have_more(struct fs_iter *iter)
+{
+       return iter->async_have_more;
+}
+
 void fs_set_error(struct fs *fs, const char *fmt, ...)
 {
        va_list args;
index 228bb6f39c10bb7d5e4594ed4d29abb159b9328c..e87b8474930e08d3ccd89a32a3e9ccf03ac62dc0 100644 (file)
@@ -59,7 +59,9 @@ enum fs_open_flags {
 
 enum fs_iter_flags {
        /* Iterate only directories, not files */
-       FS_ITER_FLAG_DIRS       = 0x01
+       FS_ITER_FLAG_DIRS       = 0x01,
+       /* Request asynchronous iteration. */
+       FS_ITER_FLAG_ASYNC      = 0x02
 };
 
 struct fs_settings {
@@ -206,4 +208,13 @@ int fs_iter_deinit(struct fs_iter **iter);
 /* Returns the next filename. */
 const char *fs_iter_next(struct fs_iter *iter);
 
+/* For asynchronous iterations: Specify the callback that is called whenever
+   there's more data available for reading. */
+void fs_iter_set_async_callback(struct fs_iter *iter,
+                               fs_file_async_callback_t *callback,
+                               void *context);
+/* For asynchronous iterations: If fs_iter_next() returns NULL, use this
+   function to determine if you should wait for more data or finish up. */
+bool fs_iter_have_more(struct fs_iter *iter);
+
 #endif