Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-storage/index/maildir/maildir-sync.c @ 5397:3a0964ac3a5c HEAD
comment/duplicate link handling fixes.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 24 Mar 2007 02:49:23 +0200 |
parents | 9a8402768b42 |
children | 293bc7d1062f |
rev | line source |
---|---|
1955 | 1 /* Copyright (C) 2004 Timo Sirainen */ |
2 | |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 /* |
1955 | 4 Here's a description of how we handle Maildir synchronization and |
5 it's problems: | |
6 | |
7 We want to be as efficient as we can. The most efficient way to | |
3520 | 8 check if changes have occurred is to stat() the new/ and cur/ |
1955 | 9 directories and uidlist file - if their mtimes haven't changed, |
10 there's no changes and we don't need to do anything. | |
11 | |
12 Problem 1: Multiple changes can happen within a single second - | |
13 nothing guarantees that once we synced it, someone else didn't just | |
14 then make a modification. Such modifications wouldn't get noticed | |
3520 | 15 until a new modification occurred later. |
1955 | 16 |
17 Problem 2: Syncing cur/ directory is much more costly than syncing | |
18 new/. Moving mails from new/ to cur/ will always change mtime of | |
19 cur/ causing us to sync it as well. | |
20 | |
21 Problem 3: We may not be able to move mail from new/ to cur/ | |
22 because we're out of quota, or simply because we're accessing a | |
23 read-only mailbox. | |
24 | |
25 | |
26 MAILDIR_SYNC_SECS | |
27 ----------------- | |
28 | |
29 Several checks below use MAILDIR_SYNC_SECS, which should be maximum | |
30 clock drift between all computers accessing the maildir (eg. via | |
31 NFS), rounded up to next second. Our default is 1 second, since | |
32 everyone should be using NTP. | |
33 | |
34 Note that setting it to 0 works only if there's only one computer | |
35 accessing the maildir. It's practically impossible to make two | |
36 clocks _exactly_ synchronized. | |
37 | |
38 It might be possible to only use file server's clock by looking at | |
39 the atime field, but I don't know how well that would actually work. | |
40 | |
41 cur directory | |
42 ------------- | |
43 | |
44 We have dirty_cur_time variable which is set to cur/ directory's | |
45 mtime when it's >= time() - MAILDIR_SYNC_SECS and we _think_ we have | |
46 synchronized the directory. | |
47 | |
48 When dirty_cur_time is non-zero, we don't synchronize the cur/ | |
49 directory until | |
50 | |
51 a) cur/'s mtime changes | |
52 b) opening a mail fails with ENOENT | |
53 c) time() > dirty_cur_time + MAILDIR_SYNC_SECS | |
54 | |
55 This allows us to modify the maildir multiple times without having | |
56 to sync it at every change. The sync will eventually be done to | |
57 make sure we didn't miss any external changes. | |
58 | |
59 The dirty_cur_time is set when: | |
60 | |
61 - we change message flags | |
62 - we expunge messages | |
63 - we move mail from new/ to cur/ | |
64 - we sync cur/ directory and it's mtime is >= time() - MAILDIR_SYNC_SECS | |
65 | |
66 It's unset when we do the final syncing, ie. when mtime is | |
67 older than time() - MAILDIR_SYNC_SECS. | |
68 | |
69 new directory | |
70 ------------- | |
71 | |
72 If new/'s mtime is >= time() - MAILDIR_SYNC_SECS, always synchronize | |
73 it. dirty_cur_time-like feature might save us a few syncs, but | |
74 that might break a client which saves a mail in one connection and | |
75 tries to fetch it in another one. new/ directory is almost always | |
76 empty, so syncing it should be very fast anyway. Actually this can | |
77 still happen if we sync only new/ dir while another client is also | |
78 moving mails from it to cur/ - it takes us a while to see them. | |
79 That's pretty unlikely to happen however, and only way to fix it | |
80 would be to always synchronize cur/ after new/. | |
81 | |
82 Normally we move all mails from new/ to cur/ whenever we sync it. If | |
83 it's not possible for some reason, we mark the mail with "probably | |
84 exists in new/ directory" flag. | |
85 | |
86 If rename() still fails because of ENOSPC or EDQUOT, we still save | |
87 the flag changes in index with dirty-flag on. When moving the mail | |
88 to cur/ directory, or when we notice it's already moved there, we | |
89 apply the flag changes to the filename, rename it and remove the | |
90 dirty flag. If there's dirty flags, this should be tried every time | |
91 after expunge or when closing the mailbox. | |
92 | |
93 uidlist | |
94 ------- | |
95 | |
96 This file contains UID <-> filename mappings. It's updated only when | |
97 new mail arrives, so it may contain filenames that have already been | |
98 deleted. Updating is done by getting uidlist.lock file, writing the | |
99 whole uidlist into it and rename()ing it over the old uidlist. This | |
100 means there's no need to lock the file for reading. | |
101 | |
102 Whenever uidlist is rewritten, it's mtime must be larger than the old | |
103 one's. Use utime() before rename() if needed. Note that inode checking | |
104 wouldn't have been sufficient as inode numbers can be reused. | |
105 | |
106 This file is usually read the first time you need to know filename for | |
107 given UID. After that it's not re-read unless new mails come that we | |
108 don't know about. | |
109 | |
110 broken clients | |
111 -------------- | |
112 | |
113 Originally the middle identifier in Maildir filename was specified | |
114 only as <process id>_<delivery counter>. That however created a | |
115 problem with randomized PIDs which made it possible that the same | |
116 PID was reused within one second. | |
117 | |
118 So if within one second a mail was delivered, MUA moved it to cur/ | |
119 and another mail was delivered by a new process using same PID as | |
120 the first one, we likely ended up overwriting the first mail when | |
121 the second mail was moved over it. | |
122 | |
123 Nowadays everyone should be giving a bit more specific identifier, | |
124 for example include microseconds in it which Dovecot does. | |
125 | |
126 There's a simple way to prevent this from happening in some cases: | |
127 Don't move the mail from new/ to cur/ if it's mtime is >= time() - | |
128 MAILDIR_SYNC_SECS. The second delivery's link() call then fails | |
129 because the file is already in new/, and it will then use a | |
130 different filename. There's a few problems with this however: | |
131 | |
132 - it requires extra stat() call which is unneeded extra I/O | |
133 - another MUA might still move the mail to cur/ | |
134 - if first file's flags are modified by either Dovecot or another | |
135 MUA, it's moved to cur/ (you _could_ just do the dirty-flagging | |
136 but that'd be ugly) | |
137 | |
138 Because this is useful only for very few people and it requires | |
139 extra I/O, I decided not to implement this. It should be however | |
140 quite easy to do since we need to be able to deal with files in new/ | |
141 in any case. | |
142 | |
143 It's also possible to never accidentally overwrite a mail by using | |
144 link() + unlink() rather than rename(). This however isn't very | |
145 good idea as it introduces potential race conditions when multiple | |
146 clients are accessing the mailbox: | |
147 | |
148 Trying to move the same mail from new/ to cur/ at the same time: | |
149 | |
150 a) Client 1 uses slightly different filename than client 2, | |
151 for example one sets read-flag on but the other doesn't. | |
152 You have the same mail duplicated now. | |
153 | |
154 b) Client 3 sees the mail between Client 1's and 2's link() calls | |
155 and changes it's flag. You have the same mail duplicated now. | |
156 | |
157 And it gets worse when they're unlink()ing in cur/ directory: | |
158 | |
159 c) Client 1 changes mails's flag and client 2 changes it back | |
160 between 1's link() and unlink(). The mail is now expunged. | |
161 | |
162 d) If you try to deal with the duplicates by unlink()ing another | |
163 one of them, you might end up unlinking both of them. | |
164 | |
165 So, what should we do then if we notice a duplicate? First of all, | |
166 it might not be a duplicate at all, readdir() might have just | |
167 returned it twice because it was just renamed. What we should do is | |
168 create a completely new base name for it and rename() it to that. | |
169 If the call fails with ENOENT, it only means that it wasn't a | |
170 duplicate after all. | |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 */ |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 #include "lib.h" |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 #include "ioloop.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:
3453
diff
changeset
|
175 #include "array.h" |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 #include "buffer.h" |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 #include "hash.h" |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 #include "str.h" |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 #include "maildir-storage.h" |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 #include "maildir-uidlist.h" |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
181 #include "maildir-keywords.h" |
4848
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
182 #include "maildir-sync.h" |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 #include <stdio.h> |
2050
ee1095ccfd23
Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents:
2039
diff
changeset
|
185 #include <stddef.h> |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 #include <unistd.h> |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 #include <dirent.h> |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 #include <sys/stat.h> |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 #define MAILDIR_FILENAME_FLAG_FOUND 128 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 |
3435
6f7ce690358e
If we have rename()d more than 5 files from new/ to cur/, rescan the
Timo Sirainen <tss@iki.fi>
parents:
3417
diff
changeset
|
192 /* When rename()ing many files from new/ to cur/, it's possible that next |
6f7ce690358e
If we have rename()d more than 5 files from new/ to cur/, rescan the
Timo Sirainen <tss@iki.fi>
parents:
3417
diff
changeset
|
193 readdir() skips some files. we don't of course wish to lose them, so we |
6f7ce690358e
If we have rename()d more than 5 files from new/ to cur/, rescan the
Timo Sirainen <tss@iki.fi>
parents:
3417
diff
changeset
|
194 go and rescan the new/ directory again from beginning until no files are |
6f7ce690358e
If we have rename()d more than 5 files from new/ to cur/, rescan the
Timo Sirainen <tss@iki.fi>
parents:
3417
diff
changeset
|
195 left. This value is just an optimization to avoid checking the directory |
6f7ce690358e
If we have rename()d more than 5 files from new/ to cur/, rescan the
Timo Sirainen <tss@iki.fi>
parents:
3417
diff
changeset
|
196 twice unneededly. usually only NFS is the problem case. 1 is the safest |
6f7ce690358e
If we have rename()d more than 5 files from new/ to cur/, rescan the
Timo Sirainen <tss@iki.fi>
parents:
3417
diff
changeset
|
197 bet here, but I guess 5 will do just fine too. */ |
6f7ce690358e
If we have rename()d more than 5 files from new/ to cur/, rescan the
Timo Sirainen <tss@iki.fi>
parents:
3417
diff
changeset
|
198 #define MAILDIR_RENAME_RESCAN_COUNT 5 |
6f7ce690358e
If we have rename()d more than 5 files from new/ to cur/, rescan the
Timo Sirainen <tss@iki.fi>
parents:
3417
diff
changeset
|
199 |
5214
4e9d345df846
When syncing huge maildirs check once in a while if we need to update
Timo Sirainen <tss@iki.fi>
parents:
5080
diff
changeset
|
200 /* After moving 100 mails from new/ to cur/, check if we need to touch the |
4e9d345df846
When syncing huge maildirs check once in a while if we need to update
Timo Sirainen <tss@iki.fi>
parents:
5080
diff
changeset
|
201 uidlist lock. */ |
4e9d345df846
When syncing huge maildirs check once in a while if we need to update
Timo Sirainen <tss@iki.fi>
parents:
5080
diff
changeset
|
202 #define MAILDIR_SLOW_MOVE_COUNT 100 |
4e9d345df846
When syncing huge maildirs check once in a while if we need to update
Timo Sirainen <tss@iki.fi>
parents:
5080
diff
changeset
|
203 /* readdir() should be pretty fast to do, but check anyway every 10000 mails |
4e9d345df846
When syncing huge maildirs check once in a while if we need to update
Timo Sirainen <tss@iki.fi>
parents:
5080
diff
changeset
|
204 to see if we need to touch the uidlist lock. */ |
4e9d345df846
When syncing huge maildirs check once in a while if we need to update
Timo Sirainen <tss@iki.fi>
parents:
5080
diff
changeset
|
205 #define MAILDIR_SLOW_CHECK_COUNT 10000 |
4e9d345df846
When syncing huge maildirs check once in a while if we need to update
Timo Sirainen <tss@iki.fi>
parents:
5080
diff
changeset
|
206 |
5397
3a0964ac3a5c
comment/duplicate link handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
5392
diff
changeset
|
207 /* This is mostly to avoid infinite looping when rename() destination already |
3a0964ac3a5c
comment/duplicate link handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
5392
diff
changeset
|
208 exists as the hard link of the file itself. */ |
5391
0c8705aad54c
Avoid infinite looping when buggy filesystems.
Timo Sirainen <tss@iki.fi>
parents:
5390
diff
changeset
|
209 #define MAILDIR_SCAN_DIR_MAX_COUNT 5 |
0c8705aad54c
Avoid infinite looping when buggy filesystems.
Timo Sirainen <tss@iki.fi>
parents:
5390
diff
changeset
|
210 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 struct maildir_sync_context { |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
212 struct maildir_mailbox *mbox; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 const char *new_dir, *cur_dir; |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3821
diff
changeset
|
214 bool partial; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 |
5368
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
216 unsigned int move_count, check_count; |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
217 time_t last_touch, last_notify; |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
218 |
2818
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
219 struct maildir_uidlist_sync_ctx *uidlist_sync_ctx; |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
220 struct maildir_index_sync_context *index_sync_ctx; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
221 }; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
222 |
1956
d6941cd8afdc
Added support for setting dirty flags for messages (TODO: undirty..)
Timo Sirainen <tss@iki.fi>
parents:
1955
diff
changeset
|
223 struct maildir_index_sync_context { |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
224 struct maildir_mailbox *mbox; |
5368
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
225 struct maildir_sync_context *maildir_sync_ctx; |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
226 |
2037
8763032d31bd
Set dirty flags through transaction log, not directly. Some other flag
Timo Sirainen <tss@iki.fi>
parents:
2034
diff
changeset
|
227 struct mail_index_view *view; |
1956
d6941cd8afdc
Added support for setting dirty flags for messages (TODO: undirty..)
Timo Sirainen <tss@iki.fi>
parents:
1955
diff
changeset
|
228 struct mail_index_sync_ctx *sync_ctx; |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
229 struct maildir_keywords_sync_ctx *keywords_sync_ctx; |
2037
8763032d31bd
Set dirty flags through transaction log, not directly. Some other flag
Timo Sirainen <tss@iki.fi>
parents:
2034
diff
changeset
|
230 struct mail_index_transaction *trans; |
1956
d6941cd8afdc
Added support for setting dirty flags for messages (TODO: undirty..)
Timo Sirainen <tss@iki.fi>
parents:
1955
diff
changeset
|
231 |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4450
diff
changeset
|
232 ARRAY_DEFINE(sync_recs, struct mail_index_sync_rec); |
1956
d6941cd8afdc
Added support for setting dirty flags for messages (TODO: undirty..)
Timo Sirainen <tss@iki.fi>
parents:
1955
diff
changeset
|
233 uint32_t seq; |
2272
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2258
diff
changeset
|
234 int dirty_state; |
1956
d6941cd8afdc
Added support for setting dirty flags for messages (TODO: undirty..)
Timo Sirainen <tss@iki.fi>
parents:
1955
diff
changeset
|
235 }; |
d6941cd8afdc
Added support for setting dirty flags for messages (TODO: undirty..)
Timo Sirainen <tss@iki.fi>
parents:
1955
diff
changeset
|
236 |
3775
8321e6191275
maildir_copy_with_hardlinks works again.
Timo Sirainen <tss@iki.fi>
parents:
3583
diff
changeset
|
237 struct maildir_keywords_sync_ctx * |
8321e6191275
maildir_copy_with_hardlinks works again.
Timo Sirainen <tss@iki.fi>
parents:
3583
diff
changeset
|
238 maildir_sync_get_keywords_sync_ctx(struct maildir_index_sync_context *ctx) |
8321e6191275
maildir_copy_with_hardlinks works again.
Timo Sirainen <tss@iki.fi>
parents:
3583
diff
changeset
|
239 { |
8321e6191275
maildir_copy_with_hardlinks works again.
Timo Sirainen <tss@iki.fi>
parents:
3583
diff
changeset
|
240 return ctx->keywords_sync_ctx; |
8321e6191275
maildir_copy_with_hardlinks works again.
Timo Sirainen <tss@iki.fi>
parents:
3583
diff
changeset
|
241 } |
8321e6191275
maildir_copy_with_hardlinks works again.
Timo Sirainen <tss@iki.fi>
parents:
3583
diff
changeset
|
242 |
8321e6191275
maildir_copy_with_hardlinks works again.
Timo Sirainen <tss@iki.fi>
parents:
3583
diff
changeset
|
243 int maildir_filename_get_flags(struct maildir_keywords_sync_ctx *ctx, |
8321e6191275
maildir_copy_with_hardlinks works again.
Timo Sirainen <tss@iki.fi>
parents:
3583
diff
changeset
|
244 const char *fname, enum mail_flags *flags_r, |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4450
diff
changeset
|
245 ARRAY_TYPE(keyword_indexes) *keywords_r) |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
246 { |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
247 const char *info; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
248 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
249 array_clear(keywords_r); |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
250 *flags_r = 0; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
251 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
252 info = strchr(fname, MAILDIR_INFO_SEP); |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
253 if (info == NULL || info[1] != '2' || info[2] != MAILDIR_FLAGS_SEP) |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
254 return 0; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
255 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
256 for (info += 3; *info != '\0' && *info != MAILDIR_FLAGS_SEP; info++) { |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
257 switch (*info) { |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
258 case 'R': /* replied */ |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
259 *flags_r |= MAIL_ANSWERED; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
260 break; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
261 case 'S': /* seen */ |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
262 *flags_r |= MAIL_SEEN; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
263 break; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
264 case 'T': /* trashed */ |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
265 *flags_r |= MAIL_DELETED; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
266 break; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
267 case 'D': /* draft */ |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
268 *flags_r |= MAIL_DRAFT; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
269 break; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
270 case 'F': /* flagged */ |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
271 *flags_r |= MAIL_FLAGGED; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
272 break; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
273 default: |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
274 if (*info >= MAILDIR_KEYWORD_FIRST && |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
275 *info <= MAILDIR_KEYWORD_LAST) { |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
276 int idx; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
277 |
3775
8321e6191275
maildir_copy_with_hardlinks works again.
Timo Sirainen <tss@iki.fi>
parents:
3583
diff
changeset
|
278 idx = maildir_keywords_char_idx(ctx, *info); |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
279 if (idx < 0) { |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
280 /* unknown keyword. */ |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
281 break; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
282 } |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
283 |
3563 | 284 array_append(keywords_r, |
285 (unsigned int *)&idx, 1); | |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
286 break; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
287 } |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
288 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
289 /* unknown flag - ignore */ |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
290 break; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
291 } |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
292 } |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
293 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
294 return 1; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
295 } |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
296 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
297 static void |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
298 maildir_filename_append_keywords(struct maildir_keywords_sync_ctx *ctx, |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4450
diff
changeset
|
299 ARRAY_TYPE(keyword_indexes) *keywords, |
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4450
diff
changeset
|
300 string_t *str) |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
301 { |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
302 const unsigned int *indexes; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
303 unsigned int i, count; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
304 char chr; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
305 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
306 indexes = array_get(keywords, &count); |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
307 for (i = 0; i < count; i++) { |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
308 chr = maildir_keywords_idx_char(ctx, indexes[i]); |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
309 if (chr != '\0') |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
310 str_append_c(str, chr); |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
311 } |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
312 } |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
313 |
3775
8321e6191275
maildir_copy_with_hardlinks works again.
Timo Sirainen <tss@iki.fi>
parents:
3583
diff
changeset
|
314 const char *maildir_filename_set_flags(struct maildir_keywords_sync_ctx *ctx, |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
315 const char *fname, enum mail_flags flags, |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4450
diff
changeset
|
316 ARRAY_TYPE(keyword_indexes) *keywords) |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
317 { |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
318 string_t *flags_str; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
319 enum mail_flags flags_left; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
320 const char *info, *oldflags; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
321 int nextflag; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
322 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
323 /* remove the old :info from file name, and get the old flags */ |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
324 info = strrchr(fname, MAILDIR_INFO_SEP); |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
325 if (info != NULL && strrchr(fname, '/') > info) |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
326 info = NULL; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
327 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
328 oldflags = ""; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
329 if (info != NULL) { |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
330 fname = t_strdup_until(fname, info); |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
331 if (info[1] == '2' && info[2] == MAILDIR_FLAGS_SEP) |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
332 oldflags = info+3; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
333 } |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
334 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
335 /* insert the new flags between old flags. flags must be sorted by |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
336 their ASCII code. unknown flags are kept. */ |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
337 flags_str = t_str_new(256); |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
338 str_append(flags_str, fname); |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
339 str_append(flags_str, MAILDIR_FLAGS_FULL_SEP); |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
340 flags_left = flags; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
341 for (;;) { |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
342 /* skip all known flags */ |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
343 while (*oldflags == 'D' || *oldflags == 'F' || |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
344 *oldflags == 'R' || *oldflags == 'S' || |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
345 *oldflags == 'T' || |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
346 (*oldflags >= MAILDIR_KEYWORD_FIRST && |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
347 *oldflags <= MAILDIR_KEYWORD_LAST)) |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
348 oldflags++; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
349 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
350 nextflag = *oldflags == '\0' || *oldflags == MAILDIR_FLAGS_SEP ? |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
351 256 : (unsigned char) *oldflags; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
352 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
353 if ((flags_left & MAIL_DRAFT) && nextflag > 'D') { |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
354 str_append_c(flags_str, 'D'); |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
355 flags_left &= ~MAIL_DRAFT; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
356 } |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
357 if ((flags_left & MAIL_FLAGGED) && nextflag > 'F') { |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
358 str_append_c(flags_str, 'F'); |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
359 flags_left &= ~MAIL_FLAGGED; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
360 } |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
361 if ((flags_left & MAIL_ANSWERED) && nextflag > 'R') { |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
362 str_append_c(flags_str, 'R'); |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
363 flags_left &= ~MAIL_ANSWERED; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
364 } |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
365 if ((flags_left & MAIL_SEEN) && nextflag > 'S') { |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
366 str_append_c(flags_str, 'S'); |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
367 flags_left &= ~MAIL_SEEN; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
368 } |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
369 if ((flags_left & MAIL_DELETED) && nextflag > 'T') { |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
370 str_append_c(flags_str, 'T'); |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
371 flags_left &= ~MAIL_DELETED; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
372 } |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
373 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
374 if (keywords != NULL && array_is_created(keywords) && |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
375 nextflag > MAILDIR_KEYWORD_FIRST) { |
3775
8321e6191275
maildir_copy_with_hardlinks works again.
Timo Sirainen <tss@iki.fi>
parents:
3583
diff
changeset
|
376 maildir_filename_append_keywords(ctx, keywords, |
8321e6191275
maildir_copy_with_hardlinks works again.
Timo Sirainen <tss@iki.fi>
parents:
3583
diff
changeset
|
377 flags_str); |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
378 keywords = NULL; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
379 } |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
380 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
381 if (*oldflags == '\0' || *oldflags == MAILDIR_FLAGS_SEP) |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
382 break; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
383 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
384 str_append_c(flags_str, *oldflags); |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
385 oldflags++; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
386 } |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
387 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
388 if (*oldflags == MAILDIR_FLAGS_SEP) { |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
389 /* another flagset, we don't know about these, just keep them */ |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
390 while (*oldflags != '\0') |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
391 str_append_c(flags_str, *oldflags++); |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
392 } |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
393 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
394 return str_c(flags_str); |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
395 } |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
396 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
397 static int maildir_expunge(struct maildir_mailbox *mbox, const char *path, |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
398 void *context __attr_unused__) |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
399 { |
1955 | 400 if (unlink(path) == 0) { |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
401 mbox->dirty_cur_time = ioloop_time; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
402 return 1; |
1955 | 403 } |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
404 if (errno == ENOENT) |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
405 return 0; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
406 |
3280
2c72492dfd91
Created mbox_storage and maildir_storage.
Timo Sirainen <tss@iki.fi>
parents:
3279
diff
changeset
|
407 mail_storage_set_critical(STORAGE(mbox->storage), |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
408 "unlink(%s) failed: %m", path); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
409 return -1; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
410 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
411 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
412 static int maildir_sync_flags(struct maildir_mailbox *mbox, const char *path, |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4894
diff
changeset
|
413 struct maildir_index_sync_context *ctx) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
414 { |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
415 const struct mail_index_sync_rec *recs; |
4450
14b10f7ea70e
Don't break if mailbox path contains ':' characters.
Timo Sirainen <tss@iki.fi>
parents:
4397
diff
changeset
|
416 const char *dir, *fname, *newfname, *newpath; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
417 enum mail_flags flags; |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4450
diff
changeset
|
418 ARRAY_TYPE(keyword_indexes) keywords; |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
419 unsigned int i, count; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
420 uint8_t flags8; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
421 |
2272
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2258
diff
changeset
|
422 ctx->dirty_state = 0; |
2037
8763032d31bd
Set dirty flags through transaction log, not directly. Some other flag
Timo Sirainen <tss@iki.fi>
parents:
2034
diff
changeset
|
423 |
4450
14b10f7ea70e
Don't break if mailbox path contains ':' characters.
Timo Sirainen <tss@iki.fi>
parents:
4397
diff
changeset
|
424 fname = strrchr(path, '/'); |
14b10f7ea70e
Don't break if mailbox path contains ':' characters.
Timo Sirainen <tss@iki.fi>
parents:
4397
diff
changeset
|
425 i_assert(fname != NULL); |
14b10f7ea70e
Don't break if mailbox path contains ':' characters.
Timo Sirainen <tss@iki.fi>
parents:
4397
diff
changeset
|
426 fname++; |
14b10f7ea70e
Don't break if mailbox path contains ':' characters.
Timo Sirainen <tss@iki.fi>
parents:
4397
diff
changeset
|
427 dir = t_strdup_until(path, fname); |
14b10f7ea70e
Don't break if mailbox path contains ':' characters.
Timo Sirainen <tss@iki.fi>
parents:
4397
diff
changeset
|
428 |
4596
bf4e98a0de3f
Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents:
4594
diff
changeset
|
429 t_array_init(&keywords, 16); |
3775
8321e6191275
maildir_copy_with_hardlinks works again.
Timo Sirainen <tss@iki.fi>
parents:
3583
diff
changeset
|
430 (void)maildir_filename_get_flags(ctx->keywords_sync_ctx, |
4450
14b10f7ea70e
Don't break if mailbox path contains ':' characters.
Timo Sirainen <tss@iki.fi>
parents:
4397
diff
changeset
|
431 fname, &flags, &keywords); |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
432 flags8 = flags; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
433 |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4450
diff
changeset
|
434 recs = array_get_modifiable(&ctx->sync_recs, &count); |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
435 for (i = 0; i < count; i++) { |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
436 if (recs[i].uid1 != ctx->seq) |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
437 break; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
438 |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
439 switch (recs[i].type) { |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
440 case MAIL_INDEX_SYNC_TYPE_FLAGS: |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
441 mail_index_sync_flags_apply(&recs[i], &flags8); |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
442 break; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
443 case MAIL_INDEX_SYNC_TYPE_KEYWORD_ADD: |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
444 case MAIL_INDEX_SYNC_TYPE_KEYWORD_REMOVE: |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
445 case MAIL_INDEX_SYNC_TYPE_KEYWORD_RESET: |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
446 mail_index_sync_keywords_apply(&recs[i], &keywords); |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
447 break; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
448 case MAIL_INDEX_SYNC_TYPE_APPEND: |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
449 case MAIL_INDEX_SYNC_TYPE_EXPUNGE: |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
450 i_unreached(); |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
451 break; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
452 } |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
453 } |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
454 |
4450
14b10f7ea70e
Don't break if mailbox path contains ':' characters.
Timo Sirainen <tss@iki.fi>
parents:
4397
diff
changeset
|
455 |
14b10f7ea70e
Don't break if mailbox path contains ':' characters.
Timo Sirainen <tss@iki.fi>
parents:
4397
diff
changeset
|
456 newfname = maildir_filename_set_flags(ctx->keywords_sync_ctx, |
14b10f7ea70e
Don't break if mailbox path contains ':' characters.
Timo Sirainen <tss@iki.fi>
parents:
4397
diff
changeset
|
457 fname, flags8, &keywords); |
14b10f7ea70e
Don't break if mailbox path contains ':' characters.
Timo Sirainen <tss@iki.fi>
parents:
4397
diff
changeset
|
458 newpath = t_strconcat(dir, newfname, NULL); |
1955 | 459 if (rename(path, newpath) == 0) { |
2272
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2258
diff
changeset
|
460 if ((flags8 & MAIL_INDEX_MAIL_FLAG_DIRTY) != 0) |
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2258
diff
changeset
|
461 ctx->dirty_state = -1; |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
462 mbox->dirty_cur_time = ioloop_time; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
463 return 1; |
1955 | 464 } |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
465 if (errno == ENOENT) |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
466 return 0; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
467 |
2037
8763032d31bd
Set dirty flags through transaction log, not directly. Some other flag
Timo Sirainen <tss@iki.fi>
parents:
2034
diff
changeset
|
468 if (ENOSPACE(errno) || errno == EACCES) { |
8763032d31bd
Set dirty flags through transaction log, not directly. Some other flag
Timo Sirainen <tss@iki.fi>
parents:
2034
diff
changeset
|
469 mail_index_update_flags(ctx->trans, ctx->seq, MODIFY_ADD, |
5307
1e2b2b3f18e3
Added casts to some enums to avoid compiler warnings.
Timo Sirainen <tss@iki.fi>
parents:
5229
diff
changeset
|
470 (enum mail_flags)MAIL_INDEX_MAIL_FLAG_DIRTY); |
2272
ced88553af0b
mail_index_sync_sort_flags() now merges flag changes so mail storage
Timo Sirainen <tss@iki.fi>
parents:
2258
diff
changeset
|
471 ctx->dirty_state = 1; |
1956
d6941cd8afdc
Added support for setting dirty flags for messages (TODO: undirty..)
Timo Sirainen <tss@iki.fi>
parents:
1955
diff
changeset
|
472 return 1; |
d6941cd8afdc
Added support for setting dirty flags for messages (TODO: undirty..)
Timo Sirainen <tss@iki.fi>
parents:
1955
diff
changeset
|
473 } |
d6941cd8afdc
Added support for setting dirty flags for messages (TODO: undirty..)
Timo Sirainen <tss@iki.fi>
parents:
1955
diff
changeset
|
474 |
3280
2c72492dfd91
Created mbox_storage and maildir_storage.
Timo Sirainen <tss@iki.fi>
parents:
3279
diff
changeset
|
475 mail_storage_set_critical(STORAGE(mbox->storage), |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
476 "rename(%s, %s) failed: %m", path, newpath); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
477 return -1; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
478 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
479 |
5368
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
480 static void |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
481 maildir_sync_check_timeouts(struct maildir_sync_context *ctx, bool move) |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
482 { |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
483 time_t now; |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
484 |
5390
4eeec560df01
If saving to maildir causes flag/expunge syncs, don't crash.
Timo Sirainen <tss@iki.fi>
parents:
5388
diff
changeset
|
485 if (ctx == NULL) { |
4eeec560df01
If saving to maildir causes flag/expunge syncs, don't crash.
Timo Sirainen <tss@iki.fi>
parents:
5388
diff
changeset
|
486 /* we got here from maildir-save.c. it has no |
4eeec560df01
If saving to maildir causes flag/expunge syncs, don't crash.
Timo Sirainen <tss@iki.fi>
parents:
5388
diff
changeset
|
487 maildir_sync_context, */ |
4eeec560df01
If saving to maildir causes flag/expunge syncs, don't crash.
Timo Sirainen <tss@iki.fi>
parents:
5388
diff
changeset
|
488 return; |
4eeec560df01
If saving to maildir causes flag/expunge syncs, don't crash.
Timo Sirainen <tss@iki.fi>
parents:
5388
diff
changeset
|
489 } |
4eeec560df01
If saving to maildir causes flag/expunge syncs, don't crash.
Timo Sirainen <tss@iki.fi>
parents:
5388
diff
changeset
|
490 |
5368
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
491 if (move) { |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
492 ctx->move_count++; |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
493 if ((ctx->move_count % MAILDIR_SLOW_MOVE_COUNT) != 0) |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
494 return; |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
495 } else { |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
496 ctx->check_count++; |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
497 if ((ctx->check_count % MAILDIR_SLOW_CHECK_COUNT) != 0) |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
498 return; |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
499 } |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
500 |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
501 now = time(NULL); |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
502 if (now - ctx->last_touch > MAILDIR_LOCK_TOUCH_SECS) { |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
503 (void)maildir_uidlist_lock_touch(ctx->mbox->uidlist); |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
504 ctx->last_touch = now; |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
505 } |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
506 if (now - ctx->last_notify > MAIL_STORAGE_STAYALIVE_SECS) { |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
507 struct mailbox *box = &ctx->mbox->ibox.box; |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
508 |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
509 if (box->storage->callbacks->notify_ok != NULL) { |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
510 box->storage->callbacks-> |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
511 notify_ok(box, "Hang in there..", |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
512 box->storage->callback_context); |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
513 } |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
514 ctx->last_notify = now; |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
515 } |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
516 } |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
517 |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
518 static int |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
519 maildir_sync_record_commit_until(struct maildir_index_sync_context *ctx, |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
520 uint32_t last_seq) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
521 { |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
522 struct mail_index_sync_rec *recs; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
523 unsigned int i, count; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
524 uint32_t seq, uid; |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3821
diff
changeset
|
525 bool expunged, flag_changed; |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
526 |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4450
diff
changeset
|
527 recs = array_get_modifiable(&ctx->sync_recs, &count); |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
528 for (seq = recs[0].uid1; seq <= last_seq; seq++) { |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
529 expunged = flag_changed = FALSE; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
530 for (i = 0; i < count; i++) { |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
531 if (recs[i].uid1 > seq) |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
532 break; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
533 |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
534 i_assert(recs[i].uid1 == seq); |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
535 switch (recs[i].type) { |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
536 case MAIL_INDEX_SYNC_TYPE_EXPUNGE: |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
537 expunged = TRUE; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
538 break; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
539 case MAIL_INDEX_SYNC_TYPE_FLAGS: |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
540 case MAIL_INDEX_SYNC_TYPE_KEYWORD_ADD: |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
541 case MAIL_INDEX_SYNC_TYPE_KEYWORD_REMOVE: |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
542 case MAIL_INDEX_SYNC_TYPE_KEYWORD_RESET: |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
543 flag_changed = TRUE; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
544 break; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
545 case MAIL_INDEX_SYNC_TYPE_APPEND: |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
546 i_unreached(); |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
547 break; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
548 } |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
549 } |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
550 |
5080 | 551 if (mail_index_lookup_uid(ctx->view, seq, &uid) < 0) { |
552 mail_storage_set_index_error(&ctx->mbox->ibox); | |
2033
4f6b1118a53d
Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents:
2009
diff
changeset
|
553 return -1; |
5080 | 554 } |
2033
4f6b1118a53d
Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents:
2009
diff
changeset
|
555 |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
556 ctx->seq = seq; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
557 if (expunged) { |
5368
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
558 maildir_sync_check_timeouts(ctx->maildir_sync_ctx, |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
559 TRUE); |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
560 if (maildir_file_do(ctx->mbox, uid, |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
561 maildir_expunge, ctx) < 0) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
562 return -1; |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
563 } else if (flag_changed) { |
5368
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
564 maildir_sync_check_timeouts(ctx->maildir_sync_ctx, |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
565 TRUE); |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
566 if (maildir_file_do(ctx->mbox, uid, |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
567 maildir_sync_flags, ctx) < 0) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
568 return -1; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
569 } |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
570 |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
571 for (i = count; i > 0; i--) { |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
572 if (++recs[i-1].uid1 > recs[i-1].uid2) { |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
573 array_delete(&ctx->sync_recs, i-1, 1); |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4450
diff
changeset
|
574 recs = array_get_modifiable(&ctx->sync_recs, |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
575 &count); |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
576 if (count == 0) { |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
577 /* all sync_recs committed */ |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
578 return 0; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
579 } |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
580 } |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
581 } |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
582 } |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
583 return 0; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
584 } |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
585 |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
586 static int maildir_sync_record(struct maildir_index_sync_context *ctx, |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
587 const struct mail_index_sync_rec *sync_rec) |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
588 { |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
589 struct mail_index_view *view = ctx->view; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
590 struct mail_index_sync_rec sync_copy; |
2033
4f6b1118a53d
Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents:
2009
diff
changeset
|
591 |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
592 if (sync_rec == NULL) { |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
593 /* deinit */ |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
594 while (array_count(&ctx->sync_recs) > 0) { |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
595 if (maildir_sync_record_commit_until(ctx, |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
596 (uint32_t)-1) < 0) |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
597 return -1; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
598 } |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
599 return 0; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
600 } |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
601 |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
602 if (sync_rec->type == MAIL_INDEX_SYNC_TYPE_APPEND) |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
603 return 0; /* ignore */ |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
604 |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
605 /* convert to sequences to avoid looping through huge holes in |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
606 UID range */ |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
607 sync_copy = *sync_rec; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
608 if (mail_index_lookup_uid_range(view, sync_rec->uid1, |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
609 sync_rec->uid2, |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
610 &sync_copy.uid1, |
5080 | 611 &sync_copy.uid2) < 0) { |
612 mail_storage_set_index_error(&ctx->mbox->ibox); | |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
613 return -1; |
5080 | 614 } |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
615 |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
616 if (sync_copy.uid1 == 0) { |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
617 /* UIDs were expunged */ |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
618 return 0; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
619 } |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
620 |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
621 while (array_count(&ctx->sync_recs) > 0) { |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
622 const struct mail_index_sync_rec *rec = |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
623 array_idx(&ctx->sync_recs, 0); |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
624 |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
625 i_assert(rec->uid1 <= sync_copy.uid1); |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
626 if (rec->uid1 == sync_copy.uid1) |
2033
4f6b1118a53d
Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents:
2009
diff
changeset
|
627 break; |
4f6b1118a53d
Transaction log contains only UIDs now, no more sequences which just mess up
Timo Sirainen <tss@iki.fi>
parents:
2009
diff
changeset
|
628 |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
629 if (maildir_sync_record_commit_until(ctx, sync_copy.uid1-1) < 0) |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
630 return -1; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
631 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
632 |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
633 array_append(&ctx->sync_recs, &sync_copy, 1); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
634 return 0; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
635 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
636 |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
637 static int maildir_sync_index_records(struct maildir_index_sync_context *ctx) |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
638 { |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
639 struct mail_index_sync_rec sync_rec; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
640 int ret; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
641 |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
642 ret = mail_index_sync_next(ctx->sync_ctx, &sync_rec); |
5080 | 643 if (ret <= 0) { |
644 if (ret < 0) | |
645 mail_storage_set_index_error(&ctx->mbox->ibox); | |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
646 return ret; |
5080 | 647 } |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
648 |
4596
bf4e98a0de3f
Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents:
4594
diff
changeset
|
649 t_array_init(&ctx->sync_recs, 32); |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
650 do { |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
651 if (maildir_sync_record(ctx, &sync_rec) < 0) |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
652 return -1; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
653 |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
654 ret = mail_index_sync_next(ctx->sync_ctx, &sync_rec); |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
655 } while (ret > 0); |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
656 |
5080 | 657 if (ret < 0) |
658 mail_storage_set_index_error(&ctx->mbox->ibox); | |
659 | |
3446
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
660 if (maildir_sync_record(ctx, NULL) < 0) |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
661 return -1; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
662 return ret; |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
663 } |
113c888cdca1
Merge changes from multiple index sync records into one before actually
Timo Sirainen <tss@iki.fi>
parents:
3436
diff
changeset
|
664 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
665 static struct maildir_sync_context * |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
666 maildir_sync_context_new(struct maildir_mailbox *mbox) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
667 { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
668 struct maildir_sync_context *ctx; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
669 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
670 ctx = t_new(struct maildir_sync_context, 1); |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
671 ctx->mbox = mbox; |
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
672 ctx->new_dir = t_strconcat(mbox->path, "/new", NULL); |
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
673 ctx->cur_dir = t_strconcat(mbox->path, "/cur", NULL); |
5368
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
674 ctx->last_touch = ioloop_time; |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
675 ctx->last_notify = ioloop_time; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
676 return ctx; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
677 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
678 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
679 static void maildir_sync_deinit(struct maildir_sync_context *ctx) |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
680 { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
681 if (ctx->uidlist_sync_ctx != NULL) |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
682 (void)maildir_uidlist_sync_deinit(&ctx->uidlist_sync_ctx); |
4774
615b7738a62f
Saving mails could have skipped over transactions, which caused different
Timo Sirainen <tss@iki.fi>
parents:
4612
diff
changeset
|
683 if (ctx->index_sync_ctx != NULL) { |
615b7738a62f
Saving mails could have skipped over transactions, which caused different
Timo Sirainen <tss@iki.fi>
parents:
4612
diff
changeset
|
684 (void)maildir_sync_index_finish(&ctx->index_sync_ctx, |
615b7738a62f
Saving mails could have skipped over transactions, which caused different
Timo Sirainen <tss@iki.fi>
parents:
4612
diff
changeset
|
685 TRUE, FALSE); |
615b7738a62f
Saving mails could have skipped over transactions, which caused different
Timo Sirainen <tss@iki.fi>
parents:
4612
diff
changeset
|
686 } |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
687 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
688 |
4397
5cbabd4ccd9c
Don't go fixing duplicate maildir filenames without properly checking that
Timo Sirainen <tss@iki.fi>
parents:
4238
diff
changeset
|
689 static int maildir_fix_duplicate(struct maildir_sync_context *ctx, |
5cbabd4ccd9c
Don't go fixing duplicate maildir filenames without properly checking that
Timo Sirainen <tss@iki.fi>
parents:
4238
diff
changeset
|
690 const char *dir, const char *old_fname) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
691 { |
4397
5cbabd4ccd9c
Don't go fixing duplicate maildir filenames without properly checking that
Timo Sirainen <tss@iki.fi>
parents:
4238
diff
changeset
|
692 struct maildir_mailbox *mbox = ctx->mbox; |
5cbabd4ccd9c
Don't go fixing duplicate maildir filenames without properly checking that
Timo Sirainen <tss@iki.fi>
parents:
4238
diff
changeset
|
693 const char *existing_fname, *existing_path; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
694 const char *new_fname, *old_path, *new_path; |
5397
3a0964ac3a5c
comment/duplicate link handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
5392
diff
changeset
|
695 struct stat ex_st, old_st; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
696 int ret = 0; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
697 |
4397
5cbabd4ccd9c
Don't go fixing duplicate maildir filenames without properly checking that
Timo Sirainen <tss@iki.fi>
parents:
4238
diff
changeset
|
698 existing_fname = |
5cbabd4ccd9c
Don't go fixing duplicate maildir filenames without properly checking that
Timo Sirainen <tss@iki.fi>
parents:
4238
diff
changeset
|
699 maildir_uidlist_sync_get_full_filename(ctx->uidlist_sync_ctx, |
5cbabd4ccd9c
Don't go fixing duplicate maildir filenames without properly checking that
Timo Sirainen <tss@iki.fi>
parents:
4238
diff
changeset
|
700 old_fname); |
5cbabd4ccd9c
Don't go fixing duplicate maildir filenames without properly checking that
Timo Sirainen <tss@iki.fi>
parents:
4238
diff
changeset
|
701 i_assert(existing_fname != NULL); |
5cbabd4ccd9c
Don't go fixing duplicate maildir filenames without properly checking that
Timo Sirainen <tss@iki.fi>
parents:
4238
diff
changeset
|
702 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
703 t_push(); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
704 |
4397
5cbabd4ccd9c
Don't go fixing duplicate maildir filenames without properly checking that
Timo Sirainen <tss@iki.fi>
parents:
4238
diff
changeset
|
705 existing_path = t_strconcat(dir, "/", existing_fname, NULL); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
706 old_path = t_strconcat(dir, "/", old_fname, NULL); |
4397
5cbabd4ccd9c
Don't go fixing duplicate maildir filenames without properly checking that
Timo Sirainen <tss@iki.fi>
parents:
4238
diff
changeset
|
707 |
5392
9a8402768b42
If duplicate links are found, rename() one over the other to get rid of
Timo Sirainen <tss@iki.fi>
parents:
5391
diff
changeset
|
708 if (stat(existing_path, &ex_st) < 0 || |
9a8402768b42
If duplicate links are found, rename() one over the other to get rid of
Timo Sirainen <tss@iki.fi>
parents:
5391
diff
changeset
|
709 stat(old_path, &old_st) < 0) { |
4397
5cbabd4ccd9c
Don't go fixing duplicate maildir filenames without properly checking that
Timo Sirainen <tss@iki.fi>
parents:
4238
diff
changeset
|
710 /* most likely the files just don't exist anymore. |
5cbabd4ccd9c
Don't go fixing duplicate maildir filenames without properly checking that
Timo Sirainen <tss@iki.fi>
parents:
4238
diff
changeset
|
711 don't really care about other errors much. */ |
5cbabd4ccd9c
Don't go fixing duplicate maildir filenames without properly checking that
Timo Sirainen <tss@iki.fi>
parents:
4238
diff
changeset
|
712 t_pop(); |
5cbabd4ccd9c
Don't go fixing duplicate maildir filenames without properly checking that
Timo Sirainen <tss@iki.fi>
parents:
4238
diff
changeset
|
713 return 0; |
5cbabd4ccd9c
Don't go fixing duplicate maildir filenames without properly checking that
Timo Sirainen <tss@iki.fi>
parents:
4238
diff
changeset
|
714 } |
5392
9a8402768b42
If duplicate links are found, rename() one over the other to get rid of
Timo Sirainen <tss@iki.fi>
parents:
5391
diff
changeset
|
715 if (ex_st.st_ino == old_st.st_ino && |
9a8402768b42
If duplicate links are found, rename() one over the other to get rid of
Timo Sirainen <tss@iki.fi>
parents:
5391
diff
changeset
|
716 CMP_DEV_T(ex_st.st_dev, old_st.st_dev)) { |
5397
3a0964ac3a5c
comment/duplicate link handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
5392
diff
changeset
|
717 /* Files are the same. this means either a race condition |
5392
9a8402768b42
If duplicate links are found, rename() one over the other to get rid of
Timo Sirainen <tss@iki.fi>
parents:
5391
diff
changeset
|
718 between stat() calls, or that the files were link()ed. |
9a8402768b42
If duplicate links are found, rename() one over the other to get rid of
Timo Sirainen <tss@iki.fi>
parents:
5391
diff
changeset
|
719 |
5397
3a0964ac3a5c
comment/duplicate link handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
5392
diff
changeset
|
720 There's really no easy way to handle this. If the files |
3a0964ac3a5c
comment/duplicate link handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
5392
diff
changeset
|
721 really are duplicate links, rename()ing one on top of |
3a0964ac3a5c
comment/duplicate link handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
5392
diff
changeset
|
722 another won't work. Then again if we unlink() one of them |
3a0964ac3a5c
comment/duplicate link handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
5392
diff
changeset
|
723 and this was actually a race condition, we just deleted |
3a0964ac3a5c
comment/duplicate link handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
5392
diff
changeset
|
724 a mail. |
5392
9a8402768b42
If duplicate links are found, rename() one over the other to get rid of
Timo Sirainen <tss@iki.fi>
parents:
5391
diff
changeset
|
725 |
5397
3a0964ac3a5c
comment/duplicate link handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
5392
diff
changeset
|
726 So for now, just do nothing. Lets hope there aren't any |
3a0964ac3a5c
comment/duplicate link handling fixes.
Timo Sirainen <tss@iki.fi>
parents:
5392
diff
changeset
|
727 duplicate links in the maildir. */ |
4397
5cbabd4ccd9c
Don't go fixing duplicate maildir filenames without properly checking that
Timo Sirainen <tss@iki.fi>
parents:
4238
diff
changeset
|
728 t_pop(); |
5cbabd4ccd9c
Don't go fixing duplicate maildir filenames without properly checking that
Timo Sirainen <tss@iki.fi>
parents:
4238
diff
changeset
|
729 return 0; |
5cbabd4ccd9c
Don't go fixing duplicate maildir filenames without properly checking that
Timo Sirainen <tss@iki.fi>
parents:
4238
diff
changeset
|
730 } |
5cbabd4ccd9c
Don't go fixing duplicate maildir filenames without properly checking that
Timo Sirainen <tss@iki.fi>
parents:
4238
diff
changeset
|
731 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
732 new_fname = maildir_generate_tmp_filename(&ioloop_timeval); |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
733 new_path = t_strconcat(mbox->path, "/new/", new_fname, NULL); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
734 |
5392
9a8402768b42
If duplicate links are found, rename() one over the other to get rid of
Timo Sirainen <tss@iki.fi>
parents:
5391
diff
changeset
|
735 if (rename(old_path, new_path) == 0) |
9a8402768b42
If duplicate links are found, rename() one over the other to get rid of
Timo Sirainen <tss@iki.fi>
parents:
5391
diff
changeset
|
736 i_warning("Fixed a duplicate: %s -> %s", old_fname, new_fname); |
9a8402768b42
If duplicate links are found, rename() one over the other to get rid of
Timo Sirainen <tss@iki.fi>
parents:
5391
diff
changeset
|
737 else if (errno != ENOENT) { |
3280
2c72492dfd91
Created mbox_storage and maildir_storage.
Timo Sirainen <tss@iki.fi>
parents:
3279
diff
changeset
|
738 mail_storage_set_critical(STORAGE(mbox->storage), |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
739 "rename(%s, %s) failed: %m", old_path, new_path); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
740 ret = -1; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
741 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
742 t_pop(); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
743 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
744 return ret; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
745 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
746 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3821
diff
changeset
|
747 static int maildir_scan_dir(struct maildir_sync_context *ctx, bool new_dir) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
748 { |
3280
2c72492dfd91
Created mbox_storage and maildir_storage.
Timo Sirainen <tss@iki.fi>
parents:
3279
diff
changeset
|
749 struct mail_storage *storage = STORAGE(ctx->mbox->storage); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
750 const char *dir; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
751 DIR *dirp; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
752 string_t *src, *dest; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
753 struct dirent *dp; |
3435
6f7ce690358e
If we have rename()d more than 5 files from new/ to cur/, rescan the
Timo Sirainen <tss@iki.fi>
parents:
3417
diff
changeset
|
754 enum maildir_uidlist_rec_flag flags; |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3821
diff
changeset
|
755 int ret = 1; |
5214
4e9d345df846
When syncing huge maildirs check once in a while if we need to update
Timo Sirainen <tss@iki.fi>
parents:
5080
diff
changeset
|
756 bool move_new, check_touch; |
4e9d345df846
When syncing huge maildirs check once in a while if we need to update
Timo Sirainen <tss@iki.fi>
parents:
5080
diff
changeset
|
757 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
758 dir = new_dir ? ctx->new_dir : ctx->cur_dir; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
759 dirp = opendir(dir); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
760 if (dirp == NULL) { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
761 mail_storage_set_critical(storage, |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
762 "opendir(%s) failed: %m", dir); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
763 return -1; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
764 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
765 |
2121 | 766 t_push(); |
767 src = t_str_new(1024); | |
768 dest = t_str_new(1024); | |
769 | |
5368
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
770 ctx->move_count = 0; |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
771 move_new = new_dir && !mailbox_is_readonly(&ctx->mbox->ibox.box) && |
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
772 !ctx->mbox->ibox.keep_recent; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
773 while ((dp = readdir(dirp)) != NULL) { |
2258
087a43e29492
No maildir filename checking after all.
Timo Sirainen <tss@iki.fi>
parents:
2256
diff
changeset
|
774 if (dp->d_name[0] == '.') |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
775 continue; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
776 |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1970
diff
changeset
|
777 ret = maildir_uidlist_sync_next_pre(ctx->uidlist_sync_ctx, |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1970
diff
changeset
|
778 dp->d_name); |
1984 | 779 if (ret == 0) { |
2038
df504dad3aec
Recent flag fixes. Should work perfectly now with maildir.
Timo Sirainen <tss@iki.fi>
parents:
2037
diff
changeset
|
780 /* new file and we couldn't lock uidlist, check this |
df504dad3aec
Recent flag fixes. Should work perfectly now with maildir.
Timo Sirainen <tss@iki.fi>
parents:
2037
diff
changeset
|
781 later in next sync. */ |
1984 | 782 if (new_dir) |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
783 ctx->mbox->last_new_mtime = 0; |
1984 | 784 else |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
785 ctx->mbox->dirty_cur_time = ioloop_time; |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1970
diff
changeset
|
786 continue; |
1984 | 787 } |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1970
diff
changeset
|
788 if (ret < 0) |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1970
diff
changeset
|
789 break; |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1970
diff
changeset
|
790 |
5214
4e9d345df846
When syncing huge maildirs check once in a while if we need to update
Timo Sirainen <tss@iki.fi>
parents:
5080
diff
changeset
|
791 check_touch = FALSE; |
1947 | 792 flags = 0; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
793 if (move_new) { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
794 str_truncate(src, 0); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
795 str_truncate(dest, 0); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
796 str_printfa(src, "%s/%s", ctx->new_dir, dp->d_name); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
797 str_printfa(dest, "%s/%s", ctx->cur_dir, dp->d_name); |
3417
b0bdf32564b7
Replaced ':' and ',' character usages with #defines, so they can be changed
Timo Sirainen <tss@iki.fi>
parents:
3340
diff
changeset
|
798 if (strchr(dp->d_name, MAILDIR_INFO_SEP) == NULL) { |
b0bdf32564b7
Replaced ':' and ',' character usages with #defines, so they can be changed
Timo Sirainen <tss@iki.fi>
parents:
3340
diff
changeset
|
799 str_append(dest, MAILDIR_FLAGS_FULL_SEP); |
b0bdf32564b7
Replaced ':' and ',' character usages with #defines, so they can be changed
Timo Sirainen <tss@iki.fi>
parents:
3340
diff
changeset
|
800 } |
1947 | 801 if (rename(str_c(src), str_c(dest)) == 0) { |
1984 | 802 /* we moved it - it's \Recent for us */ |
5368
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
803 maildir_sync_check_timeouts(ctx, TRUE); |
3435
6f7ce690358e
If we have rename()d more than 5 files from new/ to cur/, rescan the
Timo Sirainen <tss@iki.fi>
parents:
3417
diff
changeset
|
804 ctx->mbox->dirty_cur_time = ioloop_time; |
1947 | 805 flags |= MAILDIR_UIDLIST_REC_FLAG_MOVED | |
806 MAILDIR_UIDLIST_REC_FLAG_RECENT; | |
807 } else if (ENOTFOUND(errno)) { | |
808 /* someone else moved it already */ | |
5368
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
809 maildir_sync_check_timeouts(ctx, TRUE); |
1947 | 810 flags |= MAILDIR_UIDLIST_REC_FLAG_MOVED; |
4199
fa135b615b01
If maildir is readonly, don't complain about rename() failing to move mails
Timo Sirainen <tss@iki.fi>
parents:
4152
diff
changeset
|
811 } else if (ENOSPACE(errno) || errno == EACCES) { |
fa135b615b01
If maildir is readonly, don't complain about rename() failing to move mails
Timo Sirainen <tss@iki.fi>
parents:
4152
diff
changeset
|
812 /* not enough disk space / read-only maildir, |
fa135b615b01
If maildir is readonly, don't complain about rename() failing to move mails
Timo Sirainen <tss@iki.fi>
parents:
4152
diff
changeset
|
813 leave here */ |
1947 | 814 flags |= MAILDIR_UIDLIST_REC_FLAG_NEW_DIR | |
815 MAILDIR_UIDLIST_REC_FLAG_RECENT; | |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
816 move_new = FALSE; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
817 } else { |
1947 | 818 flags |= MAILDIR_UIDLIST_REC_FLAG_NEW_DIR | |
819 MAILDIR_UIDLIST_REC_FLAG_RECENT; | |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
820 mail_storage_set_critical(storage, |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
821 "rename(%s, %s) failed: %m", |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
822 str_c(src), str_c(dest)); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
823 } |
1947 | 824 } else if (new_dir) { |
825 flags |= MAILDIR_UIDLIST_REC_FLAG_NEW_DIR | | |
826 MAILDIR_UIDLIST_REC_FLAG_RECENT; | |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
827 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
828 |
5368
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
829 maildir_sync_check_timeouts(ctx, FALSE); |
5214
4e9d345df846
When syncing huge maildirs check once in a while if we need to update
Timo Sirainen <tss@iki.fi>
parents:
5080
diff
changeset
|
830 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
831 ret = maildir_uidlist_sync_next(ctx->uidlist_sync_ctx, |
1947 | 832 dp->d_name, flags); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
833 if (ret <= 0) { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
834 if (ret < 0) |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
835 break; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
836 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
837 /* possibly duplicate - try fixing it */ |
4397
5cbabd4ccd9c
Don't go fixing duplicate maildir filenames without properly checking that
Timo Sirainen <tss@iki.fi>
parents:
4238
diff
changeset
|
838 if (maildir_fix_duplicate(ctx, dir, dp->d_name) < 0) { |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
839 ret = -1; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
840 break; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
841 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
842 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
843 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
844 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
845 if (closedir(dirp) < 0) { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
846 mail_storage_set_critical(storage, |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
847 "closedir(%s) failed: %m", dir); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
848 } |
2121 | 849 |
850 t_pop(); | |
5368
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
851 return ret < 0 ? -1 : |
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
852 (ctx->move_count <= MAILDIR_RENAME_RESCAN_COUNT ? 0 : 1); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
853 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
854 |
3472
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
855 static void |
4848
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
856 maildir_sync_update_from_header(struct maildir_mailbox *mbox, |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
857 struct mail_index_header *hdr_r) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
858 { |
4848
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
859 struct mail_index_view *view; |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
860 const struct mail_index_header *hdr; |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
861 |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
862 /* open a new view so we get the latest header */ |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
863 view = mail_index_view_open(mbox->ibox.index); |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
864 hdr = mail_index_get_header(view); |
3472
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
865 |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
866 /* FIXME: ugly, replace with extension header */ |
4848
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
867 mbox->last_new_mtime = hdr->sync_size & 0xffffffff; |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
868 mbox->last_dirty_flags = (hdr->sync_size >> 32) & |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
869 (MAILDIR_DIRTY_NEW | MAILDIR_DIRTY_CUR); |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
870 |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
871 mbox->last_cur_mtime = hdr->sync_stamp; |
3472
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
872 |
4848
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
873 if ((mbox->last_dirty_flags & MAILDIR_DIRTY_CUR) != 0 && |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
874 mbox->dirty_cur_time < mbox->last_cur_mtime) |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
875 mbox->dirty_cur_time = mbox->last_cur_mtime; |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
876 |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
877 *hdr_r = *hdr; |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
878 mail_index_view_close(&view); |
3472
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
879 } |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
880 |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
881 static int |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
882 maildir_sync_quick_check(struct maildir_mailbox *mbox, |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
883 const char *new_dir, const char *cur_dir, |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3821
diff
changeset
|
884 bool *new_changed_r, bool *cur_changed_r) |
3472
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
885 { |
4126
63d6890803b3
If mailbox is opened in non-readonly state and there are mails in new/, make
Timo Sirainen <tss@iki.fi>
parents:
4107
diff
changeset
|
886 struct index_mailbox *ibox = &mbox->ibox; |
4848
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
887 struct mail_index_header hdr; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
888 struct stat st; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
889 time_t new_mtime, cur_mtime; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
890 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
891 *new_changed_r = *cur_changed_r = FALSE; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
892 |
3472
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
893 if (stat(new_dir, &st) < 0) { |
3280
2c72492dfd91
Created mbox_storage and maildir_storage.
Timo Sirainen <tss@iki.fi>
parents:
3279
diff
changeset
|
894 mail_storage_set_critical(STORAGE(mbox->storage), |
3472
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
895 "stat(%s) failed: %m", new_dir); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
896 return -1; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
897 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
898 new_mtime = st.st_mtime; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
899 |
3472
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
900 if (stat(cur_dir, &st) < 0) { |
3280
2c72492dfd91
Created mbox_storage and maildir_storage.
Timo Sirainen <tss@iki.fi>
parents:
3279
diff
changeset
|
901 mail_storage_set_critical(STORAGE(mbox->storage), |
3472
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
902 "stat(%s) failed: %m", cur_dir); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
903 return -1; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
904 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
905 cur_mtime = st.st_mtime; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
906 |
2893
fd431866c674
mail_index_refresh() isn't public anymore, mail_index_view_open_locked()
Timo Sirainen <tss@iki.fi>
parents:
2892
diff
changeset
|
907 /* cur stamp is kept in index, we don't have to sync if |
3472
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
908 someone else has done it and updated the index. |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
909 |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
910 FIXME: For now we're using sync_size field as the new/ dir's stamp. |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
911 Pretty ugly.. */ |
4848
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
912 maildir_sync_update_from_header(mbox, &hdr); |
3472
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
913 if ((mbox->dirty_cur_time == 0 && cur_mtime != mbox->last_cur_mtime) || |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
914 (new_mtime != mbox->last_new_mtime)) { |
2893
fd431866c674
mail_index_refresh() isn't public anymore, mail_index_view_open_locked()
Timo Sirainen <tss@iki.fi>
parents:
2892
diff
changeset
|
915 /* check if the index has been updated.. */ |
4126
63d6890803b3
If mailbox is opened in non-readonly state and there are mails in new/, make
Timo Sirainen <tss@iki.fi>
parents:
4107
diff
changeset
|
916 if (mail_index_refresh(ibox->index) < 0) { |
63d6890803b3
If mailbox is opened in non-readonly state and there are mails in new/, make
Timo Sirainen <tss@iki.fi>
parents:
4107
diff
changeset
|
917 mail_storage_set_index_error(ibox); |
2064
5cfdc99fab69
Don't use internal last_cur_mtime stamp - it's index-specific so always get
Timo Sirainen <tss@iki.fi>
parents:
2053
diff
changeset
|
918 return -1; |
5cfdc99fab69
Don't use internal last_cur_mtime stamp - it's index-specific so always get
Timo Sirainen <tss@iki.fi>
parents:
2053
diff
changeset
|
919 } |
5cfdc99fab69
Don't use internal last_cur_mtime stamp - it's index-specific so always get
Timo Sirainen <tss@iki.fi>
parents:
2053
diff
changeset
|
920 |
4848
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
921 maildir_sync_update_from_header(mbox, &hdr); |
1954 | 922 } |
923 | |
4126
63d6890803b3
If mailbox is opened in non-readonly state and there are mails in new/, make
Timo Sirainen <tss@iki.fi>
parents:
4107
diff
changeset
|
924 /* If we're removing recent flags, always sync new/ directory if |
63d6890803b3
If mailbox is opened in non-readonly state and there are mails in new/, make
Timo Sirainen <tss@iki.fi>
parents:
4107
diff
changeset
|
925 it has mails. */ |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
926 if (new_mtime != mbox->last_new_mtime || |
4848
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
927 ((mbox->last_dirty_flags & MAILDIR_DIRTY_NEW) != 0 && |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
928 new_mtime < ioloop_time - MAILDIR_SYNC_SECS) || |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
929 (!ibox->keep_recent && hdr.recent_messages_count > 0)) { |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
930 *new_changed_r = TRUE; |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
931 mbox->last_new_mtime = new_mtime; |
4848
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
932 |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
933 if (new_mtime < ioloop_time - MAILDIR_SYNC_SECS) |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
934 mbox->last_dirty_flags &= ~MAILDIR_DIRTY_NEW; |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
935 else |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
936 mbox->last_dirty_flags |= MAILDIR_DIRTY_NEW; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
937 } |
1954 | 938 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
939 if (cur_mtime != mbox->last_cur_mtime || |
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
940 (mbox->dirty_cur_time != 0 && |
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
941 ioloop_time - mbox->dirty_cur_time > MAILDIR_SYNC_SECS)) { |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
942 /* cur/ changed, or delayed cur/ check */ |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
943 *cur_changed_r = TRUE; |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
944 mbox->last_cur_mtime = cur_mtime; |
1984 | 945 |
4848
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
946 if (cur_mtime < ioloop_time - MAILDIR_SYNC_SECS) { |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
947 mbox->last_dirty_flags &= ~MAILDIR_DIRTY_CUR; |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
948 mbox->dirty_cur_time = 0; |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
949 } else { |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
950 mbox->last_dirty_flags |= MAILDIR_DIRTY_CUR; |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
951 mbox->dirty_cur_time = cur_mtime; |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
952 } |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
953 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
954 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
955 return 0; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
956 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
957 |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
958 int maildir_sync_index_begin(struct maildir_mailbox *mbox, |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
959 struct maildir_index_sync_context **ctx_r) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
960 { |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
961 struct maildir_index_sync_context *ctx; |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
962 struct mail_index_sync_ctx *sync_ctx; |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
963 struct mail_index_view *view; |
2818
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
964 |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
965 if (mail_index_sync_begin(mbox->ibox.index, &sync_ctx, &view, |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
966 (uint32_t)-1, (uoff_t)-1, |
2818
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
967 FALSE, FALSE) <= 0) { |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
968 mail_storage_set_index_error(&mbox->ibox); |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
969 return -1; |
2818
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
970 } |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
971 |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
972 ctx = i_new(struct maildir_index_sync_context, 1); |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
973 ctx->mbox = mbox; |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
974 ctx->sync_ctx = sync_ctx; |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
975 ctx->view = view; |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
976 ctx->keywords_sync_ctx = |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
977 maildir_keywords_sync_init(mbox->keywords, mbox->ibox.index); |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
978 *ctx_r = ctx; |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
979 return 0; |
2818
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
980 } |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
981 |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
982 int maildir_sync_index_finish(struct maildir_index_sync_context **_sync_ctx, |
4774
615b7738a62f
Saving mails could have skipped over transactions, which caused different
Timo Sirainen <tss@iki.fi>
parents:
4612
diff
changeset
|
983 bool failed, bool cancel) |
2818
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
984 { |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
985 struct maildir_index_sync_context *sync_ctx = *_sync_ctx; |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
986 struct maildir_mailbox *mbox = sync_ctx->mbox; |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
987 uint32_t seq; |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
988 uoff_t offset; |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
989 int ret = failed ? -1 : 0; |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
990 |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
991 *_sync_ctx = NULL; |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
992 |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
993 if (sync_ctx->trans != NULL) { |
4774
615b7738a62f
Saving mails could have skipped over transactions, which caused different
Timo Sirainen <tss@iki.fi>
parents:
4612
diff
changeset
|
994 if (ret < 0 || cancel) |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
995 mail_index_transaction_rollback(&sync_ctx->trans); |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
996 else { |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
997 if (mail_index_transaction_commit(&sync_ctx->trans, |
5080 | 998 &seq, &offset) < 0) { |
999 mail_storage_set_index_error(&mbox->ibox); | |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1000 ret = -1; |
5080 | 1001 } else if (seq != 0) { |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1002 mbox->ibox.commit_log_file_seq = seq; |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1003 mbox->ibox.commit_log_file_offset = offset; |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1004 } |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1005 } |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1006 } |
4774
615b7738a62f
Saving mails could have skipped over transactions, which caused different
Timo Sirainen <tss@iki.fi>
parents:
4612
diff
changeset
|
1007 if (ret < 0 || cancel) |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1008 mail_index_sync_rollback(&sync_ctx->sync_ctx); |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1009 else { |
4612
2c033ffc8f6f
maildir_storage_sync_force() crashed if called from mail index sync/expunge
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
1010 /* Set syncing_commit=TRUE so that if any sync callbacks try |
2c033ffc8f6f
maildir_storage_sync_force() crashed if called from mail index sync/expunge
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
1011 to access mails which got lost (eg. expunge callback trying |
2c033ffc8f6f
maildir_storage_sync_force() crashed if called from mail index sync/expunge
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
1012 to open the file which was just unlinked) we don't try to |
2c033ffc8f6f
maildir_storage_sync_force() crashed if called from mail index sync/expunge
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
1013 start a second index sync and crash. */ |
2c033ffc8f6f
maildir_storage_sync_force() crashed if called from mail index sync/expunge
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
1014 mbox->syncing_commit = TRUE; |
5080 | 1015 if (mail_index_sync_commit(&sync_ctx->sync_ctx) < 0) { |
1016 mail_storage_set_index_error(&mbox->ibox); | |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1017 ret = -1; |
5080 | 1018 } else { |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1019 mbox->ibox.commit_log_file_seq = 0; |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1020 mbox->ibox.commit_log_file_offset = 0; |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1021 } |
4612
2c033ffc8f6f
maildir_storage_sync_force() crashed if called from mail index sync/expunge
Timo Sirainen <tss@iki.fi>
parents:
4596
diff
changeset
|
1022 mbox->syncing_commit = FALSE; |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1023 } |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1024 |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1025 maildir_keywords_sync_deinit(sync_ctx->keywords_sync_ctx); |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1026 sync_ctx->keywords_sync_ctx = NULL; |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1027 |
2818
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1028 i_free(sync_ctx); |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1029 return ret; |
2818
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1030 } |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1031 |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1032 int maildir_sync_index(struct maildir_index_sync_context *sync_ctx, |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1033 bool partial) |
2818
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1034 { |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1035 struct maildir_mailbox *mbox = sync_ctx->mbox; |
2818
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1036 struct mail_index_view *view = sync_ctx->view; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1037 struct maildir_uidlist_iter_ctx *iter; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1038 struct mail_index_transaction *trans; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1039 const struct mail_index_header *hdr; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1040 const struct mail_index_record *rec; |
5229 | 1041 uint32_t seq, uid, prev_uid; |
1954 | 1042 enum maildir_uidlist_rec_flag uflags; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1043 const char *filename; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1044 enum mail_flags flags; |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4450
diff
changeset
|
1045 ARRAY_TYPE(keyword_indexes) keywords; |
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4450
diff
changeset
|
1046 ARRAY_TYPE(keyword_indexes) idx_keywords; |
2050
ee1095ccfd23
Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents:
2039
diff
changeset
|
1047 uint32_t uid_validity, next_uid; |
3472
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1048 uint64_t value; |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3821
diff
changeset
|
1049 int ret = 0; |
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3821
diff
changeset
|
1050 bool full_rescan = FALSE; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1051 |
3453 | 1052 i_assert(maildir_uidlist_is_locked(sync_ctx->mbox->uidlist)); |
1053 | |
2892
62d53b49110d
Changed mail_index_get_header() to return the header as return value because
Timo Sirainen <tss@iki.fi>
parents:
2877
diff
changeset
|
1054 hdr = mail_index_get_header(view); |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1055 uid_validity = maildir_uidlist_get_uid_validity(mbox->uidlist); |
2051
596267d8e2e2
Some more UIDVALIDITY issues fixed.
Timo Sirainen <tss@iki.fi>
parents:
2050
diff
changeset
|
1056 if (uid_validity != hdr->uid_validity && |
596267d8e2e2
Some more UIDVALIDITY issues fixed.
Timo Sirainen <tss@iki.fi>
parents:
2050
diff
changeset
|
1057 uid_validity != 0 && hdr->uid_validity != 0) { |
2050
ee1095ccfd23
Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents:
2039
diff
changeset
|
1058 /* uidvalidity changed and mailbox isn't being initialized, |
3322
49071cc19102
If UIDVALIDITY changes, don't invalidate the whole index. Just expunge all
Timo Sirainen <tss@iki.fi>
parents:
3280
diff
changeset
|
1059 reset mailbox so we can add all messages as new */ |
3280
2c72492dfd91
Created mbox_storage and maildir_storage.
Timo Sirainen <tss@iki.fi>
parents:
3279
diff
changeset
|
1060 mail_storage_set_critical(STORAGE(mbox->storage), |
2067
3f97439ba59e
Path was missing from Maildir sync-errors.
Timo Sirainen <tss@iki.fi>
parents:
2064
diff
changeset
|
1061 "Maildir %s sync: UIDVALIDITY changed (%u -> %u)", |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1062 mbox->path, hdr->uid_validity, uid_validity); |
3322
49071cc19102
If UIDVALIDITY changes, don't invalidate the whole index. Just expunge all
Timo Sirainen <tss@iki.fi>
parents:
3280
diff
changeset
|
1063 |
3340
9c8220dfde7c
Don't try to handle UIDVALIDITY changes nicely after all. It causes
Timo Sirainen <tss@iki.fi>
parents:
3322
diff
changeset
|
1064 mail_index_mark_corrupted(mbox->ibox.index); |
9c8220dfde7c
Don't try to handle UIDVALIDITY changes nicely after all. It causes
Timo Sirainen <tss@iki.fi>
parents:
3322
diff
changeset
|
1065 return -1; |
2050
ee1095ccfd23
Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents:
2039
diff
changeset
|
1066 } |
ee1095ccfd23
Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents:
2039
diff
changeset
|
1067 |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1068 sync_ctx->trans = trans = |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1069 mail_index_transaction_begin(sync_ctx->view, FALSE, TRUE); |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1070 |
5229 | 1071 seq = prev_uid = 0; |
4596
bf4e98a0de3f
Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents:
4594
diff
changeset
|
1072 t_array_init(&keywords, MAILDIR_MAX_KEYWORDS); |
bf4e98a0de3f
Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents:
4594
diff
changeset
|
1073 t_array_init(&idx_keywords, MAILDIR_MAX_KEYWORDS); |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1074 iter = maildir_uidlist_iter_init(mbox->uidlist); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1075 while (maildir_uidlist_iter_next(iter, &uid, &uflags, &filename)) { |
3775
8321e6191275
maildir_copy_with_hardlinks works again.
Timo Sirainen <tss@iki.fi>
parents:
3583
diff
changeset
|
1076 maildir_filename_get_flags(sync_ctx->keywords_sync_ctx, |
8321e6191275
maildir_copy_with_hardlinks works again.
Timo Sirainen <tss@iki.fi>
parents:
3583
diff
changeset
|
1077 filename, &flags, &keywords); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1078 |
5229 | 1079 i_assert(uid > prev_uid); |
1080 prev_uid = uid; | |
1081 | |
4107
d29677c59dc5
Keep \Seen flags privately only in indexes with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
1082 /* the private flags are kept only in indexes. don't use them |
d29677c59dc5
Keep \Seen flags privately only in indexes with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
1083 at all even for newly seen mails */ |
d29677c59dc5
Keep \Seen flags privately only in indexes with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
1084 flags &= ~mbox->private_flags_mask; |
d29677c59dc5
Keep \Seen flags privately only in indexes with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
1085 |
2038
df504dad3aec
Recent flag fixes. Should work perfectly now with maildir.
Timo Sirainen <tss@iki.fi>
parents:
2037
diff
changeset
|
1086 if ((uflags & MAILDIR_UIDLIST_REC_FLAG_RECENT) != 0 && |
df504dad3aec
Recent flag fixes. Should work perfectly now with maildir.
Timo Sirainen <tss@iki.fi>
parents:
2037
diff
changeset
|
1087 (uflags & MAILDIR_UIDLIST_REC_FLAG_NEW_DIR) != 0 && |
df504dad3aec
Recent flag fixes. Should work perfectly now with maildir.
Timo Sirainen <tss@iki.fi>
parents:
2037
diff
changeset
|
1088 (uflags & MAILDIR_UIDLIST_REC_FLAG_MOVED) == 0) { |
df504dad3aec
Recent flag fixes. Should work perfectly now with maildir.
Timo Sirainen <tss@iki.fi>
parents:
2037
diff
changeset
|
1089 /* mail is recent for next session as well */ |
df504dad3aec
Recent flag fixes. Should work perfectly now with maildir.
Timo Sirainen <tss@iki.fi>
parents:
2037
diff
changeset
|
1090 flags |= MAIL_RECENT; |
df504dad3aec
Recent flag fixes. Should work perfectly now with maildir.
Timo Sirainen <tss@iki.fi>
parents:
2037
diff
changeset
|
1091 } |
df504dad3aec
Recent flag fixes. Should work perfectly now with maildir.
Timo Sirainen <tss@iki.fi>
parents:
2037
diff
changeset
|
1092 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1093 __again: |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1094 seq++; |
1954 | 1095 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1096 if (seq > hdr->messages_count) { |
1984 | 1097 if (uid < hdr->next_uid) { |
2053 | 1098 /* most likely a race condition: we read the |
1099 maildir, then someone else expunged messages | |
1100 and committed changes to index. so, this | |
1101 message shouldn't actually exist. mark it | |
1102 racy and check in next sync. | |
1103 | |
1104 the difference between this and the later | |
1105 check is that this one happens when messages | |
1106 are expunged from the end */ | |
1107 if ((uflags & | |
2228 | 1108 MAILDIR_UIDLIST_REC_FLAG_NONSYNCED) != 0) { |
1109 /* partial syncing */ | |
1110 continue; | |
1111 } | |
1112 if ((uflags & | |
2053 | 1113 MAILDIR_UIDLIST_REC_FLAG_RACING) != 0) { |
1114 mail_storage_set_critical( | |
3280
2c72492dfd91
Created mbox_storage and maildir_storage.
Timo Sirainen <tss@iki.fi>
parents:
3279
diff
changeset
|
1115 STORAGE(mbox->storage), |
2067
3f97439ba59e
Path was missing from Maildir sync-errors.
Timo Sirainen <tss@iki.fi>
parents:
2064
diff
changeset
|
1116 "Maildir %s sync: " |
3f97439ba59e
Path was missing from Maildir sync-errors.
Timo Sirainen <tss@iki.fi>
parents:
2064
diff
changeset
|
1117 "UID < next_uid " |
2053 | 1118 "(%u < %u, file = %s)", |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1119 mbox->path, uid, hdr->next_uid, |
2067
3f97439ba59e
Path was missing from Maildir sync-errors.
Timo Sirainen <tss@iki.fi>
parents:
2064
diff
changeset
|
1120 filename); |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1121 mail_index_mark_corrupted( |
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1122 mbox->ibox.index); |
2053 | 1123 ret = -1; |
1124 break; | |
1125 } | |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1126 mbox->dirty_cur_time = ioloop_time; |
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1127 maildir_uidlist_add_flags(mbox->uidlist, |
2053 | 1128 filename, |
1129 MAILDIR_UIDLIST_REC_FLAG_RACING); | |
1130 | |
1131 seq--; | |
1132 continue; | |
1984 | 1133 } |
1134 | |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1135 mail_index_append(trans, uid, &seq); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1136 mail_index_update_flags(trans, seq, MODIFY_REPLACE, |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
2936
diff
changeset
|
1137 flags); |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1138 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1139 if (array_count(&keywords) > 0) { |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1140 struct mail_keywords *kw; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1141 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1142 kw = mail_index_keywords_create_from_indexes( |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1143 trans, &keywords); |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1144 mail_index_update_keywords(trans, seq, |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1145 MODIFY_REPLACE, kw); |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
1146 mail_index_keywords_free(&kw); |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1147 } |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1148 continue; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1149 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1150 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1151 if (mail_index_lookup(view, seq, &rec) < 0) { |
5080 | 1152 mail_storage_set_index_error(&mbox->ibox); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1153 ret = -1; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1154 break; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1155 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1156 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1157 if (rec->uid < uid) { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1158 /* expunged */ |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1159 mail_index_expunge(trans, seq); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1160 goto __again; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1161 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1162 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1163 if (rec->uid > uid) { |
2034
8078400fe561
Fix bogus "UID inserted in the middle of mailbox" errors
Timo Sirainen <tss@iki.fi>
parents:
2033
diff
changeset
|
1164 /* most likely a race condition: we read the |
8078400fe561
Fix bogus "UID inserted in the middle of mailbox" errors
Timo Sirainen <tss@iki.fi>
parents:
2033
diff
changeset
|
1165 maildir, then someone else expunged messages and |
8078400fe561
Fix bogus "UID inserted in the middle of mailbox" errors
Timo Sirainen <tss@iki.fi>
parents:
2033
diff
changeset
|
1166 committed changes to index. so, this message |
2053 | 1167 shouldn't actually exist. mark it racy and check |
1168 in next sync. */ | |
2228 | 1169 if ((uflags & |
1170 MAILDIR_UIDLIST_REC_FLAG_NONSYNCED) != 0) { | |
1171 /* partial syncing */ | |
1172 seq--; | |
1173 continue; | |
1174 } | |
2053 | 1175 if ((uflags & MAILDIR_UIDLIST_REC_FLAG_RACING) != 0) { |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1176 mail_storage_set_critical( |
3280
2c72492dfd91
Created mbox_storage and maildir_storage.
Timo Sirainen <tss@iki.fi>
parents:
3279
diff
changeset
|
1177 STORAGE(mbox->storage), |
2570 | 1178 "Maildir %s sync: " |
1179 "UID inserted in the middle of mailbox " | |
2034
8078400fe561
Fix bogus "UID inserted in the middle of mailbox" errors
Timo Sirainen <tss@iki.fi>
parents:
2033
diff
changeset
|
1180 "(%u > %u, file = %s)", |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1181 mbox->path, rec->uid, uid, filename); |
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1182 mail_index_mark_corrupted(mbox->ibox.index); |
2034
8078400fe561
Fix bogus "UID inserted in the middle of mailbox" errors
Timo Sirainen <tss@iki.fi>
parents:
2033
diff
changeset
|
1183 ret = -1; |
8078400fe561
Fix bogus "UID inserted in the middle of mailbox" errors
Timo Sirainen <tss@iki.fi>
parents:
2033
diff
changeset
|
1184 break; |
2064
5cfdc99fab69
Don't use internal last_cur_mtime stamp - it's index-specific so always get
Timo Sirainen <tss@iki.fi>
parents:
2053
diff
changeset
|
1185 } |
2053 | 1186 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1187 mbox->dirty_cur_time = ioloop_time; |
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1188 maildir_uidlist_add_flags(mbox->uidlist, filename, |
2053 | 1189 MAILDIR_UIDLIST_REC_FLAG_RACING); |
2034
8078400fe561
Fix bogus "UID inserted in the middle of mailbox" errors
Timo Sirainen <tss@iki.fi>
parents:
2033
diff
changeset
|
1190 |
8078400fe561
Fix bogus "UID inserted in the middle of mailbox" errors
Timo Sirainen <tss@iki.fi>
parents:
2033
diff
changeset
|
1191 seq--; |
8078400fe561
Fix bogus "UID inserted in the middle of mailbox" errors
Timo Sirainen <tss@iki.fi>
parents:
2033
diff
changeset
|
1192 continue; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1193 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1194 |
4107
d29677c59dc5
Keep \Seen flags privately only in indexes with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
1195 /* the private flags are stored only in indexes, keep them */ |
d29677c59dc5
Keep \Seen flags privately only in indexes with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
1196 flags |= rec->flags & mbox->private_flags_mask; |
d29677c59dc5
Keep \Seen flags privately only in indexes with shared mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
3879
diff
changeset
|
1197 |
2320
8a6666a9ac98
Handle recent flags in index file correctly. Fixes recent flag losing when
Timo Sirainen <tss@iki.fi>
parents:
2272
diff
changeset
|
1198 if ((rec->flags & MAIL_RECENT) != 0) { |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1199 index_mailbox_set_recent(&mbox->ibox, seq); |
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1200 if (mbox->ibox.keep_recent) { |
2320
8a6666a9ac98
Handle recent flags in index file correctly. Fixes recent flag losing when
Timo Sirainen <tss@iki.fi>
parents:
2272
diff
changeset
|
1201 flags |= MAIL_RECENT; |
8a6666a9ac98
Handle recent flags in index file correctly. Fixes recent flag losing when
Timo Sirainen <tss@iki.fi>
parents:
2272
diff
changeset
|
1202 } else { |
8a6666a9ac98
Handle recent flags in index file correctly. Fixes recent flag losing when
Timo Sirainen <tss@iki.fi>
parents:
2272
diff
changeset
|
1203 mail_index_update_flags(trans, seq, |
8a6666a9ac98
Handle recent flags in index file correctly. Fixes recent flag losing when
Timo Sirainen <tss@iki.fi>
parents:
2272
diff
changeset
|
1204 MODIFY_REMOVE, |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
2936
diff
changeset
|
1205 MAIL_RECENT); |
2320
8a6666a9ac98
Handle recent flags in index file correctly. Fixes recent flag losing when
Timo Sirainen <tss@iki.fi>
parents:
2272
diff
changeset
|
1206 } |
8a6666a9ac98
Handle recent flags in index file correctly. Fixes recent flag losing when
Timo Sirainen <tss@iki.fi>
parents:
2272
diff
changeset
|
1207 } |
8a6666a9ac98
Handle recent flags in index file correctly. Fixes recent flag losing when
Timo Sirainen <tss@iki.fi>
parents:
2272
diff
changeset
|
1208 |
2228 | 1209 if ((uflags & MAILDIR_UIDLIST_REC_FLAG_NONSYNCED) != 0) { |
1210 /* partial syncing */ | |
3436
3c51658d6846
We didn't notice if messages were deleted directly from new/.
Timo Sirainen <tss@iki.fi>
parents:
3435
diff
changeset
|
1211 if ((flags & MAIL_RECENT) != 0) { |
3c51658d6846
We didn't notice if messages were deleted directly from new/.
Timo Sirainen <tss@iki.fi>
parents:
3435
diff
changeset
|
1212 /* we last saw this mail in new/, but it's |
3c51658d6846
We didn't notice if messages were deleted directly from new/.
Timo Sirainen <tss@iki.fi>
parents:
3435
diff
changeset
|
1213 not there anymore. possibly expunged, |
3c51658d6846
We didn't notice if messages were deleted directly from new/.
Timo Sirainen <tss@iki.fi>
parents:
3435
diff
changeset
|
1214 make sure. */ |
3c51658d6846
We didn't notice if messages were deleted directly from new/.
Timo Sirainen <tss@iki.fi>
parents:
3435
diff
changeset
|
1215 full_rescan = TRUE; |
3c51658d6846
We didn't notice if messages were deleted directly from new/.
Timo Sirainen <tss@iki.fi>
parents:
3435
diff
changeset
|
1216 } |
2228 | 1217 continue; |
1218 } | |
1219 | |
1956
d6941cd8afdc
Added support for setting dirty flags for messages (TODO: undirty..)
Timo Sirainen <tss@iki.fi>
parents:
1955
diff
changeset
|
1220 if ((rec->flags & MAIL_INDEX_MAIL_FLAG_DIRTY) != 0) { |
d6941cd8afdc
Added support for setting dirty flags for messages (TODO: undirty..)
Timo Sirainen <tss@iki.fi>
parents:
1955
diff
changeset
|
1221 /* we haven't been able to update maildir with this |
d6941cd8afdc
Added support for setting dirty flags for messages (TODO: undirty..)
Timo Sirainen <tss@iki.fi>
parents:
1955
diff
changeset
|
1222 record's flag changes. don't sync them. */ |
d6941cd8afdc
Added support for setting dirty flags for messages (TODO: undirty..)
Timo Sirainen <tss@iki.fi>
parents:
1955
diff
changeset
|
1223 continue; |
d6941cd8afdc
Added support for setting dirty flags for messages (TODO: undirty..)
Timo Sirainen <tss@iki.fi>
parents:
1955
diff
changeset
|
1224 } |
d6941cd8afdc
Added support for setting dirty flags for messages (TODO: undirty..)
Timo Sirainen <tss@iki.fi>
parents:
1955
diff
changeset
|
1225 |
2038
df504dad3aec
Recent flag fixes. Should work perfectly now with maildir.
Timo Sirainen <tss@iki.fi>
parents:
2037
diff
changeset
|
1226 if (((uint8_t)flags & ~MAIL_RECENT) != |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
2936
diff
changeset
|
1227 (rec->flags & (MAIL_FLAGS_MASK^MAIL_RECENT))) { |
2038
df504dad3aec
Recent flag fixes. Should work perfectly now with maildir.
Timo Sirainen <tss@iki.fi>
parents:
2037
diff
changeset
|
1228 /* FIXME: this is wrong if there's pending changes in |
df504dad3aec
Recent flag fixes. Should work perfectly now with maildir.
Timo Sirainen <tss@iki.fi>
parents:
2037
diff
changeset
|
1229 transaction log already. it gets fixed in next sync |
df504dad3aec
Recent flag fixes. Should work perfectly now with maildir.
Timo Sirainen <tss@iki.fi>
parents:
2037
diff
changeset
|
1230 however.. */ |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1231 mail_index_update_flags(trans, seq, MODIFY_REPLACE, |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
2936
diff
changeset
|
1232 flags); |
2038
df504dad3aec
Recent flag fixes. Should work perfectly now with maildir.
Timo Sirainen <tss@iki.fi>
parents:
2037
diff
changeset
|
1233 } else if ((flags & MAIL_RECENT) == 0 && |
df504dad3aec
Recent flag fixes. Should work perfectly now with maildir.
Timo Sirainen <tss@iki.fi>
parents:
2037
diff
changeset
|
1234 (rec->flags & MAIL_RECENT) != 0) { |
df504dad3aec
Recent flag fixes. Should work perfectly now with maildir.
Timo Sirainen <tss@iki.fi>
parents:
2037
diff
changeset
|
1235 /* just remove recent flag */ |
df504dad3aec
Recent flag fixes. Should work perfectly now with maildir.
Timo Sirainen <tss@iki.fi>
parents:
2037
diff
changeset
|
1236 mail_index_update_flags(trans, seq, MODIFY_REMOVE, |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
2936
diff
changeset
|
1237 MAIL_RECENT); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1238 } |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1239 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1240 /* update keywords if they have changed */ |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1241 if (mail_index_lookup_keywords(view, seq, &idx_keywords) < 0) { |
5080 | 1242 mail_storage_set_index_error(&mbox->ibox); |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1243 ret = -1; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1244 break; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1245 } |
3821
c8b2ed2c9961
We assumed that keyword index arrays were always sorted. This isn't always
Timo Sirainen <tss@iki.fi>
parents:
3776
diff
changeset
|
1246 if (!index_keyword_array_cmp(&keywords, &idx_keywords)) { |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1247 struct mail_keywords *kw; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1248 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1249 kw = mail_index_keywords_create_from_indexes( |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1250 trans, &keywords); |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1251 mail_index_update_keywords(trans, seq, |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1252 MODIFY_REPLACE, kw); |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
1253 mail_index_keywords_free(&kw); |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1254 } |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1255 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1256 maildir_uidlist_iter_deinit(iter); |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1257 array_free(&keywords); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1258 |
3776
0cae3268c8af
Accidentally had changed !partial-check to partial-check. Because of this
Timo Sirainen <tss@iki.fi>
parents:
3775
diff
changeset
|
1259 if (!partial) { |
1954 | 1260 /* expunge the rest */ |
1261 for (seq++; seq <= hdr->messages_count; seq++) | |
1262 mail_index_expunge(trans, seq); | |
3583
a45208fe7c83
Partial syncs caused index's next_uid to be updated even if the new mails
Timo Sirainen <tss@iki.fi>
parents:
3579
diff
changeset
|
1263 |
a45208fe7c83
Partial syncs caused index's next_uid to be updated even if the new mails
Timo Sirainen <tss@iki.fi>
parents:
3579
diff
changeset
|
1264 /* next_uid must be updated only in non-partial syncs since |
a45208fe7c83
Partial syncs caused index's next_uid to be updated even if the new mails
Timo Sirainen <tss@iki.fi>
parents:
3579
diff
changeset
|
1265 partial syncs don't add the new mails to index. also we'll |
a45208fe7c83
Partial syncs caused index's next_uid to be updated even if the new mails
Timo Sirainen <tss@iki.fi>
parents:
3579
diff
changeset
|
1266 have to do it here before syncing index records, since after |
a45208fe7c83
Partial syncs caused index's next_uid to be updated even if the new mails
Timo Sirainen <tss@iki.fi>
parents:
3579
diff
changeset
|
1267 that the uidlist's next_uid value may have changed. */ |
a45208fe7c83
Partial syncs caused index's next_uid to be updated even if the new mails
Timo Sirainen <tss@iki.fi>
parents:
3579
diff
changeset
|
1268 next_uid = maildir_uidlist_get_next_uid(mbox->uidlist); |
5369
e897aaa24cdd
If uidlist is deleted and we set the uidvalidity from the index file, set
Timo Sirainen <tss@iki.fi>
parents:
5368
diff
changeset
|
1269 if (hdr->next_uid < next_uid) { |
3583
a45208fe7c83
Partial syncs caused index's next_uid to be updated even if the new mails
Timo Sirainen <tss@iki.fi>
parents:
3579
diff
changeset
|
1270 mail_index_update_header(trans, |
a45208fe7c83
Partial syncs caused index's next_uid to be updated even if the new mails
Timo Sirainen <tss@iki.fi>
parents:
3579
diff
changeset
|
1271 offsetof(struct mail_index_header, next_uid), |
a45208fe7c83
Partial syncs caused index's next_uid to be updated even if the new mails
Timo Sirainen <tss@iki.fi>
parents:
3579
diff
changeset
|
1272 &next_uid, sizeof(next_uid), FALSE); |
a45208fe7c83
Partial syncs caused index's next_uid to be updated even if the new mails
Timo Sirainen <tss@iki.fi>
parents:
3579
diff
changeset
|
1273 } |
1954 | 1274 } |
1275 | |
3583
a45208fe7c83
Partial syncs caused index's next_uid to be updated even if the new mails
Timo Sirainen <tss@iki.fi>
parents:
3579
diff
changeset
|
1276 if (!mbox->syncing_commit) { |
a45208fe7c83
Partial syncs caused index's next_uid to be updated even if the new mails
Timo Sirainen <tss@iki.fi>
parents:
3579
diff
changeset
|
1277 /* now, sync the index. NOTE: may recurse back to here with |
a45208fe7c83
Partial syncs caused index's next_uid to be updated even if the new mails
Timo Sirainen <tss@iki.fi>
parents:
3579
diff
changeset
|
1278 partial syncs */ |
a45208fe7c83
Partial syncs caused index's next_uid to be updated even if the new mails
Timo Sirainen <tss@iki.fi>
parents:
3579
diff
changeset
|
1279 mbox->syncing_commit = TRUE; |
a45208fe7c83
Partial syncs caused index's next_uid to be updated even if the new mails
Timo Sirainen <tss@iki.fi>
parents:
3579
diff
changeset
|
1280 if (maildir_sync_index_records(sync_ctx) < 0) |
a45208fe7c83
Partial syncs caused index's next_uid to be updated even if the new mails
Timo Sirainen <tss@iki.fi>
parents:
3579
diff
changeset
|
1281 ret = -1; |
a45208fe7c83
Partial syncs caused index's next_uid to be updated even if the new mails
Timo Sirainen <tss@iki.fi>
parents:
3579
diff
changeset
|
1282 mbox->syncing_commit = FALSE; |
a45208fe7c83
Partial syncs caused index's next_uid to be updated even if the new mails
Timo Sirainen <tss@iki.fi>
parents:
3579
diff
changeset
|
1283 } |
2037
8763032d31bd
Set dirty flags through transaction log, not directly. Some other flag
Timo Sirainen <tss@iki.fi>
parents:
2034
diff
changeset
|
1284 |
4848
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
1285 if (mbox->dirty_cur_time != 0) |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
1286 mbox->last_dirty_flags |= MAILDIR_DIRTY_CUR; |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
1287 |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
1288 if (mbox->last_cur_mtime != (time_t)hdr->sync_stamp) { |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1289 uint32_t sync_stamp = mbox->last_cur_mtime; |
2050
ee1095ccfd23
Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents:
2039
diff
changeset
|
1290 |
ee1095ccfd23
Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents:
2039
diff
changeset
|
1291 mail_index_update_header(trans, |
ee1095ccfd23
Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents:
2039
diff
changeset
|
1292 offsetof(struct mail_index_header, sync_stamp), |
3322
49071cc19102
If UIDVALIDITY changes, don't invalidate the whole index. Just expunge all
Timo Sirainen <tss@iki.fi>
parents:
3280
diff
changeset
|
1293 &sync_stamp, sizeof(sync_stamp), TRUE); |
2050
ee1095ccfd23
Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents:
2039
diff
changeset
|
1294 } |
ee1095ccfd23
Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents:
2039
diff
changeset
|
1295 |
3472
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1296 /* FIXME: use a header extension instead of sync_size.. */ |
4848
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
1297 value = mbox->last_new_mtime | |
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
1298 ((uint64_t)mbox->last_dirty_flags << 32); |
3472
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1299 if (value != hdr->sync_size) { |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1300 mail_index_update_header(trans, |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1301 offsetof(struct mail_index_header, sync_size), |
4848
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
1302 &value, sizeof(value), TRUE); |
3472
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1303 } |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1304 |
2051
596267d8e2e2
Some more UIDVALIDITY issues fixed.
Timo Sirainen <tss@iki.fi>
parents:
2050
diff
changeset
|
1305 if (hdr->uid_validity == 0) { |
596267d8e2e2
Some more UIDVALIDITY issues fixed.
Timo Sirainen <tss@iki.fi>
parents:
2050
diff
changeset
|
1306 /* get the initial uidvalidity */ |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1307 if (maildir_uidlist_update(mbox->uidlist) < 0) |
2051
596267d8e2e2
Some more UIDVALIDITY issues fixed.
Timo Sirainen <tss@iki.fi>
parents:
2050
diff
changeset
|
1308 ret = -1; |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1309 uid_validity = maildir_uidlist_get_uid_validity(mbox->uidlist); |
2051
596267d8e2e2
Some more UIDVALIDITY issues fixed.
Timo Sirainen <tss@iki.fi>
parents:
2050
diff
changeset
|
1310 if (uid_validity == 0) { |
596267d8e2e2
Some more UIDVALIDITY issues fixed.
Timo Sirainen <tss@iki.fi>
parents:
2050
diff
changeset
|
1311 uid_validity = ioloop_time; |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1312 maildir_uidlist_set_uid_validity(mbox->uidlist, |
5388
ce1bfc98df29
Last fix broke creating new uidlists.
Timo Sirainen <tss@iki.fi>
parents:
5369
diff
changeset
|
1313 uid_validity, 0); |
2051
596267d8e2e2
Some more UIDVALIDITY issues fixed.
Timo Sirainen <tss@iki.fi>
parents:
2050
diff
changeset
|
1314 } |
596267d8e2e2
Some more UIDVALIDITY issues fixed.
Timo Sirainen <tss@iki.fi>
parents:
2050
diff
changeset
|
1315 } else if (uid_validity == 0) { |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1316 maildir_uidlist_set_uid_validity(mbox->uidlist, |
5369
e897aaa24cdd
If uidlist is deleted and we set the uidvalidity from the index file, set
Timo Sirainen <tss@iki.fi>
parents:
5368
diff
changeset
|
1317 hdr->uid_validity, |
e897aaa24cdd
If uidlist is deleted and we set the uidvalidity from the index file, set
Timo Sirainen <tss@iki.fi>
parents:
5368
diff
changeset
|
1318 hdr->next_uid); |
2051
596267d8e2e2
Some more UIDVALIDITY issues fixed.
Timo Sirainen <tss@iki.fi>
parents:
2050
diff
changeset
|
1319 } |
596267d8e2e2
Some more UIDVALIDITY issues fixed.
Timo Sirainen <tss@iki.fi>
parents:
2050
diff
changeset
|
1320 |
596267d8e2e2
Some more UIDVALIDITY issues fixed.
Timo Sirainen <tss@iki.fi>
parents:
2050
diff
changeset
|
1321 if (uid_validity != hdr->uid_validity && uid_validity != 0) { |
2050
ee1095ccfd23
Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents:
2039
diff
changeset
|
1322 mail_index_update_header(trans, |
ee1095ccfd23
Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents:
2039
diff
changeset
|
1323 offsetof(struct mail_index_header, uid_validity), |
3322
49071cc19102
If UIDVALIDITY changes, don't invalidate the whole index. Just expunge all
Timo Sirainen <tss@iki.fi>
parents:
3280
diff
changeset
|
1324 &uid_validity, sizeof(uid_validity), TRUE); |
2050
ee1095ccfd23
Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents:
2039
diff
changeset
|
1325 } |
ee1095ccfd23
Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents:
2039
diff
changeset
|
1326 |
3436
3c51658d6846
We didn't notice if messages were deleted directly from new/.
Timo Sirainen <tss@iki.fi>
parents:
3435
diff
changeset
|
1327 return ret < 0 ? -1 : (full_rescan ? 0 : 1); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1328 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1329 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3821
diff
changeset
|
1330 static int maildir_sync_context(struct maildir_sync_context *ctx, bool forced, |
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3821
diff
changeset
|
1331 bool sync_last_commit) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1332 { |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3821
diff
changeset
|
1333 bool new_changed, cur_changed, full_rescan = FALSE; |
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3821
diff
changeset
|
1334 int ret; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1335 |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1336 if (sync_last_commit) { |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1337 new_changed = cur_changed = FALSE; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1338 } else if (!forced) { |
3472
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1339 if (maildir_sync_quick_check(ctx->mbox, |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1340 ctx->new_dir, ctx->cur_dir, |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1341 &new_changed, &cur_changed) < 0) |
2140
e2cd51b99359
"readonly sync" -> "forced sync"
Timo Sirainen <tss@iki.fi>
parents:
2123
diff
changeset
|
1342 return -1; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1343 |
2140
e2cd51b99359
"readonly sync" -> "forced sync"
Timo Sirainen <tss@iki.fi>
parents:
2123
diff
changeset
|
1344 if (!new_changed && !cur_changed) |
3579
09565508b8ba
We were forcing a maildir resync when it hadn't changed at all.
Timo Sirainen <tss@iki.fi>
parents:
3563
diff
changeset
|
1345 return 1; |
2140
e2cd51b99359
"readonly sync" -> "forced sync"
Timo Sirainen <tss@iki.fi>
parents:
2123
diff
changeset
|
1346 } else { |
e2cd51b99359
"readonly sync" -> "forced sync"
Timo Sirainen <tss@iki.fi>
parents:
2123
diff
changeset
|
1347 new_changed = cur_changed = TRUE; |
e2cd51b99359
"readonly sync" -> "forced sync"
Timo Sirainen <tss@iki.fi>
parents:
2123
diff
changeset
|
1348 } |
1947 | 1349 |
2818
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1350 /* |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1351 Locking, locking, locking.. Wasn't maildir supposed to be lockless? |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1352 |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1353 We can get here either as beginning a real maildir sync, or when |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1354 committing changes to maildir but a file was lost (maybe renamed). |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1355 |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1356 So, we're going to need two locks. One for index and one for |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1357 uidlist. To avoid deadlocking do the uidlist lock always first. |
2121 | 1358 |
2818
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1359 uidlist is needed only for figuring out UIDs for newly seen files, |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1360 so theoretically we wouldn't need to lock it unless there are new |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1361 files. It has a few problems though, assuming the index lock didn't |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1362 already protect it (eg. in-memory indexes): |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1363 |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1364 1. Just because you see a new file which doesn't exist in uidlist |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1365 file, doesn't mean that the file really exists anymore, or that |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1366 your readdir() lists all new files. Meaning that this is possible: |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1367 |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1368 A: opendir(), readdir() -> new file ... |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1369 -- new files are written to the maildir -- |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1370 B: opendir(), readdir() -> new file, lock uidlist, |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1371 readdir() -> another new file, rewrite uidlist, unlock |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1372 A: ... lock uidlist, readdir() -> nothing left, rewrite uidlist, |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1373 unlock |
2173
9438951e243f
Don't crash if we're syncing last commit to maildir, but some file was lost
Timo Sirainen <tss@iki.fi>
parents:
2140
diff
changeset
|
1374 |
2818
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1375 The second time running A didn't see the two new files. To handle |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1376 this correctly, it must not remove the new unseen files from |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1377 uidlist. This is possible to do, but adds extra complexity. |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1378 |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1379 2. If another process is rename()ing files while we are |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1380 readdir()ing, it's possible that readdir() never lists some files, |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1381 causing Dovecot to assume they were expunged. In next sync they |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1382 would show up again, but client could have already been notified of |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1383 that and they would show up under new UIDs, so the damage is |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1384 already done. |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1385 |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1386 Both of the problems can be avoided if we simply lock the uidlist |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1387 before syncing and keep it until sync is finished. Typically this |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1388 would happen in any case, as there is the index lock.. |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1389 |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1390 The second case is still a problem with external changes though, |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1391 because maildir doesn't require any kind of locking. Luckily this |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1392 problem rarely happens except under high amount of modifications. |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1393 */ |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1394 |
3530
e9695ec7925b
Recursive maildir uidlist syncs caused assert crashes. Also did some
Timo Sirainen <tss@iki.fi>
parents:
3520
diff
changeset
|
1395 ctx->partial = !cur_changed; |
e9695ec7925b
Recursive maildir uidlist syncs caused assert crashes. Also did some
Timo Sirainen <tss@iki.fi>
parents:
3520
diff
changeset
|
1396 ret = maildir_uidlist_sync_init(ctx->mbox->uidlist, ctx->partial, |
e9695ec7925b
Recursive maildir uidlist syncs caused assert crashes. Also did some
Timo Sirainen <tss@iki.fi>
parents:
3520
diff
changeset
|
1397 &ctx->uidlist_sync_ctx); |
e9695ec7925b
Recursive maildir uidlist syncs caused assert crashes. Also did some
Timo Sirainen <tss@iki.fi>
parents:
3520
diff
changeset
|
1398 if (ret <= 0) { |
2818
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1399 /* failure / timeout. if forced is TRUE, we could still go |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1400 forward and check only for renamed files, but is it worth |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1401 the trouble? .. */ |
a758a5b542bb
Always protect maildir syncing with uidlist lock. Before we only tried to
Timo Sirainen <tss@iki.fi>
parents:
2816
diff
changeset
|
1402 return ret; |
2140
e2cd51b99359
"readonly sync" -> "forced sync"
Timo Sirainen <tss@iki.fi>
parents:
2123
diff
changeset
|
1403 } |
2123 | 1404 |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1405 if (!ctx->mbox->syncing_commit) { |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1406 if (maildir_sync_index_begin(ctx->mbox, |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1407 &ctx->index_sync_ctx) < 0) |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1408 return -1; |
5368
7d45edb81fe4
When copying/syncing a lot of mails, send "* OK Hang in there" replies to
Timo Sirainen <tss@iki.fi>
parents:
5307
diff
changeset
|
1409 ctx->index_sync_ctx->maildir_sync_ctx = ctx; |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1410 } |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1411 |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1412 if (new_changed || cur_changed) { |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1413 /* if we're going to check cur/ dir our current logic requires |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1414 that new/ dir is checked as well. it's a good idea anyway. */ |
5391
0c8705aad54c
Avoid infinite looping when buggy filesystems.
Timo Sirainen <tss@iki.fi>
parents:
5390
diff
changeset
|
1415 unsigned int count = 0; |
0c8705aad54c
Avoid infinite looping when buggy filesystems.
Timo Sirainen <tss@iki.fi>
parents:
5390
diff
changeset
|
1416 |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1417 while ((ret = maildir_scan_dir(ctx, TRUE)) > 0) { |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1418 /* rename()d at least some files, which might have |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1419 caused some other files to be missed. check again |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1420 (see MAILDIR_RENAME_RESCAN_COUNT). */ |
5391
0c8705aad54c
Avoid infinite looping when buggy filesystems.
Timo Sirainen <tss@iki.fi>
parents:
5390
diff
changeset
|
1421 if (++count > MAILDIR_SCAN_DIR_MAX_COUNT) |
0c8705aad54c
Avoid infinite looping when buggy filesystems.
Timo Sirainen <tss@iki.fi>
parents:
5390
diff
changeset
|
1422 break; |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1423 } |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1424 if (ret < 0) |
1954 | 1425 return -1; |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1426 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1427 if (cur_changed) { |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1428 if (maildir_scan_dir(ctx, FALSE) < 0) |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1429 return -1; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1430 } |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1431 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1432 /* finish uidlist syncing, but keep it still locked */ |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1433 maildir_uidlist_sync_finish(ctx->uidlist_sync_ctx); |
1954 | 1434 } |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1435 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1436 if (!ctx->mbox->syncing_commit) { |
3530
e9695ec7925b
Recursive maildir uidlist syncs caused assert crashes. Also did some
Timo Sirainen <tss@iki.fi>
parents:
3520
diff
changeset
|
1437 /* NOTE: index syncing here might cause a re-sync due to |
e9695ec7925b
Recursive maildir uidlist syncs caused assert crashes. Also did some
Timo Sirainen <tss@iki.fi>
parents:
3520
diff
changeset
|
1438 files getting lost, so this function might be called |
e9695ec7925b
Recursive maildir uidlist syncs caused assert crashes. Also did some
Timo Sirainen <tss@iki.fi>
parents:
3520
diff
changeset
|
1439 re-entrantly. FIXME: and that breaks in |
e9695ec7925b
Recursive maildir uidlist syncs caused assert crashes. Also did some
Timo Sirainen <tss@iki.fi>
parents:
3520
diff
changeset
|
1440 maildir_uidlist_sync_deinit() */ |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1441 ret = maildir_sync_index(ctx->index_sync_ctx, ctx->partial); |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1442 if (maildir_sync_index_finish(&ctx->index_sync_ctx, |
4774
615b7738a62f
Saving mails could have skipped over transactions, which caused different
Timo Sirainen <tss@iki.fi>
parents:
4612
diff
changeset
|
1443 ret < 0, FALSE) < 0) |
2173
9438951e243f
Don't crash if we're syncing last commit to maildir, but some file was lost
Timo Sirainen <tss@iki.fi>
parents:
2140
diff
changeset
|
1444 return -1; |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1445 |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1446 if (ret < 0) |
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1447 return -1; |
3436
3c51658d6846
We didn't notice if messages were deleted directly from new/.
Timo Sirainen <tss@iki.fi>
parents:
3435
diff
changeset
|
1448 if (ret == 0) |
3c51658d6846
We didn't notice if messages were deleted directly from new/.
Timo Sirainen <tss@iki.fi>
parents:
3435
diff
changeset
|
1449 full_rescan = TRUE; |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1450 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1451 i_assert(maildir_uidlist_is_locked(ctx->mbox->uidlist)); |
2173
9438951e243f
Don't crash if we're syncing last commit to maildir, but some file was lost
Timo Sirainen <tss@iki.fi>
parents:
2140
diff
changeset
|
1452 } |
1984 | 1453 |
4238
3c8b191b0019
Adding mail to index while saving it had a race condition. Fixing it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4199
diff
changeset
|
1454 ret = maildir_uidlist_sync_deinit(&ctx->uidlist_sync_ctx); |
3436
3c51658d6846
We didn't notice if messages were deleted directly from new/.
Timo Sirainen <tss@iki.fi>
parents:
3435
diff
changeset
|
1455 return ret < 0 ? -1 : (full_rescan ? 0 : 1); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1456 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1457 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1458 int maildir_storage_sync_force(struct maildir_mailbox *mbox) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1459 { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1460 struct maildir_sync_context *ctx; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1461 int ret; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1462 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1463 ctx = maildir_sync_context_new(mbox); |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1464 ret = maildir_sync_context(ctx, TRUE, FALSE); |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1465 maildir_sync_deinit(ctx); |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1466 return ret < 0 ? -1 : 0; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1467 } |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1468 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1469 int maildir_sync_last_commit(struct maildir_mailbox *mbox) |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1470 { |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1471 struct maildir_sync_context *ctx; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1472 int ret; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1473 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1474 if (mbox->ibox.commit_log_file_seq == 0) |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1475 return 0; |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1476 |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1477 ctx = maildir_sync_context_new(mbox); |
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1478 ret = maildir_sync_context(ctx, FALSE, TRUE); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1479 maildir_sync_deinit(ctx); |
3436
3c51658d6846
We didn't notice if messages were deleted directly from new/.
Timo Sirainen <tss@iki.fi>
parents:
3435
diff
changeset
|
1480 return ret < 0 ? -1 : 0; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1481 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1482 |
2322
aae574ed7f4c
Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents:
2320
diff
changeset
|
1483 struct mailbox_sync_context * |
aae574ed7f4c
Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents:
2320
diff
changeset
|
1484 maildir_storage_sync_init(struct mailbox *box, enum mailbox_sync_flags flags) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1485 { |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1486 struct maildir_mailbox *mbox = (struct maildir_mailbox *)box; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1487 struct maildir_sync_context *ctx; |
2322
aae574ed7f4c
Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents:
2320
diff
changeset
|
1488 int ret = 0; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1489 |
4894
24afafbfe47b
Make sure the mailbox is opened when transaction is started (fixes deliver).
Timo Sirainen <tss@iki.fi>
parents:
4848
diff
changeset
|
1490 if (!box->opened) |
24afafbfe47b
Make sure the mailbox is opened when transaction is started (fixes deliver).
Timo Sirainen <tss@iki.fi>
parents:
4848
diff
changeset
|
1491 index_storage_mailbox_open(&mbox->ibox); |
4848
967de900c73a
Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents:
4774
diff
changeset
|
1492 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1493 if ((flags & MAILBOX_SYNC_FLAG_FAST) == 0 || |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1494 mbox->ibox.sync_last_check + MAILBOX_FULL_SYNC_INTERVAL <= |
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1495 ioloop_time) { |
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1496 mbox->ibox.sync_last_check = ioloop_time; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1497 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3203
diff
changeset
|
1498 ctx = maildir_sync_context_new(mbox); |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1499 ret = maildir_sync_context(ctx, FALSE, FALSE); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1500 maildir_sync_deinit(ctx); |
3436
3c51658d6846
We didn't notice if messages were deleted directly from new/.
Timo Sirainen <tss@iki.fi>
parents:
3435
diff
changeset
|
1501 |
4152
e2edd333c473
Added MAILBOX_OPEN_KEEP_LOCKED flag to mailbox opening and implemented it
Timo Sirainen <tss@iki.fi>
parents:
4126
diff
changeset
|
1502 i_assert(!maildir_uidlist_is_locked(mbox->uidlist) || |
e2edd333c473
Added MAILBOX_OPEN_KEEP_LOCKED flag to mailbox opening and implemented it
Timo Sirainen <tss@iki.fi>
parents:
4126
diff
changeset
|
1503 mbox->ibox.keep_locked); |
3447
96de02ea7482
Keywords are stored in maildir filename and maildir-keywords file
Timo Sirainen <tss@iki.fi>
parents:
3446
diff
changeset
|
1504 |
3436
3c51658d6846
We didn't notice if messages were deleted directly from new/.
Timo Sirainen <tss@iki.fi>
parents:
3435
diff
changeset
|
1505 if (ret == 0) { |
3c51658d6846
We didn't notice if messages were deleted directly from new/.
Timo Sirainen <tss@iki.fi>
parents:
3435
diff
changeset
|
1506 /* lost some files from new/, see if thery're in cur/ */ |
3c51658d6846
We didn't notice if messages were deleted directly from new/.
Timo Sirainen <tss@iki.fi>
parents:
3435
diff
changeset
|
1507 ret = maildir_storage_sync_force(mbox); |
3c51658d6846
We didn't notice if messages were deleted directly from new/.
Timo Sirainen <tss@iki.fi>
parents:
3435
diff
changeset
|
1508 } |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1509 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1510 |
2322
aae574ed7f4c
Broke mailbox_sync() into iterator.
Timo Sirainen <tss@iki.fi>
parents:
2320
diff
changeset
|
1511 return index_mailbox_sync_init(box, flags, ret < 0); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1512 } |
3472
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1513 |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1514 int maildir_sync_is_synced(struct maildir_mailbox *mbox) |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1515 { |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1516 const char *new_dir, *cur_dir; |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3821
diff
changeset
|
1517 bool new_changed, cur_changed; |
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3821
diff
changeset
|
1518 int ret; |
3472
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1519 |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1520 t_push(); |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1521 new_dir = t_strconcat(mbox->path, "/new", NULL); |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1522 cur_dir = t_strconcat(mbox->path, "/cur", NULL); |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1523 |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1524 ret = maildir_sync_quick_check(mbox, new_dir, cur_dir, |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1525 &new_changed, &cur_changed); |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1526 t_pop(); |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1527 return ret < 0 ? -1 : (!new_changed && !cur_changed); |
db29cc6754d5
Store new/ directory's timestamp in sync_size header in index (kludgy..).
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
1528 } |