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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "common.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1021
diff changeset
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
9ced30dda6c3 workaround: outlook-idle
Timo Sirainen <tss@iki.fi>
parents: 1021
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 return TRUE;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
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
bad3a811a148 Added QRESYNC support.
Timo Sirainen <tss@iki.fi>
parents: 7319
diff changeset
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
bad3a811a148 Added QRESYNC support.
Timo Sirainen <tss@iki.fi>
parents: 7319
diff changeset
62 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 }