From: Timo Sirainen Date: Tue, 10 Sep 2013 01:11:03 +0000 (+0300) Subject: lib-fs: Added support for asynchronous fs iteration. X-Git-Tag: 2.2.6~102 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=9c45f33d0e0ca0b8f87f9a3318dd505a78fd198e;p=thirdparty%2Fdovecot%2Fcore.git lib-fs: Added support for asynchronous fs iteration. --- diff --git a/src/lib-fs/fs-api-private.h b/src/lib-fs/fs-api-private.h index d1acff6b94..f1500f30e9 100644 --- a/src/lib-fs/fs-api-private.h +++ b/src/lib-fs/fs-api-private.h @@ -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; diff --git a/src/lib-fs/fs-api.c b/src/lib-fs/fs-api.c index 3554e6d32f..5fb99584dd 100644 --- a/src/lib-fs/fs-api.c +++ b/src/lib-fs/fs-api.c @@ -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; diff --git a/src/lib-fs/fs-api.h b/src/lib-fs/fs-api.h index 228bb6f39c..e87b847493 100644 --- a/src/lib-fs/fs-api.h +++ b/src/lib-fs/fs-api.h @@ -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