Cross Reference: /dovecot/src/lib-storage/index/maildir/maildir-mail.c
cydir-storage.c revision fbd918f47f591f8084fd52b207ef29515ddd11b9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
b039dabf4c53f72454e795930e7643b6e0e625f9Timo Sirainen/* Copyright (c) 2007-2010 Dovecot authors, see the included COPYING file */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen#include "lib.h"
b039dabf4c53f72454e795930e7643b6e0e625f9Timo Sirainen#include "mail-copy.h"
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen#include "index-mail.h"
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen#include "cydir-sync.h"
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen#include "cydir-storage.h"
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen#include <sys/stat.h>
b039dabf4c53f72454e795930e7643b6e0e625f9Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenextern struct mail_storage cydir_storage;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenextern struct mailbox cydir_mailbox;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstatic struct mail_storage *cydir_storage_alloc(void)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen{
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen struct cydir_storage *storage;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen pool_t pool;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen pool = pool_alloconly_create("cydir storage", 512+256);
b5a084602a3dc2c118345f6d2990f47c1ff66264Timo Sirainen storage = p_new(pool, struct cydir_storage, 1);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen storage->storage = cydir_storage;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen storage->storage.pool = pool;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen return &storage->storage;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen}
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstatic void
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainencydir_storage_get_list_settings(const struct mail_namespace *ns ATTR_UNUSED,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen struct mailbox_list_settings *set)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen{
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (set->layout == NULL)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen set->layout = MAILBOX_LIST_NAME_FS;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (set->subscription_fname == NULL)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen set->subscription_fname = CYDIR_SUBSCRIPTION_FILE_NAME;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen}
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstatic struct mailbox *
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainencydir_mailbox_alloc(struct mail_storage *storage, struct mailbox_list *list,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen const char *name, struct istream *input,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen enum mailbox_flags flags)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen{
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen struct cydir_mailbox *mbox;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen struct index_mailbox_context *ibox;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen pool_t pool;
83c21c990eb2a370f0da56240e73dac846f4acc3Timo Sirainen
83c21c990eb2a370f0da56240e73dac846f4acc3Timo Sirainen /* cydir can't work without index files */
83c21c990eb2a370f0da56240e73dac846f4acc3Timo Sirainen flags &= ~MAILBOX_FLAG_NO_INDEX_FILES;
83c21c990eb2a370f0da56240e73dac846f4acc3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen pool = pool_alloconly_create("cydir mailbox", 1024+512);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen mbox = p_new(pool, struct cydir_mailbox, 1);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen mbox->box = cydir_mailbox;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen mbox->box.pool = pool;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen mbox->box.storage = storage;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen mbox->box.list = list;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen mbox->box.mail_vfuncs = &cydir_mail_vfuncs;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_storage_mailbox_alloc(&mbox->box, name, input, flags,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen CYDIR_INDEX_PREFIX);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen mail_index_set_fsync_types(mbox->box.index,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen MAIL_INDEX_SYNC_TYPE_APPEND |
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen MAIL_INDEX_SYNC_TYPE_EXPUNGE);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen ibox = INDEX_STORAGE_CONTEXT(&mbox->box);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen ibox->save_commit_pre = cydir_transaction_save_commit_pre;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen ibox->save_commit_post = cydir_transaction_save_commit_post;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen ibox->save_rollback = cydir_transaction_save_rollback;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen mbox->storage = (struct cydir_storage *)storage;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen return &mbox->box;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen}
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstatic int cydir_mailbox_open(struct mailbox *box)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen{
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen struct stat st;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (box->input != NULL) {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen mail_storage_set_critical(box->storage,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen "cydir doesn't support streamed mailboxes");
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen return -1;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen }
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (stat(box->path, &st) == 0) {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen /* exists, open it */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen } else if (errno == ENOENT && strcmp(box->name, "INBOX") == 0) {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen /* INBOX always exists, create it */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (box->list->v.create_mailbox_dir(box->list,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen box->name, FALSE) < 0)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen return -1;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen } else if (errno == ENOENT) {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen mail_storage_set_error(box->storage, MAIL_ERROR_NOTFOUND,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen T_MAIL_ERR_MAILBOX_NOT_FOUND(box->name));
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen return -1;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen } else if (errno == EACCES) {
65b7beb7cefce89e175920ef6c16118b1b0dbfb3Timo Sirainen mail_storage_set_critical(box->storage, "%s",
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen mail_error_eacces_msg("stat", box->path));
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen return -1;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen } else {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen mail_storage_set_critical(box->storage, "stat(%s) failed: %m",
65b7beb7cefce89e175920ef6c16118b1b0dbfb3Timo Sirainen box->path);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen return -1;
65b7beb7cefce89e175920ef6c16118b1b0dbfb3Timo Sirainen }
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen return index_storage_mailbox_open(box, FALSE);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen}
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstatic int
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainencydir_mailbox_create(struct mailbox *box, const struct mailbox_update *update,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen bool directory)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen{
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (directory &&
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen (box->list->props & MAILBOX_LIST_PROP_NO_NOSELECT) == 0)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen return 0;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen return update == NULL ? 0 :
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_storage_mailbox_update(box, update);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen}
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstatic void cydir_notify_changes(struct mailbox *box)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen{
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen struct cydir_mailbox *mbox = (struct cydir_mailbox *)box;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (box->notify_callback == NULL)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_mailbox_check_remove_all(&mbox->box);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen else
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_mailbox_check_add(&mbox->box, mbox->box.path);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen}
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstatic int cydir_list_iter_is_mailbox(struct mailbox_list_iterate_context *ctx
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen ATTR_UNUSED,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen const char *dir, const char *fname,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen const char *mailbox_name ATTR_UNUSED,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen enum mailbox_list_file_type type,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen enum mailbox_info_flags *flags)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen{
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen const char *mail_path;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen struct stat st;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen int ret = 1;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen /* try to avoid stat() with these checks */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (type != MAILBOX_LIST_FILE_TYPE_DIR &&
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen type != MAILBOX_LIST_FILE_TYPE_SYMLINK &&
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen type != MAILBOX_LIST_FILE_TYPE_UNKNOWN) {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen /* it's a file */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen *flags |= MAILBOX_NOSELECT | MAILBOX_NOINFERIORS;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen return 0;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen }
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen /* need to stat() then */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen mail_path = t_strconcat(dir, "/", fname, NULL);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (stat(mail_path, &st) == 0) {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (!S_ISDIR(st.st_mode)) {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen /* non-directory */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen *flags |= MAILBOX_NOSELECT | MAILBOX_NOINFERIORS;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen ret = 0;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen } else if (st.st_nlink == 2) {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen /* no subdirectories */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen *flags |= MAILBOX_NOCHILDREN;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen } else if (*ctx->list->set.maildir_name != '\0') {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen /* non-default configuration: we have one directory
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen containing the mailboxes. if there are 3 links,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen either this is a selectable mailbox without children
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen or non-selectable mailbox with children */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (st.st_nlink > 3)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen *flags |= MAILBOX_CHILDREN;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen } else {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen /* default configuration: all subdirectories are
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen child mailboxes. */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (st.st_nlink > 2)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen *flags |= MAILBOX_CHILDREN;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen }
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen } else if (errno == ENOENT) {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen /* doesn't exist - probably a non-existing subscribed mailbox */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen *flags |= MAILBOX_NONEXISTENT;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen } else {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen /* non-selectable. probably either access denied, or symlink
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen destination not found. don't bother logging errors. */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen *flags |= MAILBOX_NOSELECT;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen }
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen return ret;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen}
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstatic void cydir_storage_add_list(struct mail_storage *storage ATTR_UNUSED,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen struct mailbox_list *list)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen{
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen list->v.iter_is_mailbox = cydir_list_iter_is_mailbox;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen}
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstruct mail_storage cydir_storage = {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen .name = CYDIR_STORAGE_NAME,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen .class_flags = 0,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen .v = {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen NULL,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen cydir_storage_alloc,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen NULL,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen NULL,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen cydir_storage_add_list,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen cydir_storage_get_list_settings,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen NULL,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen cydir_mailbox_alloc,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen NULL
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen }
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen};
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstruct mailbox cydir_mailbox = {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen .v = {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_storage_is_readonly,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_storage_allow_new_keywords,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_storage_mailbox_enable,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen cydir_mailbox_open,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_storage_mailbox_close,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen cydir_mailbox_create,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_storage_mailbox_update,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_storage_mailbox_delete,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_storage_get_status,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen NULL,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen NULL,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen NULL,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen cydir_storage_sync_init,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_mailbox_sync_next,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_mailbox_sync_deinit,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen NULL,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen cydir_notify_changes,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_transaction_begin,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_transaction_commit,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_transaction_rollback,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_transaction_set_max_modseq,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_keywords_create,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_keywords_create_from_indexes,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_keywords_ref,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_keywords_unref,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_keyword_is_valid,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_storage_get_seq_range,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_storage_get_uid_range,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_storage_get_expunges,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen NULL,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen NULL,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen NULL,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_mail_alloc,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_header_lookup_init,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_header_lookup_deinit,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_storage_search_init,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_storage_search_deinit,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_storage_search_next_nonblock,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_storage_search_next_update_seq,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen cydir_save_alloc,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen cydir_save_begin,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen cydir_save_continue,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen cydir_save_finish,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen cydir_save_cancel,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen mail_storage_copy,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_storage_is_inconsistent
b039dabf4c53f72454e795930e7643b6e0e625f9Timo Sirainen }
b039dabf4c53f72454e795930e7643b6e0e625f9Timo Sirainen};
b039dabf4c53f72454e795930e7643b6e0e625f9Timo Sirainen