]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-fs: Add fs_file_equals()
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Wed, 11 Mar 2026 17:11:13 +0000 (19:11 +0200)
committertimo.sirainen <timo.sirainen@open-xchange.com>
Sat, 14 Mar 2026 23:25:31 +0000 (23:25 +0000)
src/lib-fs/fs-api-private.h
src/lib-fs/fs-api.c
src/lib-fs/fs-api.h

index a368260be09cf3d5503c0d60c8bbfac4417974dc..30c092105b244d389345d6d8b128c4570e9c4476 100644 (file)
@@ -39,6 +39,7 @@ struct fs_vfuncs {
                          enum fs_open_mode mode, enum fs_open_flags flags);
        void (*file_deinit)(struct fs_file *file);
        void (*file_close)(struct fs_file *file);
+       bool (*file_equals)(struct fs_file *file1, struct fs_file *file2);
        const char *(*get_path)(struct fs_file *file);
 
        void (*set_async_callback)(struct fs_file *file,
index 2de79b0ac66558615f4f31471eb4ad87078d25ed..eb00807e08f3a8444272b4fb9c50f79f3be9594c 100644 (file)
@@ -467,6 +467,21 @@ void fs_file_deinit(struct fs_file **_file)
        } T_END;
 }
 
+bool fs_file_equals(struct fs_file *file1, struct fs_file *file2)
+{
+       while (file1->parent != NULL)
+               file1 = file1->parent;
+       while (file2->parent != NULL)
+               file2 = file2->parent;
+
+       if (strcmp(file1->fs->name, file2->fs->name) != 0)
+               return FALSE;
+       if (file1->fs->v.file_equals == NULL)
+               return FALSE;
+       i_assert(file1->fs->v.file_equals == file2->fs->v.file_equals);
+       return file1->fs->v.file_equals(file1, file2);
+}
+
 void fs_file_free(struct fs_file *file)
 {
        if (file->last_error_changed) {
index 0db4384685309bab7311604b35a2c97631f8acf3..d111356d7f88245b46ed12c2b1887ca73641ca2d 100644 (file)
@@ -235,6 +235,11 @@ struct fs_file *fs_file_init_with_event(struct fs *fs, struct event *event,
                                        const char *path, int mode_flags);
 void fs_file_deinit(struct fs_file **file);
 
+/* Returns TRUE if the two files point to the same storage/path. This looks for
+   the files' root fs first and compres the files there, so the wrapper fses
+   are ignored. */
+bool fs_file_equals(struct fs_file *file1, struct fs_file *file2);
+
 /* Change flags for a file (and its parents). */
 void fs_file_set_flags(struct fs_file *file,
                       enum fs_open_flags add_flags,