From: Timo Sirainen Date: Mon, 11 Jul 2016 13:13:28 +0000 (+0300) Subject: lib-fs: Added fs_metadata_init_or_clear() helper X-Git-Tag: 2.2.26~483 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=76153564b4fedad22d6d70c240a710989e4ba30c;p=thirdparty%2Fdovecot%2Fcore.git lib-fs: Added fs_metadata_init_or_clear() helper --- diff --git a/src/lib-fs/fs-api-private.h b/src/lib-fs/fs-api-private.h index da04b0b120..d864d246b4 100644 --- a/src/lib-fs/fs-api-private.h +++ b/src/lib-fs/fs-api-private.h @@ -164,6 +164,7 @@ void fs_set_error_async(struct fs *fs); ssize_t fs_read_via_stream(struct fs_file *file, void *buf, size_t size); int fs_write_via_stream(struct fs_file *file, const void *data, size_t size); void fs_metadata_init(struct fs_file *file); +void fs_metadata_init_or_clear(struct fs_file *file); void fs_default_set_metadata(struct fs_file *file, const char *key, const char *value); int fs_default_copy(struct fs_file *src, struct fs_file *dest); diff --git a/src/lib-fs/fs-api.c b/src/lib-fs/fs-api.c index 7bd981eb3b..dfa90f9661 100644 --- a/src/lib-fs/fs-api.c +++ b/src/lib-fs/fs-api.c @@ -288,11 +288,31 @@ enum fs_properties fs_get_properties(struct fs *fs) void fs_metadata_init(struct fs_file *file) { if (file->metadata_pool == NULL) { + i_assert(!array_is_created(&file->metadata)); file->metadata_pool = pool_alloconly_create("fs metadata", 1024); p_array_init(&file->metadata, file->metadata_pool, 8); } } +void fs_metadata_init_or_clear(struct fs_file *file) +{ + if (file->metadata_pool == NULL) + fs_metadata_init(file); + else T_BEGIN { + const struct fs_metadata *md; + ARRAY_TYPE(fs_metadata) internal_metadata; + + t_array_init(&internal_metadata, 4); + array_foreach(&file->metadata, md) { + if (strncmp(md->key, FS_METADATA_INTERNAL_PREFIX, + strlen(FS_METADATA_INTERNAL_PREFIX)) == 0) + array_append(&internal_metadata, md, 1); + } + array_clear(&file->metadata); + array_append_array(&file->metadata, &internal_metadata); + } T_END; +} + void fs_default_set_metadata(struct fs_file *file, const char *key, const char *value) {