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 Sirainenstatic struct mail_storage *cydir_storage_alloc(void)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen pool = pool_alloconly_create("cydir storage", 512+256);
b5a084602a3dc2c118345f6d2990f47c1ff66264Timo Sirainen storage = p_new(pool, struct cydir_storage, 1);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainencydir_storage_get_list_settings(const struct mail_namespace *ns ATTR_UNUSED,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen set->subscription_fname = CYDIR_SUBSCRIPTION_FILE_NAME;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstatic struct mailbox *
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainencydir_mailbox_alloc(struct mail_storage *storage, struct mailbox_list *list,
83c21c990eb2a370f0da56240e73dac846f4acc3Timo Sirainen /* cydir can't work without index files */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen pool = pool_alloconly_create("cydir mailbox", 1024+512);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_storage_mailbox_alloc(&mbox->box, name, input, flags,
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 mbox->storage = (struct cydir_storage *)storage;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstatic int cydir_mailbox_open(struct mailbox *box)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen "cydir doesn't support streamed mailboxes");
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 mail_storage_set_error(box->storage, MAIL_ERROR_NOTFOUND,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen mail_storage_set_critical(box->storage, "stat(%s) failed: %m",
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen return index_storage_mailbox_open(box, FALSE);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainencydir_mailbox_create(struct mailbox *box, const struct mailbox_update *update,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen (box->list->props & MAILBOX_LIST_PROP_NO_NOSELECT) == 0)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstatic void cydir_notify_changes(struct mailbox *box)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen struct cydir_mailbox *mbox = (struct cydir_mailbox *)box;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_mailbox_check_add(&mbox->box, mbox->box.path);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstatic int cydir_list_iter_is_mailbox(struct mailbox_list_iterate_context *ctx
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen /* try to avoid stat() with these checks */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen /* it's a file */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen *flags |= MAILBOX_NOSELECT | MAILBOX_NOINFERIORS;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen /* need to stat() then */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen mail_path = t_strconcat(dir, "/", fname, NULL);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen /* non-directory */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen *flags |= MAILBOX_NOSELECT | MAILBOX_NOINFERIORS;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen /* no subdirectories */
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 /* default configuration: all subdirectories are
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen child mailboxes. */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen /* doesn't exist - probably a non-existing subscribed mailbox */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen /* non-selectable. probably either access denied, or symlink
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen destination not found. don't bother logging errors. */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstatic void cydir_storage_add_list(struct mail_storage *storage ATTR_UNUSED,