annotate src/lib-storage/index/mbox/mbox-save.c @ 3250:3b820e59610e HEAD

Recent flag handling cleanups. Added some comments.
author Timo Sirainen <tss@iki.fi>
date Tue, 29 Mar 2005 22:27:37 +0300
parents 6491dab63e54
children a2943c050571
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 "lib.h"
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
4 #include "ioloop.h"
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "hostpid.h"
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
6 #include "istream.h"
764
f57c52738f90 Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents: 674
diff changeset
7 #include "ostream.h"
1209
539b7336b68a mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
8 #include "str.h"
29
e9375147c0cb Added write_full() which is a simple wrapper around write() meant for
Timo Sirainen <tss@iki.fi>
parents: 22
diff changeset
9 #include "write-full.h"
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
10 #include "istream-header-filter.h"
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
11 #include "ostream-crlf.h"
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
12 #include "message-parser.h"
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
13 #include "mbox-storage.h"
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
14 #include "mbox-file.h"
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
15 #include "mbox-from.h"
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #include "mbox-lock.h"
2973
32cc9186d8eb If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents: 2892
diff changeset
17 #include "mbox-md5.h"
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
18 #include "mbox-sync-private.h"
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
20 #include <stddef.h>
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 #include <stdlib.h>
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 #include <unistd.h>
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 #include <fcntl.h>
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
24 #include <sys/stat.h>
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
25 #include <netdb.h>
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
26
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
27 struct mbox_save_context {
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
28 struct mail_save_context ctx;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
29
1015
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
30 struct index_mailbox *ibox;
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
31 struct mail_index_transaction *trans;
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
32 uoff_t append_offset, mail_offset;
1015
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
33
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
34 string_t *headers;
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
35 size_t space_end_idx;
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
36 uint32_t seq, next_uid;
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
37
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
38 struct istream *input;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
39 struct ostream *output, *body_output;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
40 uoff_t extra_hdr_offset, eoh_offset, eoh_input_offset;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
41 char last_char;
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
42
2973
32cc9186d8eb If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents: 2892
diff changeset
43 struct mbox_md5_context *mbox_md5_ctx;
1209
539b7336b68a mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
44
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
45 unsigned int synced:1;
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
46 unsigned int failed:1;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
47 unsigned int save_crlf:1;
1015
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
48 };
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
49
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
50 static char my_hostdomain[256] = "";
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
51
2486
e7fa0d07f247 Use correct error messages.
Timo Sirainen <tss@iki.fi>
parents: 2461
diff changeset
52 static void write_error(struct mbox_save_context *ctx, int error)
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
53 {
2486
e7fa0d07f247 Use correct error messages.
Timo Sirainen <tss@iki.fi>
parents: 2461
diff changeset
54 if (ENOSPACE(error)) {
1015
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
55 mail_storage_set_error(ctx->ibox->box.storage,
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
56 "Not enough disk space");
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
57 } else {
2486
e7fa0d07f247 Use correct error messages.
Timo Sirainen <tss@iki.fi>
parents: 2461
diff changeset
58 errno = error;
e7fa0d07f247 Use correct error messages.
Timo Sirainen <tss@iki.fi>
parents: 2461
diff changeset
59 mbox_set_syscall_error(ctx->ibox, "write()");
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
60 }
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
61 }
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
62
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
63 static int mbox_seek_to_end(struct mbox_save_context *ctx, uoff_t *offset)
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
64 {
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
65 struct stat st;
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
66 char ch;
1015
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
67 int fd;
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
68
2986
51a05fd00324 Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents: 2978
diff changeset
69 if (ctx->ibox->mbox_writeonly) {
51a05fd00324 Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents: 2978
diff changeset
70 *offset = 0;
51a05fd00324 Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents: 2978
diff changeset
71 return 0;
51a05fd00324 Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents: 2978
diff changeset
72 }
51a05fd00324 Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents: 2978
diff changeset
73
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
74 fd = ctx->ibox->mbox_fd;
1209
539b7336b68a mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
75 if (fstat(fd, &st) < 0)
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
76 return mbox_set_syscall_error(ctx->ibox, "fstat()");
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
77
1039
793f05a7e50e signed/unsigned/const pointer fixes
Timo Sirainen <tss@iki.fi>
parents: 1030
diff changeset
78 *offset = (uoff_t)st.st_size;
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
79 if (st.st_size == 0)
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
80 return 0;
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
81
1209
539b7336b68a mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
82 if (lseek(fd, st.st_size-1, SEEK_SET) < 0)
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
83 return mbox_set_syscall_error(ctx->ibox, "lseek()");
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
84
1209
539b7336b68a mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
85 if (read(fd, &ch, 1) != 1)
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
86 return mbox_set_syscall_error(ctx->ibox, "read()");
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
87
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
88 if (ch != '\n') {
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
89 if (write_full(fd, "\n", 1) < 0) {
2486
e7fa0d07f247 Use correct error messages.
Timo Sirainen <tss@iki.fi>
parents: 2461
diff changeset
90 write_error(ctx, errno);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
91 return -1;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
92 }
1015
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
93 *offset += 1;
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 492
diff changeset
94 }
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
95
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
96 return 0;
223
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
97 }
ca6967899c05 More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
98
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
99 static int mbox_append_lf(struct mbox_save_context *ctx)
266
757c32a1920d expunging last message from mbox duplicated the whole file. appending mail
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
100 {
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
101 if (o_stream_send(ctx->output, "\n", 1) < 0) {
2486
e7fa0d07f247 Use correct error messages.
Timo Sirainen <tss@iki.fi>
parents: 2461
diff changeset
102 write_error(ctx, ctx->output->stream_errno);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
103 return -1;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
104 }
266
757c32a1920d expunging last message from mbox duplicated the whole file. appending mail
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
105
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
106 return 0;
266
757c32a1920d expunging last message from mbox duplicated the whole file. appending mail
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
107 }
757c32a1920d expunging last message from mbox duplicated the whole file. appending mail
Timo Sirainen <tss@iki.fi>
parents: 223
diff changeset
108
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
109 static int write_from_line(struct mbox_save_context *ctx, time_t received_date,
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
110 const char *from_envelope)
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
111 {
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
112 const char *line, *name;
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
113 int ret;
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
114
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
115 if (*my_hostdomain == '\0') {
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
116 struct hostent *hent;
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
117
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
118 hent = gethostbyname(my_hostname);
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
119
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
120 name = hent != NULL ? hent->h_name : NULL;
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
121 if (name == NULL) {
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
122 /* failed, use just the hostname */
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
123 name = my_hostname;
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
124 }
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
125
809
27554afad17e Limit the mailbox path. A few cleanups.
Timo Sirainen <tss@iki.fi>
parents: 807
diff changeset
126 strocpy(my_hostdomain, name, sizeof(my_hostdomain));
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
127 }
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
128
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
129 t_push();
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
130 if (from_envelope == NULL) {
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
131 from_envelope = t_strconcat(ctx->ibox->storage->user, "@",
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
132 my_hostdomain, NULL);
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
133 }
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
134
492
efa46e28a0d7 Fixes to timezone handling which were handling quite badly. added
Timo Sirainen <tss@iki.fi>
parents: 472
diff changeset
135 /* save in local timezone, no matter what it was given with */
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
136 line = mbox_from_create(from_envelope, received_date);
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
137
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
138 if ((ret = o_stream_send_str(ctx->output, line)) < 0)
2486
e7fa0d07f247 Use correct error messages.
Timo Sirainen <tss@iki.fi>
parents: 2461
diff changeset
139 write_error(ctx, ctx->output->stream_errno);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
140 t_pop();
314
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
141
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
142 return ret;
314
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
143 }
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
144
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
145 static int mbox_write_content_length(struct mbox_save_context *ctx)
314
d2a305fa0ec2 mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents: 305
diff changeset
146 {
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
147 uoff_t end_offset;
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
148 const char *str;
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
149 size_t len;
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
150 int ret = 0;
1209
539b7336b68a mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
151
2986
51a05fd00324 Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents: 2978
diff changeset
152 if (ctx->ibox->mbox_writeonly) {
51a05fd00324 Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents: 2978
diff changeset
153 /* we can't seek, don't set Content-Length */
51a05fd00324 Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents: 2978
diff changeset
154 return 0;
51a05fd00324 Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents: 2978
diff changeset
155 }
51a05fd00324 Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents: 2978
diff changeset
156
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
157 end_offset = ctx->output->offset;
1209
539b7336b68a mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
158
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
159 /* write Content-Length headers */
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
160 t_push();
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
161 str = t_strdup_printf("\nContent-Length: %s",
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
162 dec2str(end_offset - ctx->eoh_offset));
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
163 len = strlen(str);
1209
539b7336b68a mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
164
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
165 if (o_stream_seek(ctx->output, ctx->extra_hdr_offset +
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
166 ctx->space_end_idx - len) < 0) {
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
167 mbox_set_syscall_error(ctx->ibox, "o_stream_seek()");
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
168 ret = -1;
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
169 } else if (o_stream_send(ctx->output, str, len) < 0) {
2486
e7fa0d07f247 Use correct error messages.
Timo Sirainen <tss@iki.fi>
parents: 2461
diff changeset
170 write_error(ctx, ctx->output->stream_errno);
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
171 ret = -1;
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
172 } else {
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
173 if (o_stream_seek(ctx->output, end_offset) < 0) {
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
174 mbox_set_syscall_error(ctx->ibox, "o_stream_seek()");
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
175 ret = -1;
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
176 }
1209
539b7336b68a mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
177 }
539b7336b68a mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
178
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
179 t_pop();
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
180 return ret;
1209
539b7336b68a mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
181 }
539b7336b68a mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
182
2892
62d53b49110d Changed mail_index_get_header() to return the header as return value because
Timo Sirainen <tss@iki.fi>
parents: 2877
diff changeset
183 static void mbox_save_init_sync(struct mbox_transaction_context *t)
1209
539b7336b68a mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
184 {
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
185 struct mbox_save_context *ctx = t->save_ctx;
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
186 const struct mail_index_header *hdr;
3221
af8fc972fe95 If want_mail = TRUE for mbox_save_init() and we sync the mbox, we'll have to
Timo Sirainen <tss@iki.fi>
parents: 3209
diff changeset
187 struct mail_index_view *view;
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
188
3221
af8fc972fe95 If want_mail = TRUE for mbox_save_init() and we sync the mbox, we'll have to
Timo Sirainen <tss@iki.fi>
parents: 3209
diff changeset
189 /* open a new view to get the header. this is required if we just
af8fc972fe95 If want_mail = TRUE for mbox_save_init() and we sync the mbox, we'll have to
Timo Sirainen <tss@iki.fi>
parents: 3209
diff changeset
190 synced the mailbox so we can get updated next_uid. */
af8fc972fe95 If want_mail = TRUE for mbox_save_init() and we sync the mbox, we'll have to
Timo Sirainen <tss@iki.fi>
parents: 3209
diff changeset
191 view = mail_index_view_open(t->ictx.ibox->index);
af8fc972fe95 If want_mail = TRUE for mbox_save_init() and we sync the mbox, we'll have to
Timo Sirainen <tss@iki.fi>
parents: 3209
diff changeset
192 hdr = mail_index_get_header(view);
2892
62d53b49110d Changed mail_index_get_header() to return the header as return value because
Timo Sirainen <tss@iki.fi>
parents: 2877
diff changeset
193
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
194 ctx->next_uid = hdr->next_uid;
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
195 ctx->synced = TRUE;
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
196 t->mbox_modified = TRUE;
3221
af8fc972fe95 If want_mail = TRUE for mbox_save_init() and we sync the mbox, we'll have to
Timo Sirainen <tss@iki.fi>
parents: 3209
diff changeset
197
af8fc972fe95 If want_mail = TRUE for mbox_save_init() and we sync the mbox, we'll have to
Timo Sirainen <tss@iki.fi>
parents: 3209
diff changeset
198 mail_index_view_close(view);
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
199 }
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
200
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
201 static void status_flags_append(string_t *str, enum mail_flags flags,
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
202 const struct mbox_flag_type *flags_list)
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
203 {
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
204 int i;
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
205
3250
3b820e59610e Recent flag handling cleanups. Added some comments.
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
206 flags ^= MBOX_NONRECENT_KLUDGE;
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
207 for (i = 0; flags_list[i].chr != 0; i++) {
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
208 if ((flags & flags_list[i].flag) != 0)
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
209 str_append_c(str, flags_list[i].chr);
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
210 }
3250
3b820e59610e Recent flag handling cleanups. Added some comments.
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
211 flags ^= MBOX_NONRECENT_KLUDGE;
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
212 }
1209
539b7336b68a mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
213
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
214 static void mbox_save_append_flag_headers(string_t *str, enum mail_flags flags)
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
215 {
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
216 if ((flags & STATUS_FLAGS_MASK) != 0) {
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
217 str_append(str, "Status: ");
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
218 status_flags_append(str, flags, mbox_status_flags);
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
219 str_append_c(str, '\n');
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
220 }
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
221
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
222 if ((flags & XSTATUS_FLAGS_MASK) != 0) {
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
223 str_append(str, "X-Status: ");
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
224 status_flags_append(str, flags, mbox_xstatus_flags);
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
225 str_append_c(str, '\n');
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
226 }
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
227 }
1209
539b7336b68a mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
228
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2986
diff changeset
229 static void
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2986
diff changeset
230 mbox_save_append_keyword_headers(struct mbox_save_context *ctx,
3086
66c44404f9a1 Keyword fixes.
Timo Sirainen <tss@iki.fi>
parents: 3016
diff changeset
231 struct mail_keywords *keywords)
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
232 {
2273
c48822c8713f Updated comment about how syncing is done, and s/extra space/padding/
Timo Sirainen <tss@iki.fi>
parents: 2261
diff changeset
233 unsigned char space[MBOX_HEADER_PADDING+1 +
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
234 sizeof("Content-Length: \n")-1 + MAX_INT_STRLEN];
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
235 unsigned int i;
1209
539b7336b68a mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
236
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
237 str_append(ctx->headers, "X-Keywords:");
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2986
diff changeset
238 /*FIXME:for (i = 0; i < count; i++) {
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
239 str_append_c(ctx->headers, ' ');
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
240 str_append(ctx->headers, keywords[i]);
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2986
diff changeset
241 }*/
1209
539b7336b68a mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents: 1039
diff changeset
242
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
243 memset(space, ' ', sizeof(space));
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
244 str_append_n(ctx->headers, space, sizeof(space));
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
245 ctx->space_end_idx = str_len(ctx->headers);
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
246 str_append_c(ctx->headers, '\n');
22
a946ce1f09b7 mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents: 13
diff changeset
247 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
249 static int
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
250 mbox_save_init_file(struct mbox_save_context *ctx,
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
251 struct mbox_transaction_context *t, int want_mail)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252 {
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
253 struct index_mailbox *ibox = ctx->ibox;
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
254 int ret;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
255
3245
6491dab63e54 Added input stream parameter to mailbox_open(). With mbox it now allows
Timo Sirainen <tss@iki.fi>
parents: 3221
diff changeset
256 if (ctx->ibox->mbox_readonly || ctx->ibox->readonly) {
6491dab63e54 Added input stream parameter to mailbox_open(). With mbox it now allows
Timo Sirainen <tss@iki.fi>
parents: 3221
diff changeset
257 mail_storage_set_error(&ctx->ibox->storage->storage,
6491dab63e54 Added input stream parameter to mailbox_open(). With mbox it now allows
Timo Sirainen <tss@iki.fi>
parents: 3221
diff changeset
258 "Read-only mbox");
6491dab63e54 Added input stream parameter to mailbox_open(). With mbox it now allows
Timo Sirainen <tss@iki.fi>
parents: 3221
diff changeset
259 return -1;
6491dab63e54 Added input stream parameter to mailbox_open(). With mbox it now allows
Timo Sirainen <tss@iki.fi>
parents: 3221
diff changeset
260 }
6491dab63e54 Added input stream parameter to mailbox_open(). With mbox it now allows
Timo Sirainen <tss@iki.fi>
parents: 3221
diff changeset
261
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
262 if (ctx->append_offset == (uoff_t)-1) {
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
263 /* first appended mail in this transaction */
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
264 if (ibox->mbox_lock_type != F_WRLCK) {
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
265 if (mbox_lock(ibox, F_WRLCK, &t->mbox_lock_id) <= 0)
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
266 return -1;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
267 }
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
268
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
269 if (ibox->mbox_fd == -1) {
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
270 if (mbox_file_open(ibox) < 0)
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
271 return -1;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
272 }
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
273
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
274 if (!want_mail) {
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
275 /* assign UIDs only if mbox doesn't require syncing */
2511
710e0bf25bf8 Added mbox_dirty_syncs setting which delays re-reading the whole mbox when
Timo Sirainen <tss@iki.fi>
parents: 2486
diff changeset
276 ret = mbox_sync_has_changed(ibox, TRUE);
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
277 if (ret < 0)
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
278 return -1;
2892
62d53b49110d Changed mail_index_get_header() to return the header as return value because
Timo Sirainen <tss@iki.fi>
parents: 2877
diff changeset
279 if (ret == 0)
62d53b49110d Changed mail_index_get_header() to return the header as return value because
Timo Sirainen <tss@iki.fi>
parents: 2877
diff changeset
280 mbox_save_init_sync(t);
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
281 }
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
282
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
283 if (mbox_seek_to_end(ctx, &ctx->append_offset) < 0)
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
284 return -1;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
285
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
286 ctx->output = o_stream_create_file(ibox->mbox_fd, default_pool,
2421
d141e1bfdd63 We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents: 2298
diff changeset
287 0, FALSE);
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
288 }
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
289
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
290 if (!ctx->synced && want_mail) {
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
291 /* we'll need to assign UID for the mail immediately. */
2511
710e0bf25bf8 Added mbox_dirty_syncs setting which delays re-reading the whole mbox when
Timo Sirainen <tss@iki.fi>
parents: 2486
diff changeset
292 if (mbox_sync(ibox, 0) < 0)
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
293 return -1;
2892
62d53b49110d Changed mail_index_get_header() to return the header as return value because
Timo Sirainen <tss@iki.fi>
parents: 2877
diff changeset
294 mbox_save_init_sync(t);
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
295 }
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
296
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
297 return 0;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
298 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
299
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
300 static void save_header_callback(struct message_header_line *hdr,
2973
32cc9186d8eb If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents: 2892
diff changeset
301 int *matched, void *context)
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
302 {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
303 struct mbox_save_context *ctx = context;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
304
2978
982e7432276f If mbox isn't synced, don't try to set message's md5sum because it just
Timo Sirainen <tss@iki.fi>
parents: 2973
diff changeset
305 if (!*matched && ctx->mbox_md5_ctx && hdr != NULL)
2973
32cc9186d8eb If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents: 2892
diff changeset
306 mbox_md5_continue(ctx->mbox_md5_ctx, hdr);
32cc9186d8eb If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents: 2892
diff changeset
307
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
308 if ((hdr == NULL && ctx->eoh_input_offset == (uoff_t)-1) ||
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
309 (hdr != NULL && hdr->eoh))
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
310 ctx->eoh_input_offset = ctx->input->v_offset;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
311 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
312
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
313 struct mail_save_context *
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
314 mbox_save_init(struct mailbox_transaction_context *_t,
3086
66c44404f9a1 Keyword fixes.
Timo Sirainen <tss@iki.fi>
parents: 3016
diff changeset
315 enum mail_flags flags, struct mail_keywords *keywords,
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
316 time_t received_date, int timezone_offset __attr_unused__,
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
317 const char *from_envelope, struct istream *input, int want_mail)
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
318 {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
319 struct mbox_transaction_context *t =
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
320 (struct mbox_transaction_context *)_t;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
321 struct index_mailbox *ibox = t->ictx.ibox;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
322 struct mbox_save_context *ctx = t->save_ctx;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
323 enum mail_flags save_flags;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
324 uint64_t offset;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
325
3209
923ff19873d4 Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents: 3086
diff changeset
326 i_assert((t->ictx.flags & MAILBOX_TRANSACTION_FLAG_EXTERNAL) != 0);
923ff19873d4 Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents: 3086
diff changeset
327
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
328 /* FIXME: we could write timezone_offset to From-line.. */
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
329 if (received_date == (time_t)-1)
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
330 received_date = ioloop_time;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
331
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
332 if (ctx == NULL) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
333 ctx = t->save_ctx = i_new(struct mbox_save_context, 1);
3209
923ff19873d4 Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents: 3086
diff changeset
334 ctx->ctx.transaction = &t->ictx.mailbox_ctx;
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
335 ctx->ibox = ibox;
3209
923ff19873d4 Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents: 3086
diff changeset
336 ctx->trans = t->ictx.trans;
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
337 ctx->append_offset = (uoff_t)-1;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
338 ctx->headers = str_new(default_pool, 512);
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
339 ctx->save_crlf = getenv("MAIL_SAVE_CRLF") != NULL;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
340 ctx->mail_offset = (uoff_t)-1;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
341 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
342
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
343 ctx->failed = FALSE;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
344 ctx->seq = 0;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
345
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
346 if (mbox_save_init_file(ctx, t, want_mail) < 0) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
347 ctx->failed = TRUE;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
348 return &ctx->ctx;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
349 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
350
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2986
diff changeset
351 save_flags = (flags & ~MAIL_RECENT) | MAIL_RECENT;
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
352 str_truncate(ctx->headers, 0);
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
353 if (ctx->synced) {
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
354 str_printfa(ctx->headers, "X-UID: %u\n", ctx->next_uid);
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
355 if (!ibox->keep_recent)
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
356 save_flags &= ~MAIL_RECENT;
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
357
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
358 // FIXME: set keywords
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
359 mail_index_append(ctx->trans, ctx->next_uid, &ctx->seq);
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
360 mail_index_update_flags(ctx->trans, ctx->seq, MODIFY_REPLACE,
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2986
diff changeset
361 save_flags);
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
362
2261
ba4f6d7b5a58 saving messages to empty mbox was buggy
Timo Sirainen <tss@iki.fi>
parents: 2224
diff changeset
363 offset = ctx->output->offset == 0 ? 0 :
ba4f6d7b5a58 saving messages to empty mbox was buggy
Timo Sirainen <tss@iki.fi>
parents: 2224
diff changeset
364 ctx->output->offset - 1;
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2511
diff changeset
365 mail_index_update_ext(ctx->trans, ctx->seq,
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
366 ibox->mbox_ext_idx, &offset, NULL);
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
367 ctx->next_uid++;
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
368 }
3250
3b820e59610e Recent flag handling cleanups. Added some comments.
Timo Sirainen <tss@iki.fi>
parents: 3245
diff changeset
369 mbox_save_append_flag_headers(ctx->headers, save_flags);
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2986
diff changeset
370 mbox_save_append_keyword_headers(ctx, keywords);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
371 str_append_c(ctx->headers, '\n');
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
372
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
373 i_assert(ibox->mbox_lock_type == F_WRLCK);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
375 ctx->mail_offset = ctx->output->offset;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
376 ctx->eoh_input_offset = (uoff_t)-1;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
377 ctx->eoh_offset = (uoff_t)-1;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
378 ctx->last_char = '\n';
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
379
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
380 if (write_from_line(ctx, received_date, from_envelope) < 0)
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
381 ctx->failed = TRUE;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
382 else {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
383 ctx->input =
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2446
diff changeset
384 i_stream_create_header_filter(input,
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2446
diff changeset
385 HEADER_FILTER_EXCLUDE |
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2446
diff changeset
386 HEADER_FILTER_NO_CR,
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
387 mbox_hide_headers,
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
388 mbox_hide_headers_count,
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
389 save_header_callback,
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
390 ctx);
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
391 ctx->body_output = getenv("MAIL_SAVE_CRLF") != NULL ?
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
392 o_stream_create_crlf(default_pool, ctx->output) :
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
393 o_stream_create_lf(default_pool, ctx->output);
2978
982e7432276f If mbox isn't synced, don't try to set message's md5sum because it just
Timo Sirainen <tss@iki.fi>
parents: 2973
diff changeset
394 if (ctx->ibox->mbox_save_md5 && ctx->synced)
2973
32cc9186d8eb If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents: 2892
diff changeset
395 ctx->mbox_md5_ctx = mbox_md5_init();
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
396 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
397
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
398 return &ctx->ctx;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
399 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
400
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
401 int mbox_save_continue(struct mail_save_context *_ctx)
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
402 {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
403 struct mbox_save_context *ctx = (struct mbox_save_context *)_ctx;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
404 const unsigned char *data;
2456
f32419d92307 saving was broken
Timo Sirainen <tss@iki.fi>
parents: 2451
diff changeset
405 size_t size;
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
406 ssize_t ret;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
407
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
408 if (ctx->failed)
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
409 return -1;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
410
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
411 if (ctx->eoh_offset != (uoff_t)-1) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
412 /* writing body */
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
413 if (o_stream_send_istream(ctx->body_output, ctx->input) < 0) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
414 ctx->failed = TRUE;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
415 return -1;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
416 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
417 return 0;
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
418 }
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
419
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
420 while ((ret = i_stream_read(ctx->input)) != -1) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
421 if (ret == 0)
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
422 return 0;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
423
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
424 data = i_stream_get_data(ctx->input, &size);
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
425 if (ctx->eoh_input_offset != (uoff_t)-1 &&
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
426 ctx->input->v_offset + size >= ctx->eoh_input_offset) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
427 /* found end of headers. write the rest of them. */
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
428 size = ctx->eoh_input_offset - ctx->input->v_offset;
2456
f32419d92307 saving was broken
Timo Sirainen <tss@iki.fi>
parents: 2451
diff changeset
429 if (o_stream_send(ctx->output, data, size) < 0) {
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
430 ctx->failed = TRUE;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
431 return -1;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
432 }
2456
f32419d92307 saving was broken
Timo Sirainen <tss@iki.fi>
parents: 2451
diff changeset
433 if (size > 0)
f32419d92307 saving was broken
Timo Sirainen <tss@iki.fi>
parents: 2451
diff changeset
434 ctx->last_char = data[size-1];
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
435 i_stream_skip(ctx->input, size + 1);
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
436 break;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
437 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
438
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
439 if (o_stream_send(ctx->output, data, size) < 0) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
440 ctx->failed = TRUE;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
441 return -1;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
442 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
443 ctx->last_char = data[size-1];
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
444 i_stream_skip(ctx->input, size);
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
445 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
447 if (ctx->last_char != '\n') {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
448 if (o_stream_send(ctx->output, "\n", 1) < 0) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
449 ctx->failed = TRUE;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
450 return -1;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
451 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
452 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
453
2978
982e7432276f If mbox isn't synced, don't try to set message's md5sum because it just
Timo Sirainen <tss@iki.fi>
parents: 2973
diff changeset
454 if (ctx->mbox_md5_ctx) {
2973
32cc9186d8eb If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents: 2892
diff changeset
455 unsigned char hdr_md5_sum[16];
32cc9186d8eb If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents: 2892
diff changeset
456
32cc9186d8eb If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents: 2892
diff changeset
457 mbox_md5_finish(ctx->mbox_md5_ctx, hdr_md5_sum);
32cc9186d8eb If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents: 2892
diff changeset
458 mail_index_update_ext(ctx->trans, ctx->seq,
32cc9186d8eb If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents: 2892
diff changeset
459 ctx->ibox->md5hdr_ext_idx,
32cc9186d8eb If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents: 2892
diff changeset
460 hdr_md5_sum, NULL);
32cc9186d8eb If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents: 2892
diff changeset
461 }
32cc9186d8eb If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents: 2892
diff changeset
462
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
463 /* append our own headers and ending empty line */
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
464 ctx->extra_hdr_offset = ctx->output->offset;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
465 if (o_stream_send(ctx->output, str_data(ctx->headers),
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
466 str_len(ctx->headers)) < 0) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
467 ctx->failed = TRUE;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
468 return -1;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
469 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
470 ctx->eoh_offset = ctx->output->offset;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
471
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
472 /* write body */
2461
e201021f6ad9 Saving fix.
Timo Sirainen <tss@iki.fi>
parents: 2456
diff changeset
473 (void)i_stream_get_data(ctx->input, &size);
e201021f6ad9 Saving fix.
Timo Sirainen <tss@iki.fi>
parents: 2456
diff changeset
474 return ctx->input->eof && size == 0 ? 0 : mbox_save_continue(_ctx);
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
475 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
476
3209
923ff19873d4 Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents: 3086
diff changeset
477 int mbox_save_finish(struct mail_save_context *_ctx, struct mail *dest_mail)
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
478 {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
479 struct mbox_save_context *ctx = (struct mbox_save_context *)_ctx;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
480
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
481 if (!ctx->failed) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
482 if (mbox_write_content_length(ctx) < 0 ||
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
483 mbox_append_lf(ctx) < 0)
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
484 ctx->failed = TRUE;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
485 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
486
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
487 if (ctx->input != NULL) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
488 i_stream_unref(ctx->input);
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
489 ctx->input = NULL;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
490 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
491 if (ctx->body_output != NULL) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
492 o_stream_unref(ctx->body_output);
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
493 ctx->body_output = NULL;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
494 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
495
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
496 if (ctx->failed && ctx->mail_offset != (uoff_t)-1) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
497 /* saving this mail failed - truncate back to beginning of it */
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
498 if (ftruncate(ctx->ibox->mbox_fd, (off_t)ctx->mail_offset) < 0)
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
499 mbox_set_syscall_error(ctx->ibox, "ftruncate()");
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
500 ctx->mail_offset = (uoff_t)-1;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
501 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
502
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
503 if (ctx->failed) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
504 errno = ctx->output->stream_errno;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
505 if (ENOSPACE(errno)) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
506 mail_storage_set_error(ctx->ibox->box.storage,
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
507 "Not enough disk space");
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
508 } else if (errno != 0) {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
509 mail_storage_set_critical(ctx->ibox->box.storage,
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
510 "write(%s) failed: %m", ctx->ibox->path);
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
511 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
512 return -1;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
513 }
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
514
3209
923ff19873d4 Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents: 3086
diff changeset
515 if (dest_mail != NULL) {
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
516 i_assert(ctx->seq != 0);
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
517
3209
923ff19873d4 Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents: 3086
diff changeset
518 if (mail_set_seq(dest_mail, ctx->seq) < 0)
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
519 return -1;
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
520 }
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
521
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
522 return 0;
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
523 }
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
524
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
525 void mbox_save_cancel(struct mail_save_context *_ctx)
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
526 {
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
527 struct mbox_save_context *ctx = (struct mbox_save_context *)_ctx;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
528
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
529 ctx->failed = TRUE;
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
530 (void)mbox_save_finish(_ctx, NULL);
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
531 }
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
532
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
533 static void mbox_transaction_save_deinit(struct mbox_save_context *ctx)
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
534 {
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
535 i_assert(ctx->body_output == NULL);
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
536
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
537 if (ctx->output != NULL)
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
538 o_stream_unref(ctx->output);
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
539 str_free(ctx->headers);
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
540 i_free(ctx);
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
541 }
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
542
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
543 int mbox_transaction_save_commit(struct mbox_save_context *ctx)
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
544 {
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
545 int ret = 0;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
546
2190
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
547 if (ctx->synced) {
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
548 mail_index_update_header(ctx->trans,
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
549 offsetof(struct mail_index_header, next_uid),
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
550 &ctx->next_uid, sizeof(ctx->next_uid));
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
551 }
755ec9442a58 mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents: 2129
diff changeset
552
2986
51a05fd00324 Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents: 2978
diff changeset
553 if (!ctx->synced && ctx->ibox->mbox_fd != -1 &&
51a05fd00324 Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents: 2978
diff changeset
554 !ctx->ibox->mbox_writeonly) {
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
555 if (fdatasync(ctx->ibox->mbox_fd) < 0) {
2986
51a05fd00324 Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents: 2978
diff changeset
556 mbox_set_syscall_error(ctx->ibox, "fdatasync()");
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
557 ret = -1;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
558 }
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
559 }
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
560
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
561 mbox_transaction_save_deinit(ctx);
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
562 return ret;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
563 }
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
564
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
565 void mbox_transaction_save_rollback(struct mbox_save_context *ctx)
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
566 {
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
567 struct index_mailbox *ibox = ctx->ibox;
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
568
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
569 if (ctx->append_offset != (uoff_t)-1 && ibox->mbox_fd != -1) {
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
570 i_assert(ibox->mbox_lock_type == F_WRLCK);
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
571
1015
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
572 /* failed, truncate file back to original size.
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
573 output stream needs to be flushed before truncating
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
574 so unref() won't write anything. */
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
575 o_stream_flush(ctx->output);
562
ca988d72265b APPEND fixed for mbox
Timo Sirainen <tss@iki.fi>
parents: 532
diff changeset
576
1978
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
577 if (ftruncate(ibox->mbox_fd, (off_t)ctx->append_offset) < 0)
6303ef092c5b mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents: 1958
diff changeset
578 mbox_set_syscall_error(ibox, "ftruncate()");
1015
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
579 }
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
580
2446
47e1e05cede0 Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents: 2421
diff changeset
581 mbox_transaction_save_deinit(ctx);
1015
40a327d356de Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents: 988
diff changeset
582 }