]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-fs: Added default implementations for fs_iter_*(), fs_copy() and fs_stat()
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 18 Jan 2016 12:59:50 +0000 (14:59 +0200)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 18 Jan 2016 13:00:40 +0000 (15:00 +0200)
The backends can now leave them as NULL, and the callers will get an error
that they're not supported.

src/lib-fs/fs-api.c

index 7d53fe13104a525a2f122c08cdca49ed60d5a083..921485d47ae7fc2807828138c510a22d4cb4def8 100644 (file)
@@ -716,8 +716,6 @@ int fs_wait_async(struct fs *fs)
        return ret;
 }
 
-
-
 int fs_lock(struct fs_file *file, unsigned int secs, struct fs_lock **lock_r)
 {
        int ret;
@@ -764,6 +762,11 @@ int fs_stat(struct fs_file *file, struct stat *st_r)
 {
        int ret;
 
+       if (file->fs->v.stat == NULL) {
+               fs_set_error(file->fs, "fs_stat() not supported");
+               return -1;
+       }
+
        if (!file->read_or_prefetch_counted &&
            !file->lookup_metadata_counted && !file->stat_counted) {
                file->stat_counted = TRUE;
@@ -834,6 +837,11 @@ int fs_copy(struct fs_file *src, struct fs_file *dest)
 
        i_assert(src->fs == dest->fs);
 
+       if (src->fs->v.copy == NULL) {
+               fs_set_error(src->fs, "fs_copy() not supported");
+               return -1;
+       }
+
        dest->fs->stats.copy_count++;
        fs_file_timing_start(dest, FS_OP_COPY);
        T_BEGIN {
@@ -904,7 +912,10 @@ fs_iter_init(struct fs *fs, const char *path, enum fs_iter_flags flags)
                if (gettimeofday(&now, NULL) < 0)
                        i_fatal("gettimeofday() failed: %m");
        }
-       T_BEGIN {
+       if (fs->v.iter_init == NULL) {
+               iter = i_new(struct fs_iter, 1);
+               iter->fs = fs;
+       } else T_BEGIN {
                iter = fs->v.iter_init(fs, path, flags);
        } T_END;
        iter->start_time = now;
@@ -919,7 +930,12 @@ int fs_iter_deinit(struct fs_iter **_iter)
 
        *_iter = NULL;
        DLLIST_REMOVE(&iter->fs->iters, iter);
-       T_BEGIN {
+
+       if (iter->fs->v.iter_deinit == NULL) {
+               fs_set_error(iter->fs, "FS teration not supported");
+               i_free(iter);
+               ret = -1;
+       } else T_BEGIN {
                ret = iter->fs->v.iter_deinit(iter);
        } T_END;
        return ret;
@@ -929,6 +945,8 @@ const char *fs_iter_next(struct fs_iter *iter)
 {
        const char *ret;
 
+       if (iter->fs->v.iter_next == NULL)
+               return NULL;
        T_BEGIN {
                ret = iter->fs->v.iter_next(iter);
        } T_END;