annotate src/lib-storage/index/maildir/maildir-keywords.c @ 6857:41911abe6fa7 HEAD

NFS cache flushing updates.
author Timo Sirainen <tss@iki.fi>
date Sun, 25 Nov 2007 15:47:36 +0200
parents dbab5e592577
children 414c9d631a81
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6429
65c69a53a7be Replaced my Copyright notices. The year range always ends with 2007 now.
Timo Sirainen <tss@iki.fi>
parents: 6428
diff changeset
1 /* Copyright (c) 2005-2007 Dovecot authors, see the included COPYING file */
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 /* note that everything here depends on uidlist file being locked the whole
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 time. that's why we don't have any locking of our own, or that we do things
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 that would be racy otherwise. */
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "lib.h"
3470
346a494c2feb Moved array declaration to array-decl.h and include it in lib.h. So array.h
Timo Sirainen <tss@iki.fi>
parents: 3447
diff changeset
8 #include "array.h"
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "ioloop.h"
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "hash.h"
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "str.h"
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include "istream.h"
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include "file-dotlock.h"
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include "write-full.h"
5974
b88278b5d8d3 Flush NFS caches when needed.
Timo Sirainen <tss@iki.fi>
parents: 5459
diff changeset
15 #include "nfs-workarounds.h"
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #include "maildir-storage.h"
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 #include "maildir-uidlist.h"
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 #include "maildir-keywords.h"
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 #include <stdlib.h>
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 #include <sys/stat.h>
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 #include <utime.h>
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23
4969
5c18ac362f65 More dotlock_use_excl uses.
Timo Sirainen <tss@iki.fi>
parents: 4864
diff changeset
24 /* how many seconds to wait before overriding dovecot-keywords.lock */
5c18ac362f65 More dotlock_use_excl uses.
Timo Sirainen <tss@iki.fi>
parents: 4864
diff changeset
25 #define KEYWORDS_LOCK_STALE_TIMEOUT (60*2)
5c18ac362f65 More dotlock_use_excl uses.
Timo Sirainen <tss@iki.fi>
parents: 4864
diff changeset
26
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 struct maildir_keywords {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 struct maildir_mailbox *mbox;
6408
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
29 struct mail_storage *storage;
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 char *path;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 pool_t pool;
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4073
diff changeset
33 ARRAY_TYPE(keywords) list;
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 struct hash_table *hash; /* name -> idx+1 */
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 struct dotlock_settings dotlock_settings;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 time_t synced_mtime;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 unsigned int synced:1;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 unsigned int changed:1;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 };
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 struct maildir_keywords_sync_ctx {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 struct maildir_keywords *mk;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 struct mail_index *index;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4073
diff changeset
47 const ARRAY_TYPE(keywords) *keywords;
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4073
diff changeset
48 ARRAY_DEFINE(idx_to_chr, char);
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 unsigned int chridx_to_idx[MAILDIR_MAX_KEYWORDS];
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 };
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 struct maildir_keywords *maildir_keywords_init(struct maildir_mailbox *mbox)
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 struct maildir_keywords *mk;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55
6408
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
56 mk = maildir_keywords_init_readonly(&mbox->ibox.box);
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 mk->mbox = mbox;
6408
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
58 return mk;
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
59 }
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
60
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
61 struct maildir_keywords *
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
62 maildir_keywords_init_readonly(struct mailbox *box)
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
63 {
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
64 struct maildir_keywords *mk;
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
65 const char *dir;
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
66
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
67 dir = mail_storage_get_mailbox_control_dir(box->storage, box->name);
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
68
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
69 mk = i_new(struct maildir_keywords, 1);
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
70 mk->storage = box->storage;
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
71 mk->path = i_strconcat(dir, "/" MAILDIR_KEYWORDS_NAME, NULL);
4979
b51777b0834c Grow default pool size
Timo Sirainen <tss@iki.fi>
parents: 4969
diff changeset
72 mk->pool = pool_alloconly_create("maildir keywords", 512);
4596
bf4e98a0de3f Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents: 4594
diff changeset
73 i_array_init(&mk->list, MAILDIR_MAX_KEYWORDS);
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 mk->hash = hash_create(default_pool, mk->pool, 0,
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 strcase_hash, (hash_cmp_callback_t *)strcasecmp);
4969
5c18ac362f65 More dotlock_use_excl uses.
Timo Sirainen <tss@iki.fi>
parents: 4864
diff changeset
76
5c18ac362f65 More dotlock_use_excl uses.
Timo Sirainen <tss@iki.fi>
parents: 4864
diff changeset
77 mk->dotlock_settings.use_excl_lock =
6408
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
78 (box->storage->flags & MAIL_STORAGE_FLAG_DOTLOCK_USE_EXCL) != 0;
6592
b6631550cf84 dotlocks: Flush NFS attribute cache only if nfs_flush setting is TRUE.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
79 mk->dotlock_settings.nfs_flush =
b6631550cf84 dotlocks: Flush NFS attribute cache only if nfs_flush setting is TRUE.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
80 (box->storage->flags &
b6631550cf84 dotlocks: Flush NFS attribute cache only if nfs_flush setting is TRUE.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
81 MAIL_STORAGE_FLAG_NFS_FLUSH_STORAGE) != 0;
4969
5c18ac362f65 More dotlock_use_excl uses.
Timo Sirainen <tss@iki.fi>
parents: 4864
diff changeset
82 mk->dotlock_settings.timeout = KEYWORDS_LOCK_STALE_TIMEOUT + 2;
5c18ac362f65 More dotlock_use_excl uses.
Timo Sirainen <tss@iki.fi>
parents: 4864
diff changeset
83 mk->dotlock_settings.stale_timeout = KEYWORDS_LOCK_STALE_TIMEOUT;
6408
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
84 mk->dotlock_settings.temp_prefix =
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
85 mailbox_list_get_temp_prefix(box->storage->list);
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 return mk;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88
6409
7f733ba453bf Changed *_deinit() APIs to take ** pointer and set it to NULL.
Timo Sirainen <tss@iki.fi>
parents: 6408
diff changeset
89 void maildir_keywords_deinit(struct maildir_keywords **_mk)
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 {
6409
7f733ba453bf Changed *_deinit() APIs to take ** pointer and set it to NULL.
Timo Sirainen <tss@iki.fi>
parents: 6408
diff changeset
91 struct maildir_keywords *mk = *_mk;
7f733ba453bf Changed *_deinit() APIs to take ** pointer and set it to NULL.
Timo Sirainen <tss@iki.fi>
parents: 6408
diff changeset
92
7f733ba453bf Changed *_deinit() APIs to take ** pointer and set it to NULL.
Timo Sirainen <tss@iki.fi>
parents: 6408
diff changeset
93 *_mk = NULL;
6417
047d0d8bbf0a hash_destroy() and hash_iterate_deinit() now take ** pointer.
Timo Sirainen <tss@iki.fi>
parents: 6409
diff changeset
94 hash_destroy(&mk->hash);
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 array_free(&mk->list);
6428
7cad076906eb pool_unref() now takes ** pointer.
Timo Sirainen <tss@iki.fi>
parents: 6417
diff changeset
96 pool_unref(&mk->pool);
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 i_free(mk->path);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 i_free(mk);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 static void maildir_keywords_clear(struct maildir_keywords *mk)
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 array_clear(&mk->list);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 hash_clear(mk->hash, FALSE);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 p_clear(mk->pool);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 static int maildir_keywords_sync(struct maildir_keywords *mk)
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 struct istream *input;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 struct stat st;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 char *line, *p, *new_name;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 const char **strp;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 int fd, idx;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
116 /* Remember that we rely on uidlist file locking in here. That's why
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
117 we rely on stat()'s timestamp and don't bother handling ESTALE
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
118 errors. */
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3879
diff changeset
119
6857
41911abe6fa7 NFS cache flushing updates.
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
120 if ((mk->storage->flags & MAIL_STORAGE_FLAG_NFS_FLUSH_STORAGE) != 0) {
41911abe6fa7 NFS cache flushing updates.
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
121 /* file is updated only by replacing it, no need to flush
41911abe6fa7 NFS cache flushing updates.
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
122 attribute cache */
41911abe6fa7 NFS cache flushing updates.
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
123 nfs_flush_file_handle_cache(mk->path);
41911abe6fa7 NFS cache flushing updates.
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
124 }
5974
b88278b5d8d3 Flush NFS caches when needed.
Timo Sirainen <tss@iki.fi>
parents: 5459
diff changeset
125
b88278b5d8d3 Flush NFS caches when needed.
Timo Sirainen <tss@iki.fi>
parents: 5459
diff changeset
126 if (nfs_safe_stat(mk->path, &st) < 0) {
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 if (errno == ENOENT) {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 maildir_keywords_clear(mk);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 mk->synced = TRUE;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 return 0;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 }
6408
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
132 mail_storage_set_critical(mk->storage,
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 "stat(%s) failed: %m", mk->path);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 return -1;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 if (st.st_mtime == mk->synced_mtime) {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 /* hasn't changed */
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 mk->synced = TRUE;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 return 0;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 mk->synced_mtime = st.st_mtime;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144 fd = open(mk->path, O_RDONLY);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 if (fd == -1) {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 if (errno == ENOENT) {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 maildir_keywords_clear(mk);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 mk->synced = TRUE;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 return 0;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 }
6408
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
151 mail_storage_set_critical(mk->storage,
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 "open(%s) failed: %m", mk->path);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 return -1;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 maildir_keywords_clear(mk);
6162
896cc473c1f0 Renamed i_stream_create_file() to i_stream_create_fd().
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
157 input = i_stream_create_fd(fd, 1024, FALSE);
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 while ((line = i_stream_read_next_line(input)) != NULL) {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 p = strchr(line, ' ');
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 if (p == NULL) {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 /* note that when converting .customflags file this
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 case happens in the first line. */
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 continue;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 *p++ = '\0';
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 idx = atoi(line);
6329
7d8825366e80 Ignore entries with empty keyword names.
Timo Sirainen <tss@iki.fi>
parents: 6162
diff changeset
168 if (idx < 0 || idx >= MAILDIR_MAX_KEYWORDS || *p == '\0') {
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 /* shouldn't happen */
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 continue;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 /* save it */
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 new_name = p_strdup(mk->pool, p);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 hash_insert(mk->hash, new_name, POINTER_CAST(idx + 1));
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4073
diff changeset
177 strp = array_idx_modifiable(&mk->list, idx);
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 *strp = new_name;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 }
4070
71b8faa84ec6 Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents: 4023
diff changeset
180 i_stream_destroy(&input);
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 if (close(fd) < 0) {
6408
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
183 mail_storage_set_critical(mk->storage,
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 "close(%s) failed: %m", mk->path);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 return -1;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 mk->synced = TRUE;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 return 0;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 static int
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 maildir_keywords_lookup(struct maildir_keywords *mk, const char *name)
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 void *p;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196
6408
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
197 i_assert(mk->mbox == NULL ||
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
198 maildir_uidlist_is_locked(mk->mbox->uidlist));
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 p = hash_lookup(mk->hash, name);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 if (p == NULL) {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 if (mk->synced)
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 return -1;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 if (maildir_keywords_sync(mk) < 0)
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 return -1;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 p = hash_lookup(mk->hash, name);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 if (p == NULL)
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 return -1;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 return POINTER_CAST_TO(p, int)-1;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 static void
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 maildir_keywords_create(struct maildir_keywords *mk, const char *name,
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 unsigned int chridx)
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 const char **strp;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 char *new_name;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 i_assert(chridx < MAILDIR_MAX_KEYWORDS);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 new_name = p_strdup(mk->pool, name);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 hash_insert(mk->hash, new_name, POINTER_CAST(chridx + 1));
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4073
diff changeset
228 strp = array_idx_modifiable(&mk->list, chridx);
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 *strp = new_name;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 mk->changed = TRUE;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 static int
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235 maildir_keywords_lookup_or_create(struct maildir_keywords *mk, const char *name)
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 const char *const *keywords;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 unsigned int i, count;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 int idx;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 idx = maildir_keywords_lookup(mk, name);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 if (idx >= 0)
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 return idx;
4833
cf97623a0aeb If we can't open dovecot-keywords file, don't crash.
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
244 if (!mk->synced) {
cf97623a0aeb If we can't open dovecot-keywords file, don't crash.
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
245 /* we couldn't open the dovecot-keywords file. */
cf97623a0aeb If we can't open dovecot-keywords file, don't crash.
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
246 return -1;
cf97623a0aeb If we can't open dovecot-keywords file, don't crash.
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
247 }
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 /* see if we are full */
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250 keywords = array_get(&mk->list, &count);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 for (i = 0; i < count; i++) {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252 if (keywords[i] == NULL)
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 break;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 if (i == count && count >= MAILDIR_MAX_KEYWORDS)
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 return -1;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259 maildir_keywords_create(mk, name, i);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260 return i;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 static const char *
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 maildir_keywords_idx(struct maildir_keywords *mk, unsigned int idx)
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265 {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266 const char *const *keywords;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 unsigned int count;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268
6408
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
269 i_assert(mk->mbox == NULL ||
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
270 maildir_uidlist_is_locked(mk->mbox->uidlist));
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 keywords = array_get(&mk->list, &count);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 if (idx >= count) {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 if (mk->synced)
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275 return NULL;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 if (maildir_keywords_sync(mk) < 0)
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278 return NULL;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 keywords = array_get(&mk->list, &count);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 return idx >= count ? NULL : keywords[idx];
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284
5033
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
285 static int maildir_keywords_write_fd(struct maildir_keywords *mk,
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
286 const char *path, int fd)
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
287 {
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
288 struct maildir_mailbox *mbox = mk->mbox;
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
289 const char *const *keywords;
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
290 unsigned int i, count;
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
291 string_t *str;
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
292 struct stat st;
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
293
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
294 str = t_str_new(256);
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
295 keywords = array_get(&mk->list, &count);
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
296 for (i = 0; i < count; i++) {
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
297 if (keywords[i] != NULL)
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
298 str_printfa(str, "%u %s\n", i, keywords[i]);
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
299 }
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
300 if (write_full(fd, str_data(str), str_len(str)) < 0) {
6408
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
301 mail_storage_set_critical(mk->storage,
5033
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
302 "write_full(%s) failed: %m", path);
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
303 return -1;
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
304 }
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
305
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
306 if (fstat(fd, &st) < 0) {
6408
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
307 mail_storage_set_critical(mk->storage,
5033
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
308 "fstat(%s) failed: %m", path);
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
309 return -1;
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
310 }
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
311
6598
7eb8fd17f8c5 Moved mail_create_mode/gid from struct maildir_mailbox to struct mailbox.
Timo Sirainen <tss@iki.fi>
parents: 6592
diff changeset
312 if (st.st_gid != mbox->ibox.box.file_create_gid &&
7eb8fd17f8c5 Moved mail_create_mode/gid from struct maildir_mailbox to struct mailbox.
Timo Sirainen <tss@iki.fi>
parents: 6592
diff changeset
313 mbox->ibox.box.file_create_gid != (gid_t)-1) {
7eb8fd17f8c5 Moved mail_create_mode/gid from struct maildir_mailbox to struct mailbox.
Timo Sirainen <tss@iki.fi>
parents: 6592
diff changeset
314 if (fchown(fd, (uid_t)-1, mbox->ibox.box.file_create_gid) < 0) {
6408
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
315 mail_storage_set_critical(mk->storage,
5033
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
316 "fchown(%s) failed: %m", path);
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
317 }
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
318 }
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
319
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
320 /* mtime must grow every time */
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
321 if (st.st_mtime <= mk->synced_mtime) {
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
322 struct utimbuf ut;
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
323
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
324 mk->synced_mtime = ioloop_time <= mk->synced_mtime ?
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
325 mk->synced_mtime + 1 : ioloop_time;
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
326 ut.actime = ioloop_time;
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
327 ut.modtime = mk->synced_mtime;
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
328 if (utime(path, &ut) < 0) {
6408
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
329 mail_storage_set_critical(mk->storage,
5033
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
330 "utime(%s) failed: %m", path);
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
331 return -1;
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
332 }
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
333 }
5126
fb1ebc2c7c49 fsync() subscriptions file and maildir-keywords before rename()ing them.
Timo Sirainen <tss@iki.fi>
parents: 5033
diff changeset
334
fb1ebc2c7c49 fsync() subscriptions file and maildir-keywords before rename()ing them.
Timo Sirainen <tss@iki.fi>
parents: 5033
diff changeset
335 if (fsync(fd) < 0) {
6408
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
336 mail_storage_set_critical(mk->storage,
5126
fb1ebc2c7c49 fsync() subscriptions file and maildir-keywords before rename()ing them.
Timo Sirainen <tss@iki.fi>
parents: 5033
diff changeset
337 "fsync(%s) failed: %m", path);
fb1ebc2c7c49 fsync() subscriptions file and maildir-keywords before rename()ing them.
Timo Sirainen <tss@iki.fi>
parents: 5033
diff changeset
338 return -1;
fb1ebc2c7c49 fsync() subscriptions file and maildir-keywords before rename()ing them.
Timo Sirainen <tss@iki.fi>
parents: 5033
diff changeset
339 }
5033
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
340 return 0;
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
341 }
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
342
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 static int maildir_keywords_commit(struct maildir_keywords *mk)
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 struct dotlock *dotlock;
5033
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
346 const char *lock_path;
4864
29d665ef8787 Use dovecot-shared file's mode also when creating dovecot-keywords file.
Timo Sirainen <tss@iki.fi>
parents: 4833
diff changeset
347 mode_t old_mask;
6777
186b164a9579 Delay creating directories until we really need them.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
348 int i, fd;
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350 mk->synced = FALSE;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351
6768
f8baedac2417 dbox fixes
Timo Sirainen <tss@iki.fi>
parents: 6598
diff changeset
352 if (!mk->changed || mk->mbox == NULL)
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353 return 0;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355 lock_path = t_strconcat(mk->path, ".lock", NULL);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356 (void)unlink(lock_path);
6777
186b164a9579 Delay creating directories until we really need them.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
357
186b164a9579 Delay creating directories until we really need them.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
358 for (i = 0;; i++) {
186b164a9579 Delay creating directories until we really need them.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
359 /* we could just create the temp file directly, but doing it
186b164a9579 Delay creating directories until we really need them.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
360 this ways avoids potential problems with overwriting
186b164a9579 Delay creating directories until we really need them.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
361 contents in malicious symlinks */
186b164a9579 Delay creating directories until we really need them.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
362 old_mask = umask(0777 & ~mk->mbox->ibox.box.file_create_mode);
186b164a9579 Delay creating directories until we really need them.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
363 fd = file_dotlock_open(&mk->dotlock_settings, mk->path,
186b164a9579 Delay creating directories until we really need them.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
364 DOTLOCK_CREATE_FLAG_NONBLOCK, &dotlock);
186b164a9579 Delay creating directories until we really need them.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
365 umask(old_mask);
186b164a9579 Delay creating directories until we really need them.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
366 if (fd != -1)
186b164a9579 Delay creating directories until we really need them.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
367 break;
186b164a9579 Delay creating directories until we really need them.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
368
186b164a9579 Delay creating directories until we really need them.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
369 if (errno != ENOENT || i == MAILDIR_DELETE_RETRY_COUNT) {
186b164a9579 Delay creating directories until we really need them.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
370 mail_storage_set_critical(mk->storage,
186b164a9579 Delay creating directories until we really need them.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
371 "file_dotlock_open(%s) failed: %m", mk->path);
186b164a9579 Delay creating directories until we really need them.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
372 return -1;
186b164a9579 Delay creating directories until we really need them.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
373 }
186b164a9579 Delay creating directories until we really need them.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
374 /* the control dir doesn't exist. create it unless the whole
186b164a9579 Delay creating directories until we really need them.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
375 mailbox was just deleted. */
186b164a9579 Delay creating directories until we really need them.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
376 if (maildir_set_deleted(mk->mbox))
186b164a9579 Delay creating directories until we really need them.
Timo Sirainen <tss@iki.fi>
parents: 6768
diff changeset
377 return -1;
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
378 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
379
5033
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
380 if (maildir_keywords_write_fd(mk, lock_path, fd) < 0) {
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
381 file_dotlock_delete(&dotlock);
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
382 return -1;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
383 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385 if (file_dotlock_replace(&dotlock, 0) < 0) {
6408
17ec931b51d7 Added maildir_keywords_init_readonly() which can be used to read the
Timo Sirainen <tss@iki.fi>
parents: 6335
diff changeset
386 mail_storage_set_critical(mk->storage,
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
387 "file_dotlock_replace(%s) failed: %m", mk->path);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
388 return -1;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
389 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
390
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
391 mk->changed = FALSE;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 return 0;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
393 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
395 struct maildir_keywords_sync_ctx *
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
396 maildir_keywords_sync_init(struct maildir_keywords *mk,
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
397 struct mail_index *index)
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398 {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399 struct maildir_keywords_sync_ctx *ctx;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
400
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
401 ctx = i_new(struct maildir_keywords_sync_ctx, 1);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
402 ctx->mk = mk;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
403 ctx->index = index;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
404 ctx->keywords = mail_index_get_keywords(index);
4596
bf4e98a0de3f Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents: 4594
diff changeset
405 i_array_init(&ctx->idx_to_chr, MAILDIR_MAX_KEYWORDS);
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
406 return ctx;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
407 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408
6409
7f733ba453bf Changed *_deinit() APIs to take ** pointer and set it to NULL.
Timo Sirainen <tss@iki.fi>
parents: 6408
diff changeset
409 void maildir_keywords_sync_deinit(struct maildir_keywords_sync_ctx **_ctx)
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
410 {
6409
7f733ba453bf Changed *_deinit() APIs to take ** pointer and set it to NULL.
Timo Sirainen <tss@iki.fi>
parents: 6408
diff changeset
411 struct maildir_keywords_sync_ctx *ctx = *_ctx;
7f733ba453bf Changed *_deinit() APIs to take ** pointer and set it to NULL.
Timo Sirainen <tss@iki.fi>
parents: 6408
diff changeset
412
7f733ba453bf Changed *_deinit() APIs to take ** pointer and set it to NULL.
Timo Sirainen <tss@iki.fi>
parents: 6408
diff changeset
413 *_ctx = NULL;
7f733ba453bf Changed *_deinit() APIs to take ** pointer and set it to NULL.
Timo Sirainen <tss@iki.fi>
parents: 6408
diff changeset
414
5033
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
415 t_push();
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
416 (void)maildir_keywords_commit(ctx->mk);
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
417 t_pop();
612b5c358d2e Saved mails and dovecot-keywords file didn't set the group from
Timo Sirainen <tss@iki.fi>
parents: 4979
diff changeset
418
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
419 array_free(&ctx->idx_to_chr);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420 i_free(ctx);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423 unsigned int maildir_keywords_char_idx(struct maildir_keywords_sync_ctx *ctx,
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
424 char keyword)
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
425 {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426 const char *name;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427 unsigned int chridx, idx;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
428
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
429 i_assert(keyword >= MAILDIR_KEYWORD_FIRST &&
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
430 keyword <= MAILDIR_KEYWORD_LAST);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
431 chridx = keyword - MAILDIR_KEYWORD_FIRST;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
432
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
433 if (ctx->chridx_to_idx[chridx] != 0)
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434 return ctx->chridx_to_idx[chridx];
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
436 /* lookup / create */
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437 name = maildir_keywords_idx(ctx->mk, chridx);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438 if (name == NULL) {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
439 /* name is lost. just generate one ourself. */
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
440 name = t_strdup_printf("unknown-%u", chridx);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
441 while (maildir_keywords_lookup(ctx->mk, name) >= 0) {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
442 /* don't create a duplicate name.
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
443 keep changing the name until it doesn't exist */
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
444 name = t_strconcat(name, "?", NULL);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
445 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
446 maildir_keywords_create(ctx->mk, name, chridx);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
447 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
448
6335
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6329
diff changeset
449 mail_index_keyword_lookup_or_create(ctx->index, name, &idx);
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
450 ctx->chridx_to_idx[chridx] = idx;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
451 return idx;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
452 }
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
453
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
454 char maildir_keywords_idx_char(struct maildir_keywords_sync_ctx *ctx,
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
455 unsigned int idx)
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
456 {
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
457 const char *const *name_p;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
458 char *chr_p;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
459 int chridx;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
460
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4073
diff changeset
461 chr_p = array_idx_modifiable(&ctx->idx_to_chr, idx);
3447
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
462 if (*chr_p != '\0')
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
463 return *chr_p;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
464
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
465 name_p = array_idx(ctx->keywords, idx);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
466 chridx = maildir_keywords_lookup_or_create(ctx->mk, *name_p);
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
467 if (chridx < 0)
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
468 return '\0';
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
469
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
470 *chr_p = chridx + MAILDIR_KEYWORD_FIRST;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
471 return *chr_p;
96de02ea7482 Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
472 }