annotate src/imap/cmd-append.c @ 4907:5b4c9b20eba0 HEAD

Replaced void *context from a lot of callbacks with the actual context type. Also added/fixed some context type checks.
author Timo Sirainen <tss@iki.fi>
date Fri, 15 Dec 2006 20:38:08 +0200
parents 204d7edc7cdc
children ff2272c228cc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (C) 2002 Timo Sirainen */
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"
117
97d0b9fcc18a APPEND was broken.
Timo Sirainen <tss@iki.fi>
parents: 0
diff changeset
4 #include "ioloop.h"
1015
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
5 #include "istream.h"
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 546
diff changeset
6 #include "ostream.h"
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
7 #include "str.h"
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "commands.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "imap-parser.h"
119
2f67de235489 Whops, we were using RFC822 dates everywhere instead of IMAP dates.
Timo Sirainen <tss@iki.fi>
parents: 117
diff changeset
10 #include "imap-date.h"
1041
47ecd950a702 some header file cleanups
Timo Sirainen <tss@iki.fi>
parents: 1023
diff changeset
11 #include "mail-storage.h"
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12
492
efa46e28a0d7 Fixes to timezone handling which were handling quite badly. added
Timo Sirainen <tss@iki.fi>
parents: 450
diff changeset
13 #include <sys/time.h>
efa46e28a0d7 Fixes to timezone handling which were handling quite badly. added
Timo Sirainen <tss@iki.fi>
parents: 450
diff changeset
14
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
15 struct cmd_append_context {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
16 struct client *client;
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
17 struct client_command_context *cmd;
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
18 struct mail_storage *storage;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
19 struct mailbox *box;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
20 struct mailbox_transaction_context *t;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
21
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
22 struct istream *input;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
23 uoff_t msg_size;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
24
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
25 struct imap_parser *save_parser;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
26 struct mail_save_context *save_ctx;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
27 };
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
28
4024
7d7b0f427d68 If client disconnected or gave too long APPEND command line, we didn't properly deinitialize saving, which could have caused partially written mails with mbox, or files left lying in tmp/ with maildir.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3963
diff changeset
29 static void cmd_append_finish(struct cmd_append_context *ctx);
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3811
diff changeset
30 static bool cmd_append_continue_message(struct client_command_context *cmd);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
31
4907
5b4c9b20eba0 Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents: 4903
diff changeset
32 static void client_input(struct client *client)
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
33 {
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
34 struct client_command_context *cmd = &client->cmd;
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
35
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
36 client->last_input = ioloop_time;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
37
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
38 switch (i_stream_read(client->input)) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
39 case -1:
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
40 /* disconnected */
4024
7d7b0f427d68 If client disconnected or gave too long APPEND command line, we didn't properly deinitialize saving, which could have caused partially written mails with mbox, or files left lying in tmp/ with maildir.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3963
diff changeset
41 cmd_append_finish(cmd->context);
4169
8686345192e8 Don't crash if client disconnects while appending message.
Timo Sirainen <tss@iki.fi>
parents: 4096
diff changeset
42 /* Reset command so that client_destroy() doesn't try to call
8686345192e8 Don't crash if client disconnects while appending message.
Timo Sirainen <tss@iki.fi>
parents: 4096
diff changeset
43 cmd_append_continue_message() anymore. */
8686345192e8 Don't crash if client disconnects while appending message.
Timo Sirainen <tss@iki.fi>
parents: 4096
diff changeset
44 _client_reset_command(client);
4096
904c53275e83 Log a line when IMAP client disconnects with a reason why it happened.
Timo Sirainen <tss@iki.fi>
parents: 4044
diff changeset
45 client_destroy(client, "Disconnected in APPEND");
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
46 return;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
47 case -2:
4024
7d7b0f427d68 If client disconnected or gave too long APPEND command line, we didn't properly deinitialize saving, which could have caused partially written mails with mbox, or files left lying in tmp/ with maildir.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3963
diff changeset
48 cmd_append_finish(cmd->context);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
49 if (client->command_pending) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
50 /* message data, this is handled internally by
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
51 mailbox_save_continue() */
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
52 break;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
53 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
54
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
55 /* parameter word is longer than max. input buffer size.
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
56 this is most likely an error, so skip the new data
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
57 until newline is found. */
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
58 client->input_skip_line = TRUE;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
59
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
60 client_send_command_error(cmd, "Too long argument.");
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
61 _client_reset_command(client);
4024
7d7b0f427d68 If client disconnected or gave too long APPEND command line, we didn't properly deinitialize saving, which could have caused partially written mails with mbox, or files left lying in tmp/ with maildir.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3963
diff changeset
62 return;
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
63 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
64
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
65 if (cmd->func(cmd)) {
3942
a490e6657329 If there had been enough sync changes while APPEND was being done, we never
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
66 /* command execution was finished. Note that if cmd_sync()
a490e6657329 If there had been enough sync changes while APPEND was being done, we never
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
67 didn't finish, we didn't get here but the input handler
a490e6657329 If there had been enough sync changes while APPEND was being done, we never
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
68 has already been moved. So don't do anything important
3949
4b6f9e5f7f09 Last APPEND-fix left connection always stuck afterwards.
Timo Sirainen <tss@iki.fi>
parents: 3942
diff changeset
69 here..
4b6f9e5f7f09 Last APPEND-fix left connection always stuck afterwards.
Timo Sirainen <tss@iki.fi>
parents: 3942
diff changeset
70
4b6f9e5f7f09 Last APPEND-fix left connection always stuck afterwards.
Timo Sirainen <tss@iki.fi>
parents: 3942
diff changeset
71 reset command once again to reset cmd_sync()'s changes. */
4b6f9e5f7f09 Last APPEND-fix left connection always stuck afterwards.
Timo Sirainen <tss@iki.fi>
parents: 3942
diff changeset
72 _client_reset_command(client);
4b6f9e5f7f09 Last APPEND-fix left connection always stuck afterwards.
Timo Sirainen <tss@iki.fi>
parents: 3942
diff changeset
73
2460
3accbeb04383 crashfixes
Timo Sirainen <tss@iki.fi>
parents: 2455
diff changeset
74 if (client->input_pending)
3accbeb04383 crashfixes
Timo Sirainen <tss@iki.fi>
parents: 2455
diff changeset
75 _client_input(client);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
76 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
77 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
78
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 /* Returns -1 = error, 0 = need more data, 1 = successful. flags and
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 internal_date may be NULL as a result, but mailbox and msg_size are always
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 set when successful. */
1015
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
82 static int validate_args(struct imap_arg *args, struct imap_arg_list **flags,
1022
09bac2875ed8 Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents: 1015
diff changeset
83 const char **internal_date, uoff_t *msg_size,
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3811
diff changeset
84 bool *nonsync)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 {
1015
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
86 /* [<flags>] */
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
87 if (args->type != IMAP_ARG_LIST)
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
88 *flags = NULL;
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
89 else {
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
90 *flags = IMAP_ARG_LIST(args);
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
91 args++;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93
1015
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
94 /* [<internal date>] */
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
95 if (args->type != IMAP_ARG_STRING)
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
96 *internal_date = NULL;
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
97 else {
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
98 *internal_date = IMAP_ARG_STR(args);
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
99 args++;
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
100 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101
1022
09bac2875ed8 Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents: 1015
diff changeset
102 if (args->type != IMAP_ARG_LITERAL_SIZE &&
2731
b63b4080c6b2 Handle failures without crashing
Timo Sirainen <tss@iki.fi>
parents: 2670
diff changeset
103 args->type != IMAP_ARG_LITERAL_SIZE_NONSYNC) {
b63b4080c6b2 Handle failures without crashing
Timo Sirainen <tss@iki.fi>
parents: 2670
diff changeset
104 *nonsync = FALSE;
1015
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
105 return FALSE;
2731
b63b4080c6b2 Handle failures without crashing
Timo Sirainen <tss@iki.fi>
parents: 2670
diff changeset
106 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107
1022
09bac2875ed8 Support for LITERAL+ extension.
Timo Sirainen <tss@iki.fi>
parents: 1015
diff changeset
108 *nonsync = args->type == IMAP_ARG_LITERAL_SIZE_NONSYNC;
1015
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
109 *msg_size = IMAP_ARG_LITERAL_SIZE(args);
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
110 return TRUE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
113 static void cmd_append_finish(struct cmd_append_context *ctx)
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
114 {
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
115 io_remove(&ctx->client->io);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
116
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
117 imap_parser_destroy(&ctx->save_parser);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
118
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
119 if (ctx->input != NULL)
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
120 i_stream_unref(&ctx->input);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
121
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
122 if (ctx->save_ctx != NULL)
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
123 mailbox_save_cancel(&ctx->save_ctx);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
124
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
125 if (ctx->t != NULL)
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
126 mailbox_transaction_rollback(&ctx->t);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
127
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
128 if (ctx->box != ctx->cmd->client->mailbox && ctx->box != NULL)
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
129 mailbox_close(&ctx->box);
3942
a490e6657329 If there had been enough sync changes while APPEND was being done, we never
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
130
a490e6657329 If there had been enough sync changes while APPEND was being done, we never
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
131 ctx->client->bad_counter = 0;
3963
ccab957a03b3 And the final fix for APPEND hangs ;)
Timo Sirainen <tss@iki.fi>
parents: 3962
diff changeset
132 o_stream_set_flush_callback(ctx->client->output,
ccab957a03b3 And the final fix for APPEND hangs ;)
Timo Sirainen <tss@iki.fi>
parents: 3962
diff changeset
133 _client_output, ctx->client);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
134 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
135
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3811
diff changeset
136 static bool cmd_append_continue_cancel(struct client_command_context *cmd)
2670
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
137 {
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
138 struct cmd_append_context *ctx = cmd->context;
2670
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
139 size_t size;
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
140
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
141 (void)i_stream_read(ctx->input);
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
142 (void)i_stream_get_data(ctx->input, &size);
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
143 i_stream_skip(ctx->input, size);
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
144
4277
c8af5a2492c5 If connection closes while appending, we crashed in some situations.
Timo Sirainen <tss@iki.fi>
parents: 4268
diff changeset
145 if (ctx->input->v_offset == ctx->msg_size ||
c8af5a2492c5 If connection closes while appending, we crashed in some situations.
Timo Sirainen <tss@iki.fi>
parents: 4268
diff changeset
146 cmd->client->input->closed) {
2670
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
147 cmd_append_finish(ctx);
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
148 return TRUE;
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
149 }
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
150 return FALSE;
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
151 }
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
152
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3811
diff changeset
153 static bool cmd_append_cancel(struct cmd_append_context *ctx, bool nonsync)
2670
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
154 {
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
155 if (!nonsync) {
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
156 cmd_append_finish(ctx);
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
157 return TRUE;
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
158 }
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
159
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
160 /* we have to read the nonsynced literal so we don't treat the message
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
161 data as commands. */
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
162 ctx->input = i_stream_create_limit(default_pool, ctx->client->input,
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
163 ctx->client->input->v_offset,
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
164 ctx->msg_size);
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
165
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
166 ctx->client->command_pending = TRUE;
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
167 ctx->cmd->func = cmd_append_continue_cancel;
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
168 ctx->cmd->context = ctx;
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
169 return cmd_append_continue_cancel(ctx->cmd);
2670
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
170 }
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
171
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3811
diff changeset
172 static bool cmd_append_continue_parsing(struct client_command_context *cmd)
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
173 {
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
174 struct client *client = cmd->client;
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
175 struct cmd_append_context *ctx = cmd->context;
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
176 struct imap_arg *args;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
177 struct imap_arg_list *flags_list;
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2878
diff changeset
178 enum mail_flags flags;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2878
diff changeset
179 const char *const *keywords_list;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2878
diff changeset
180 struct mail_keywords *keywords;
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
181 const char *internal_date_str;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
182 time_t internal_date;
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3811
diff changeset
183 int ret, timezone_offset;
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3811
diff changeset
184 bool nonsync;
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
185
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
186 /* if error occurs, the CRLF is already read. */
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
187 client->input_skip_line = FALSE;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
188
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
189 /* [<flags>] [<internal date>] <message literal> */
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
190 ret = imap_parser_read_args(ctx->save_parser, 0,
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
191 IMAP_PARSE_FLAG_LITERAL_SIZE, &args);
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
192 if (ret == -1) {
2670
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
193 if (ctx->box != NULL)
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
194 client_send_command_error(cmd, NULL);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
195 cmd_append_finish(ctx);
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
196 return TRUE;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
197 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
198 if (ret < 0) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
199 /* need more data */
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
200 return FALSE;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
201 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
202
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
203 if (args->type == IMAP_ARG_EOL) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
204 /* last message */
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
205 enum mailbox_sync_flags sync_flags;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
206
4044
da1d65e064f8 mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4041
diff changeset
207 /* eat away the trailing CRLF */
da1d65e064f8 mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4041
diff changeset
208 client->input_skip_line = TRUE;
da1d65e064f8 mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4041
diff changeset
209
2670
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
210 if (ctx->box == NULL) {
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
211 /* we failed earlier, error message is sent */
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
212 cmd_append_finish(ctx);
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
213 return TRUE;
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
214 }
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
215
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
216 ret = mailbox_transaction_commit(&ctx->t, 0);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
217 if (ret < 0) {
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
218 client_send_storage_error(cmd, ctx->storage);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
219 cmd_append_finish(ctx);
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
220 return TRUE;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
221 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
222
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
223 sync_flags = ctx->box == cmd->client->mailbox ?
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
224 0 : MAILBOX_SYNC_FLAG_FAST;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
225
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
226 cmd_append_finish(ctx);
3765
ce76b6b8ff11 UID STORE command must return UID parameter in FETCH replies.
Timo Sirainen <tss@iki.fi>
parents: 3763
diff changeset
227 return cmd_sync(cmd, sync_flags, 0, "OK Append completed.");
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
228 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
229
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
230 if (!validate_args(args, &flags_list, &internal_date_str,
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
231 &ctx->msg_size, &nonsync)) {
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
232 client_send_command_error(cmd, "Invalid arguments.");
2670
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
233 return cmd_append_cancel(ctx, nonsync);
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
234 }
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
235
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
236 if (ctx->box == NULL) {
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
237 /* we failed earlier, make sure we just eat nonsync-literal
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
238 if it's given. */
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
239 return cmd_append_cancel(ctx, nonsync);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
240 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
241
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
242 if (flags_list != NULL) {
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
243 if (!client_parse_mail_flags(cmd, flags_list->args,
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2878
diff changeset
244 &flags, &keywords_list))
2670
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
245 return cmd_append_cancel(ctx, nonsync);
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2878
diff changeset
246 keywords = keywords_list == NULL ? NULL :
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2878
diff changeset
247 mailbox_keywords_create(ctx->t, keywords_list);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
248 } else {
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2878
diff changeset
249 flags = 0;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2878
diff changeset
250 keywords = NULL;
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
251 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
252
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
253 if (internal_date_str == NULL) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
254 /* no time given, default to now. */
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
255 internal_date = (time_t)-1;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
256 timezone_offset = 0;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
257 } else if (!imap_parse_datetime(internal_date_str,
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
258 &internal_date, &timezone_offset)) {
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
259 client_send_tagline(cmd, "BAD Invalid internal date.");
2670
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
260 return cmd_append_cancel(ctx, nonsync);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
261 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
262
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
263 if (ctx->msg_size == 0) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
264 /* no message data, abort */
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
265 client_send_tagline(cmd, "NO Append aborted.");
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
266 cmd_append_finish(ctx);
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
267 return TRUE;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
268 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
269
4044
da1d65e064f8 mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4041
diff changeset
270 /* save the mail */
da1d65e064f8 mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4041
diff changeset
271 ctx->input = i_stream_create_limit(default_pool, client->input,
da1d65e064f8 mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4041
diff changeset
272 client->input->v_offset,
da1d65e064f8 mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4041
diff changeset
273 ctx->msg_size);
da1d65e064f8 mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4041
diff changeset
274 ret = mailbox_save_init(ctx->t, flags, keywords,
da1d65e064f8 mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4041
diff changeset
275 internal_date, timezone_offset, NULL,
4277
c8af5a2492c5 If connection closes while appending, we crashed in some situations.
Timo Sirainen <tss@iki.fi>
parents: 4268
diff changeset
276 ctx->input, FALSE, &ctx->save_ctx);
4044
da1d65e064f8 mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4041
diff changeset
277
da1d65e064f8 mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4041
diff changeset
278 if (keywords != NULL)
da1d65e064f8 mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4041
diff changeset
279 mailbox_keywords_free(ctx->t, &keywords);
da1d65e064f8 mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4041
diff changeset
280
da1d65e064f8 mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4041
diff changeset
281 if (ret < 0) {
da1d65e064f8 mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4041
diff changeset
282 /* save initialization failed */
da1d65e064f8 mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4041
diff changeset
283 client_send_storage_error(cmd, ctx->storage);
da1d65e064f8 mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4041
diff changeset
284 return cmd_append_cancel(ctx, nonsync);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
285 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
286
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
287 /* after literal comes CRLF, if we fail make sure we eat it away */
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
288 client->input_skip_line = TRUE;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
289
4044
da1d65e064f8 mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4041
diff changeset
290 if (!nonsync) {
da1d65e064f8 mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4041
diff changeset
291 o_stream_send(client->output, "+ OK\r\n", 6);
da1d65e064f8 mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4041
diff changeset
292 o_stream_flush(client->output);
da1d65e064f8 mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4041
diff changeset
293 o_stream_uncork(client->output);
da1d65e064f8 mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4041
diff changeset
294 }
3138
fbe844061fe2 Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents: 3131
diff changeset
295
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
296 client->command_pending = TRUE;
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
297 cmd->func = cmd_append_continue_message;
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
298 return cmd_append_continue_message(cmd);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
299 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
300
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3811
diff changeset
301 static bool cmd_append_continue_message(struct client_command_context *cmd)
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
302 {
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
303 struct client *client = cmd->client;
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
304 struct cmd_append_context *ctx = cmd->context;
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
305 size_t size;
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3811
diff changeset
306 bool failed;
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
307
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
308 if (ctx->save_ctx != NULL) {
3586
2cb7ebd43e8c If client input was closed unexpectedly, don't treat it as index error.
Timo Sirainen <tss@iki.fi>
parents: 3443
diff changeset
309 if (mailbox_save_continue(ctx->save_ctx) < 0) {
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
310 /* we still have to finish reading the message
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
311 from client */
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
312 mailbox_save_cancel(&ctx->save_ctx);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
313 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
314 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
315
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
316 if (ctx->save_ctx == NULL) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
317 (void)i_stream_read(ctx->input);
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
318 (void)i_stream_get_data(ctx->input, &size);
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
319 i_stream_skip(ctx->input, size);
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
320 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
321
3442
877fa3d04313 Yet another try at fixing APPEND.
Timo Sirainen <tss@iki.fi>
parents: 3439
diff changeset
322 if (ctx->input->eof || client->input->closed) {
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
323 /* finished */
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3811
diff changeset
324 bool all_written = ctx->input->v_offset == ctx->msg_size;
3443
d4bde07451c4 crashfix
Timo Sirainen <tss@iki.fi>
parents: 3442
diff changeset
325
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
326 i_stream_unref(&ctx->input);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
327 ctx->input = NULL;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
328
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
329 if (ctx->save_ctx == NULL) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
330 /* failed above */
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
331 client_send_storage_error(cmd, ctx->storage);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
332 failed = TRUE;
3443
d4bde07451c4 crashfix
Timo Sirainen <tss@iki.fi>
parents: 3442
diff changeset
333 } else if (!all_written) {
3442
877fa3d04313 Yet another try at fixing APPEND.
Timo Sirainen <tss@iki.fi>
parents: 3439
diff changeset
334 /* client disconnected before it finished sending the
877fa3d04313 Yet another try at fixing APPEND.
Timo Sirainen <tss@iki.fi>
parents: 3439
diff changeset
335 whole message. */
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
336 failed = TRUE;
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
337 mailbox_save_cancel(&ctx->save_ctx);
4287
a10701f11246 Compile fix
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4277
diff changeset
338 } else if (mailbox_save_finish(&ctx->save_ctx) < 0) {
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
339 failed = TRUE;
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
340 client_send_storage_error(cmd, ctx->storage);
3157
7eb1995f5a27 Don't crash if client disconnects in the middle of APPEND. The last fix
Timo Sirainen <tss@iki.fi>
parents: 3141
diff changeset
341 } else {
7eb1995f5a27 Don't crash if client disconnects in the middle of APPEND. The last fix
Timo Sirainen <tss@iki.fi>
parents: 3141
diff changeset
342 failed = client->input->closed;
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
343 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
344 ctx->save_ctx = NULL;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
345
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
346 if (failed) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
347 cmd_append_finish(ctx);
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
348 return TRUE;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
349 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
350
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
351 /* prepare for next message */
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
352 client->command_pending = FALSE;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
353 imap_parser_reset(ctx->save_parser);
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
354 cmd->func = cmd_append_continue_parsing;
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
355 return cmd_append_continue_parsing(cmd);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
356 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
357
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
358 return FALSE;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
359 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
360
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
361 static struct mailbox *
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
362 get_mailbox(struct client_command_context *cmd, const char *name)
2670
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
363 {
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
364 struct mail_storage *storage;
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
365 struct mailbox *box;
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
366
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
367 if (!client_verify_mailbox_name(cmd, name, TRUE, FALSE))
2670
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
368 return NULL;
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
369
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
370 storage = client_find_storage(cmd, &name);
2670
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
371 if (storage == NULL)
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
372 return NULL;
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
373
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
374 if (cmd->client->mailbox != NULL &&
3210
2715077f9c3e mailbox_name_equals() renamed to mailbox_equals(), which also now checks
Timo Sirainen <tss@iki.fi>
parents: 3209
diff changeset
375 mailbox_equals(cmd->client->mailbox, storage, name))
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
376 return cmd->client->mailbox;
2670
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
377
4041
9d7420b0e1ef Make life easier for plugins:
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4024
diff changeset
378 box = mailbox_open(storage, name, NULL, MAILBOX_OPEN_SAVEONLY |
9d7420b0e1ef Make life easier for plugins:
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4024
diff changeset
379 MAILBOX_OPEN_FAST | MAILBOX_OPEN_KEEP_RECENT);
2670
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
380 if (box == NULL) {
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
381 client_send_storage_error(cmd, storage);
2670
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
382 return NULL;
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
383 }
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
384 return box;
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
385 }
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
386
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3811
diff changeset
387 bool cmd_append(struct client_command_context *cmd)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
388 {
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
389 struct client *client = cmd->client;
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
390 struct cmd_append_context *ctx;
1168
03f1455664d7 Added setting to limit length of custom flag names.
Timo Sirainen <tss@iki.fi>
parents: 1041
diff changeset
391 struct mailbox_status status;
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
392 const char *mailbox;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
393
1015
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
394 /* <mailbox> */
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
395 if (!client_read_string_args(cmd, 1, &mailbox))
1015
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
396 return FALSE;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
397
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
398 ctx = p_new(cmd->pool, struct cmd_append_context, 1);
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
399 ctx->cmd = cmd;
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
400 ctx->client = client;
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
401 ctx->box = get_mailbox(cmd, mailbox);
2670
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
402 if (ctx->box != NULL) {
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
403 ctx->storage = mailbox_get_storage(ctx->box);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
404
2670
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
405 if (mailbox_get_status(ctx->box, STATUS_KEYWORDS,
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
406 &status) < 0) {
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
407 client_send_storage_error(cmd, ctx->storage);
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
408 mailbox_close(&ctx->box);
2670
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
409 } else {
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
410 client_save_keywords(&client->keywords,
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
411 status.keywords);
2670
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
412 }
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
413 ctx->t = ctx->box == NULL ? NULL :
3209
923ff19873d4 Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents: 3157
diff changeset
414 mailbox_transaction_begin(ctx->box,
923ff19873d4 Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents: 3157
diff changeset
415 MAILBOX_TRANSACTION_FLAG_EXTERNAL);
2670
e24c801dbc09 If message was APPENDed with LITERALPLUS and it failed for some reason (eg.
Timo Sirainen <tss@iki.fi>
parents: 2518
diff changeset
416 }
1168
03f1455664d7 Added setting to limit length of custom flag names.
Timo Sirainen <tss@iki.fi>
parents: 1041
diff changeset
417
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
418 io_remove(&client->io);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
419 client->io = io_add(i_stream_get_fd(client->input), IO_READ,
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
420 client_input, client);
2878
904c31d74acc APPEND was using all CPU.
Timo Sirainen <tss@iki.fi>
parents: 2731
diff changeset
421 /* append is special because we're only waiting on client input, not
904c31d74acc APPEND was using all CPU.
Timo Sirainen <tss@iki.fi>
parents: 2731
diff changeset
422 client output, so disable the standard output handler until we're
904c31d74acc APPEND was using all CPU.
Timo Sirainen <tss@iki.fi>
parents: 2731
diff changeset
423 finished */
4903
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4287
diff changeset
424 o_stream_unset_flush_callback(client->output);
1015
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
425
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
426 ctx->save_parser = imap_parser_create(client->input, client->output,
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2427
diff changeset
427 imap_max_line_length);
1015
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
428
3141
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
429 cmd->func = cmd_append_continue_parsing;
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
430 cmd->context = ctx;
61abed5f7864 Moved command-specific variables from struct client to struct
Timo Sirainen <tss@iki.fi>
parents: 3138
diff changeset
431 return cmd_append_continue_parsing(cmd);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
432 }