]> 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 13:13:28 +0000 (16:13 +0300)
src/lib-fs/fs-api-private.h
src/lib-fs/fs-api.c

index 2bc72a2c0b52b0729c9b7dcc016bb47a06826aa3..28f2c4ad9a68ded2618ff70c231455afe011c062 100644 (file)
@@ -165,6 +165,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 501318f51a93e177c486be5f0737dc13e295a46a..bac5d161217d4779f3b9051329ac860c074f032f 100644 (file)
@@ -297,11 +297,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)
 {