Mercurial > dovecot > core-2.2
changeset 20518:bd0460a29b81
lib-fs: Added fs_metadata_init_or_clear() helper
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Mon, 11 Jul 2016 16:13:28 +0300 |
parents | c4a1368cd868 |
children | 9caf75a53fdb |
files | src/lib-fs/fs-api-private.h src/lib-fs/fs-api.c |
diffstat | 2 files changed, 21 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-fs/fs-api-private.h Mon Jul 11 14:18:36 2016 +0300 +++ b/src/lib-fs/fs-api-private.h Mon Jul 11 16:13:28 2016 +0300 @@ -164,6 +164,7 @@ 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);
--- a/src/lib-fs/fs-api.c Mon Jul 11 14:18:36 2016 +0300 +++ b/src/lib-fs/fs-api.c Mon Jul 11 16:13:28 2016 +0300 @@ -288,11 +288,31 @@ 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) {