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,
} 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) {
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,