Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/imap/cmd-close.c @ 7816:ea6727a1220e HEAD
Changed the way mailbox changing ambiguity is checked.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 11 Jun 2008 15:43:12 +0300 |
parents | 879208fdc7e3 |
children | ffaf1ea49704 |
rev | line source |
---|---|
7086
7ed926ed7aa4
Updated copyright notices to include year 2008.
Timo Sirainen <tss@iki.fi>
parents:
7057
diff
changeset
|
1 /* Copyright (c) 2002-2008 Dovecot authors, see the included COPYING file */ |
0 | 2 |
3 #include "common.h" | |
4 #include "commands.h" | |
1640
db14aa8e2b5c
API change for expunging messages. Not exactly what I wanted, but good
Timo Sirainen <tss@iki.fi>
parents:
1445
diff
changeset
|
5 #include "imap-expunge.h" |
0 | 6 |
7632
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
7 static void cmd_close_finish(struct client *client) |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
8 { |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7632
diff
changeset
|
9 client_search_updates_free(client); |
7632
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
10 if (mailbox_close(&client->mailbox) < 0) { |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
11 client_send_untagged_storage_error(client, |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
12 mailbox_get_storage(client->mailbox)); |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
13 } |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
14 client_update_mailbox_flags(client, NULL); |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
15 } |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
16 |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
17 static bool cmd_close_callback(struct client_command_context *cmd) |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
18 { |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
19 struct mailbox_status status; |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
20 |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
21 mailbox_get_status(cmd->client->mailbox, |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
22 STATUS_HIGHESTMODSEQ, &status); |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
23 cmd_close_finish(cmd->client); |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
24 client_send_tagline(cmd, t_strdup_printf( |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
25 "OK [HIGHESTMODSEQ %llu] Close completed.", |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
26 (unsigned long long)status.highest_modseq)); |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
27 return TRUE; |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
28 } |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
29 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3141
diff
changeset
|
30 bool cmd_close(struct client_command_context *cmd) |
0 | 31 { |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2676
diff
changeset
|
32 struct client *client = cmd->client; |
1212 | 33 struct mailbox *mailbox = client->mailbox; |
2676
542edc7f6091
Don't crash if CLOSEing without open mailbox.
Timo Sirainen <tss@iki.fi>
parents:
2190
diff
changeset
|
34 struct mail_storage *storage; |
7632
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
35 int ret; |
1212 | 36 |
3141
61abed5f7864
Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents:
2676
diff
changeset
|
37 if (!client_verify_open_mailbox(cmd)) |
0 | 38 return TRUE; |
39 | |
7816
ea6727a1220e
Changed the way mailbox changing ambiguity is checked.
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
40 i_assert(client->mailbox_change_lock == NULL); |
ea6727a1220e
Changed the way mailbox changing ambiguity is checked.
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
41 client->mailbox_change_lock = cmd; |
0 | 42 |
7632
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
43 storage = mailbox_get_storage(mailbox); |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
44 if ((ret = imap_expunge(mailbox, NULL)) < 0) |
7319
d76c54e092f5
CLOSE: Synchronize the mailbox after expunging messages to actually get them
Timo Sirainen <tss@iki.fi>
parents:
7086
diff
changeset
|
45 client_send_untagged_storage_error(client, storage); |
559
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
450
diff
changeset
|
46 |
7632
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
47 if ((client->enabled_features & MAILBOX_FEATURE_QRESYNC) != 0 && |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
48 ret > 0) { |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
49 /* we expunged something. since we're sending updated |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
50 HIGHESTMODSEQ make sure the client sees all changes up to |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
51 it by syncing the mailbox one last time. We wouldn't need |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
52 to include our own expunge in there, but it's too much |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
53 trouble to hide it. */ |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
54 return cmd_sync_callback(cmd, 0, IMAP_SYNC_FLAG_SAFE, |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
55 cmd_close_callback); |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
56 } else { |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
57 if (mailbox_sync(mailbox, 0, 0, NULL) < 0) |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
58 client_send_untagged_storage_error(client, storage); |
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
59 cmd_close_finish(client); |
7629 | 60 client_send_tagline(cmd, "OK Close completed."); |
7632
6e2e4e5c52f3
Fixed CLOSE HIGEHSTMODSEQ race condition. Added some checks to make
Timo Sirainen <tss@iki.fi>
parents:
7629
diff
changeset
|
61 return TRUE; |
7629 | 62 } |
0 | 63 } |