]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-fs: Added fs_metadata_init_or_clear() helper
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 11 Jul 2016 13:13:28 +0000 (16:13 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 11 Jul 2016 14:39:18 +0000 (17:39 +0300)
src/lib-fs/fs-api-private.h
src/lib-fs/fs-api.c

index da04b0b1208804ad4763c6352cc38c36b34b4561..d864d246b4718320684963087d6debc500dcf374 100644 (file)
@@ -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);
index 7bd981eb3b00e702afde6d7b74b9d3d8f7ea5653..dfa90f9661236b5fb4429298c071f012f054b281 100644 (file)
@@ -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)
 {