Mercurial > dovecot > core-2.2
annotate src/lib-storage/index/mbox/mbox-save.c @ 6940:414c9d631a81 HEAD
Replaced t_push/t_pop calls with T_FRAME*() macros.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 05 Dec 2007 17:47:44 +0200 |
parents | 104a8929ef7c |
children | 2f25031c4a84 |
rev | line source |
---|---|
6429
65c69a53a7be
Replaced my Copyright notices. The year range always ends with 2007 now.
Timo Sirainen <tss@iki.fi>
parents:
6422
diff
changeset
|
1 /* Copyright (c) 2002-2007 Dovecot authors, see the included COPYING file */ |
0 | 2 |
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" |
3470
346a494c2feb
Moved array declaration to array-decl.h and include it in lib.h. So array.h
Timo Sirainen <tss@iki.fi>
parents:
3464
diff
changeset
|
5 #include "array.h" |
5167
b11b55f8912a
If pop3_uidl_format=%m, add a unique X-Delivery-ID header to all saved
Timo Sirainen <tss@iki.fi>
parents:
5124
diff
changeset
|
6 #include "base64.h" |
0 | 7 #include "hostpid.h" |
5167
b11b55f8912a
If pop3_uidl_format=%m, add a unique X-Delivery-ID header to all saved
Timo Sirainen <tss@iki.fi>
parents:
5124
diff
changeset
|
8 #include "randgen.h" |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
9 #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
|
10 #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
|
11 #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
|
12 #include "write-full.h" |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
13 #include "istream-header-filter.h" |
6528
aedda93baa2c
Use crlf input streams instead of output streams so message parser doesn't
Timo Sirainen <tss@iki.fi>
parents:
6511
diff
changeset
|
14 #include "istream-crlf.h" |
6562
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
15 #include "istream-concat.h" |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
16 #include "message-parser.h" |
3464
0661239a7034
Cache mail headers when saving mails to mbox. We should cache everything,
Timo Sirainen <tss@iki.fi>
parents:
3348
diff
changeset
|
17 #include "index-mail.h" |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
18 #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
|
19 #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
|
20 #include "mbox-from.h" |
0 | 21 #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
|
22 #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
|
23 #include "mbox-sync-private.h" |
0 | 24 |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
25 #include <stddef.h> |
0 | 26 #include <stdlib.h> |
27 #include <unistd.h> | |
28 #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
|
29 #include <sys/stat.h> |
22
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
30 #include <netdb.h> |
5741
7a57631e2d6c
Preserve mbox files' atime when saving/syncing.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
31 #include <utime.h> |
22
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
32 |
5167
b11b55f8912a
If pop3_uidl_format=%m, add a unique X-Delivery-ID header to all saved
Timo Sirainen <tss@iki.fi>
parents:
5124
diff
changeset
|
33 #define MBOX_DELIVERY_ID_RAND_BYTES (64/8) |
b11b55f8912a
If pop3_uidl_format=%m, add a unique X-Delivery-ID header to all saved
Timo Sirainen <tss@iki.fi>
parents:
5124
diff
changeset
|
34 |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
35 struct mbox_save_context { |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
36 struct mail_save_context ctx; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
37 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
38 struct mbox_mailbox *mbox; |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
39 struct mail_index_transaction *trans; |
3464
0661239a7034
Cache mail headers when saving mails to mbox. We should cache everything,
Timo Sirainen <tss@iki.fi>
parents:
3348
diff
changeset
|
40 struct mail *mail; |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
41 uoff_t append_offset, mail_offset; |
5741
7a57631e2d6c
Preserve mbox files' atime when saving/syncing.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
42 time_t orig_atime; |
6265
0ee2b0691f3e
Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents:
6161
diff
changeset
|
43 time_t received_date; |
1015
40a327d356de
Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents:
988
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 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
|
46 size_t space_end_idx; |
5592 | 47 uint32_t seq, next_uid, uid_validity, first_saved_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
|
48 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
49 struct istream *input; |
6528
aedda93baa2c
Use crlf input streams instead of output streams so message parser doesn't
Timo Sirainen <tss@iki.fi>
parents:
6511
diff
changeset
|
50 struct ostream *output; |
6339 | 51 uoff_t extra_hdr_offset, eoh_offset; |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
52 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
|
53 |
2973
32cc9186d8eb
If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents:
2892
diff
changeset
|
54 struct mbox_md5_context *mbox_md5_ctx; |
6562
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
55 char *x_delivery_id_header; |
1209
539b7336b68a
mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
56 |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
57 unsigned int synced:1; |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
58 unsigned int failed:1; |
4044
da1d65e064f8
mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3879
diff
changeset
|
59 unsigned int finished:1; |
1015
40a327d356de
Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents:
988
diff
changeset
|
60 }; |
40a327d356de
Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents:
988
diff
changeset
|
61 |
22
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
62 static char my_hostdomain[256] = ""; |
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
63 |
5281
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
64 static int write_error(struct mbox_save_context *ctx) |
223
ca6967899c05
More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
65 { |
5613 | 66 mbox_set_syscall_error(ctx->mbox, "write()"); |
3348
34dea04a191e
Crashfix for some failure handling.
Timo Sirainen <tss@iki.fi>
parents:
3322
diff
changeset
|
67 ctx->failed = TRUE; |
5281
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
68 return -1; |
223
ca6967899c05
More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
69 } |
ca6967899c05
More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
70 |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
71 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
|
72 { |
521
83da62e0675a
mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents:
492
diff
changeset
|
73 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
|
74 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
|
75 int fd; |
223
ca6967899c05
More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
76 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
77 if (ctx->mbox->mbox_writeonly) { |
2986
51a05fd00324
Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents:
2978
diff
changeset
|
78 *offset = 0; |
51a05fd00324
Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents:
2978
diff
changeset
|
79 return 0; |
51a05fd00324
Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents:
2978
diff
changeset
|
80 } |
51a05fd00324
Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents:
2978
diff
changeset
|
81 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
82 fd = ctx->mbox->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
|
83 if (fstat(fd, &st) < 0) |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
84 return mbox_set_syscall_error(ctx->mbox, "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
|
85 |
5741
7a57631e2d6c
Preserve mbox files' atime when saving/syncing.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
86 ctx->orig_atime = st.st_atime; |
7a57631e2d6c
Preserve mbox files' atime when saving/syncing.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
87 |
1039
793f05a7e50e
signed/unsigned/const pointer fixes
Timo Sirainen <tss@iki.fi>
parents:
1030
diff
changeset
|
88 *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
|
89 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
|
90 return 0; |
223
ca6967899c05
More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
91 |
1209
539b7336b68a
mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
92 if (lseek(fd, st.st_size-1, SEEK_SET) < 0) |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
93 return mbox_set_syscall_error(ctx->mbox, "lseek()"); |
223
ca6967899c05
More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
94 |
1209
539b7336b68a
mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
95 if (read(fd, &ch, 1) != 1) |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
96 return mbox_set_syscall_error(ctx->mbox, "read()"); |
223
ca6967899c05
More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
97 |
521
83da62e0675a
mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents:
492
diff
changeset
|
98 if (ch != '\n') { |
5281
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
99 if (write_full(fd, "\n", 1) < 0) |
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
100 return write_error(ctx); |
1015
40a327d356de
Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents:
988
diff
changeset
|
101 *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
|
102 } |
223
ca6967899c05
More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
103 |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
104 return 0; |
223
ca6967899c05
More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
105 } |
ca6967899c05
More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
106 |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
107 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
|
108 { |
5281
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
109 if (o_stream_send(ctx->output, "\n", 1) < 0) |
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
110 return write_error(ctx); |
266
757c32a1920d
expunging last message from mbox duplicated the whole file. appending mail
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
111 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
112 return 0; |
266
757c32a1920d
expunging last message from mbox duplicated the whole file. appending mail
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
113 } |
757c32a1920d
expunging last message from mbox duplicated the whole file. appending mail
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
114 |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
115 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
|
116 const char *from_envelope) |
22
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
117 { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6583
diff
changeset
|
118 const char *name; |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
119 int ret; |
22
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
120 |
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
121 if (*my_hostdomain == '\0') { |
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
122 struct hostent *hent; |
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
123 |
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
124 hent = gethostbyname(my_hostname); |
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
125 |
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
126 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
|
127 if (name == NULL) { |
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
128 /* failed, use just the hostname */ |
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
129 name = my_hostname; |
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
130 } |
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
131 |
6422
18173a52f721
Renamed strocpy() to i_strocpy().
Timo Sirainen <tss@iki.fi>
parents:
6411
diff
changeset
|
132 i_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
|
133 } |
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
134 |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6583
diff
changeset
|
135 T_FRAME( |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6583
diff
changeset
|
136 const char *line; |
22
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
137 |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6583
diff
changeset
|
138 if (from_envelope == NULL) { |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6583
diff
changeset
|
139 from_envelope = |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6583
diff
changeset
|
140 t_strconcat(ctx->mbox->storage->storage.user, |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6583
diff
changeset
|
141 "@", my_hostdomain, NULL); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6583
diff
changeset
|
142 } |
22
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
143 |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6583
diff
changeset
|
144 /* save in local timezone, no matter what it was given with */ |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6583
diff
changeset
|
145 line = mbox_from_create(from_envelope, received_date); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6583
diff
changeset
|
146 |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6583
diff
changeset
|
147 if ((ret = o_stream_send_str(ctx->output, line)) < 0) |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6583
diff
changeset
|
148 write_error(ctx); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6583
diff
changeset
|
149 ); |
314
d2a305fa0ec2
mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents:
305
diff
changeset
|
150 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
151 return ret; |
314
d2a305fa0ec2
mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents:
305
diff
changeset
|
152 } |
d2a305fa0ec2
mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents:
305
diff
changeset
|
153 |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
154 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
|
155 { |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
156 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
|
157 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
|
158 size_t len; |
1209
539b7336b68a
mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
159 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
160 if (ctx->mbox->mbox_writeonly) { |
2986
51a05fd00324
Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents:
2978
diff
changeset
|
161 /* 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
|
162 return 0; |
51a05fd00324
Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents:
2978
diff
changeset
|
163 } |
51a05fd00324
Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents:
2978
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 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
|
166 |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
167 /* 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
|
168 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
|
169 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
|
170 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
|
171 |
5281
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
172 /* flush manually here so that we don't confuse seek() errors with |
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
173 buffer flushing errors */ |
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
174 if (o_stream_flush(ctx->output) < 0) |
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
175 return write_error(ctx); |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
176 if (o_stream_seek(ctx->output, ctx->extra_hdr_offset + |
5281
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
177 ctx->space_end_idx - len) < 0) |
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
178 return mbox_set_syscall_error(ctx->mbox, "o_stream_seek()"); |
1209
539b7336b68a
mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
179 |
5281
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
180 if (o_stream_send(ctx->output, str, len) < 0 || |
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
181 o_stream_flush(ctx->output) < 0) |
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
182 return write_error(ctx); |
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
183 |
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
184 if (o_stream_seek(ctx->output, end_offset) < 0) |
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
185 return mbox_set_syscall_error(ctx->mbox, "o_stream_seek()"); |
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
186 return 0; |
1209
539b7336b68a
mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
187 } |
539b7336b68a
mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
188 |
2892
62d53b49110d
Changed mail_index_get_header() to return the header as return value because
Timo Sirainen <tss@iki.fi>
parents:
2877
diff
changeset
|
189 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
|
190 { |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
191 struct mbox_mailbox *mbox = (struct mbox_mailbox *)t->ictx.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
|
192 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
|
193 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
|
194 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
|
195 |
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
|
196 /* 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
|
197 synced the mailbox so we can get updated next_uid. */ |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
198 view = mail_index_view_open(mbox->ibox.index); |
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
|
199 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
|
200 |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
201 ctx->next_uid = hdr->next_uid; |
5592 | 202 ctx->first_saved_uid = ctx->next_uid; |
5124
e008f09dc3c9
When saving a message to an empty mbox file, write X-IMAPbase header so the
Timo Sirainen <tss@iki.fi>
parents:
4918
diff
changeset
|
203 ctx->uid_validity = hdr->uid_validity; |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
204 ctx->synced = TRUE; |
6511
fe5c19ffc119
Sync mbox when committing transaction only when saving messages to update
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
205 t->mails_saved = TRUE; |
5572
896845fbc4ed
Added mailbox_transaction_commit_get_uids() which returns the UID range for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
206 |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
207 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
|
208 } |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
209 |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
210 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
|
211 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
|
212 { |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
213 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
|
214 |
3250
3b820e59610e
Recent flag handling cleanups. Added some comments.
Timo Sirainen <tss@iki.fi>
parents:
3245
diff
changeset
|
215 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
|
216 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
|
217 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
|
218 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
|
219 } |
3250
3b820e59610e
Recent flag handling cleanups. Added some comments.
Timo Sirainen <tss@iki.fi>
parents:
3245
diff
changeset
|
220 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
|
221 } |
1209
539b7336b68a
mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
222 |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
223 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
|
224 { |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
225 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
|
226 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
|
227 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
|
228 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
|
229 } |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
230 |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
231 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
|
232 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
|
233 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
|
234 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
|
235 } |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
236 } |
1209
539b7336b68a
mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
237 |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
2986
diff
changeset
|
238 static void |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
2986
diff
changeset
|
239 mbox_save_append_keyword_headers(struct mbox_save_context *ctx, |
3086 | 240 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
|
241 { |
2273
c48822c8713f
Updated comment about how syncing is done, and s/extra space/padding/
Timo Sirainen <tss@iki.fi>
parents:
2261
diff
changeset
|
242 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
|
243 sizeof("Content-Length: \n")-1 + MAX_INT_STRLEN]; |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4412
diff
changeset
|
244 const ARRAY_TYPE(keywords) *keyword_names_list; |
3254
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3250
diff
changeset
|
245 const char *const *keyword_names; |
3262
f1134d265a9d
Don't crash while saving message if keywords aren't given..
Timo Sirainen <tss@iki.fi>
parents:
3260
diff
changeset
|
246 unsigned int i, count, keyword_names_count; |
3254
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3250
diff
changeset
|
247 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
248 keyword_names_list = mail_index_get_keywords(ctx->mbox->ibox.index); |
3254
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3250
diff
changeset
|
249 keyword_names = array_get(keyword_names_list, &keyword_names_count); |
1209
539b7336b68a
mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
250 |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
251 str_append(ctx->headers, "X-Keywords:"); |
3262
f1134d265a9d
Don't crash while saving message if keywords aren't given..
Timo Sirainen <tss@iki.fi>
parents:
3260
diff
changeset
|
252 count = keywords == NULL ? 0 : keywords->count; |
f1134d265a9d
Don't crash while saving message if keywords aren't given..
Timo Sirainen <tss@iki.fi>
parents:
3260
diff
changeset
|
253 for (i = 0; i < count; i++) { |
3254
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3250
diff
changeset
|
254 i_assert(keywords->idx[i] < keyword_names_count); |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3250
diff
changeset
|
255 |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
256 str_append_c(ctx->headers, ' '); |
3254
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3250
diff
changeset
|
257 str_append(ctx->headers, keyword_names[keywords->idx[i]]); |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3250
diff
changeset
|
258 } |
1209
539b7336b68a
mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
259 |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
260 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
|
261 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
|
262 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
|
263 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
|
264 } |
0 | 265 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
266 static int |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
267 mbox_save_init_file(struct mbox_save_context *ctx, |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3662
diff
changeset
|
268 struct mbox_transaction_context *t, bool want_mail) |
0 | 269 { |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
270 struct mbox_mailbox *mbox = ctx->mbox; |
5613 | 271 struct mail_storage *storage = &mbox->storage->storage; |
6583
104a8929ef7c
When saving to empty mbox files, sync them first since it doesn't take
Timo Sirainen <tss@iki.fi>
parents:
6562
diff
changeset
|
272 bool empty = FALSE; |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
273 int ret; |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
274 |
4193
a47df521d4fa
If mailbox was opened with readonly-flag, don't really force it. Fixes
Timo Sirainen <tss@iki.fi>
parents:
4070
diff
changeset
|
275 if (ctx->mbox->mbox_readonly) { |
5613 | 276 mail_storage_set_error(storage, MAIL_ERROR_PERM, |
3245
6491dab63e54
Added input stream parameter to mailbox_open(). With mbox it now allows
Timo Sirainen <tss@iki.fi>
parents:
3221
diff
changeset
|
277 "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
|
278 return -1; |
6491dab63e54
Added input stream parameter to mailbox_open(). With mbox it now allows
Timo Sirainen <tss@iki.fi>
parents:
3221
diff
changeset
|
279 } |
6491dab63e54
Added input stream parameter to mailbox_open(). With mbox it now allows
Timo Sirainen <tss@iki.fi>
parents:
3221
diff
changeset
|
280 |
5572
896845fbc4ed
Added mailbox_transaction_commit_get_uids() which returns the UID range for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
281 if ((t->ictx.flags & MAILBOX_TRANSACTION_FLAG_ASSIGN_UIDS) != 0) |
896845fbc4ed
Added mailbox_transaction_commit_get_uids() which returns the UID range for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
282 want_mail = TRUE; |
896845fbc4ed
Added mailbox_transaction_commit_get_uids() which returns the UID range for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
283 |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
284 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
|
285 /* first appended mail in this transaction */ |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
286 if (mbox->mbox_lock_type != F_WRLCK) { |
3662
247501e81026
Instead of crashing when trying to copy mails within same mailbox, give an
Timo Sirainen <tss@iki.fi>
parents:
3565
diff
changeset
|
287 if (mbox->mbox_lock_type == F_RDLCK) { |
247501e81026
Instead of crashing when trying to copy mails within same mailbox, give an
Timo Sirainen <tss@iki.fi>
parents:
3565
diff
changeset
|
288 /* FIXME: we shouldn't fail here. it's just |
247501e81026
Instead of crashing when trying to copy mails within same mailbox, give an
Timo Sirainen <tss@iki.fi>
parents:
3565
diff
changeset
|
289 a locking issue that should be possible to |
247501e81026
Instead of crashing when trying to copy mails within same mailbox, give an
Timo Sirainen <tss@iki.fi>
parents:
3565
diff
changeset
|
290 fix.. */ |
5613 | 291 mail_storage_set_error(storage, |
292 MAIL_ERROR_NOTPOSSIBLE, | |
3662
247501e81026
Instead of crashing when trying to copy mails within same mailbox, give an
Timo Sirainen <tss@iki.fi>
parents:
3565
diff
changeset
|
293 "Can't copy mails inside same mailbox"); |
247501e81026
Instead of crashing when trying to copy mails within same mailbox, give an
Timo Sirainen <tss@iki.fi>
parents:
3565
diff
changeset
|
294 return -1; |
247501e81026
Instead of crashing when trying to copy mails within same mailbox, give an
Timo Sirainen <tss@iki.fi>
parents:
3565
diff
changeset
|
295 } |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
296 if (mbox_lock(mbox, F_WRLCK, &t->mbox_lock_id) <= 0) |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
297 return -1; |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
298 } |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
299 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
300 if (mbox->mbox_fd == -1) { |
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
301 if (mbox_file_open(mbox) < 0) |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
302 return -1; |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
303 } |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
304 |
5240
117c9fd0b633
Keep track of the mbox dirty state better. Also when moving mails inside
Timo Sirainen <tss@iki.fi>
parents:
5168
diff
changeset
|
305 /* update mbox_sync_dirty state */ |
6583
104a8929ef7c
When saving to empty mbox files, sync them first since it doesn't take
Timo Sirainen <tss@iki.fi>
parents:
6562
diff
changeset
|
306 ret = mbox_sync_has_changed_full(mbox, TRUE, &empty); |
5240
117c9fd0b633
Keep track of the mbox dirty state better. Also when moving mails inside
Timo Sirainen <tss@iki.fi>
parents:
5168
diff
changeset
|
307 if (ret < 0) |
117c9fd0b633
Keep track of the mbox dirty state better. Also when moving mails inside
Timo Sirainen <tss@iki.fi>
parents:
5168
diff
changeset
|
308 return -1; |
117c9fd0b633
Keep track of the mbox dirty state better. Also when moving mails inside
Timo Sirainen <tss@iki.fi>
parents:
5168
diff
changeset
|
309 if (!want_mail && ret == 0) { |
117c9fd0b633
Keep track of the mbox dirty state better. Also when moving mails inside
Timo Sirainen <tss@iki.fi>
parents:
5168
diff
changeset
|
310 /* we're not required to assign UIDs for the appended |
117c9fd0b633
Keep track of the mbox dirty state better. Also when moving mails inside
Timo Sirainen <tss@iki.fi>
parents:
5168
diff
changeset
|
311 mails immediately. do it only if it doesn't require |
117c9fd0b633
Keep track of the mbox dirty state better. Also when moving mails inside
Timo Sirainen <tss@iki.fi>
parents:
5168
diff
changeset
|
312 syncing. */ |
117c9fd0b633
Keep track of the mbox dirty state better. Also when moving mails inside
Timo Sirainen <tss@iki.fi>
parents:
5168
diff
changeset
|
313 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
|
314 } |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
315 } |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
316 |
6583
104a8929ef7c
When saving to empty mbox files, sync them first since it doesn't take
Timo Sirainen <tss@iki.fi>
parents:
6562
diff
changeset
|
317 if (!ctx->synced && (want_mail || empty)) { |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
318 /* we'll need to assign UID for the mail immediately. */ |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
319 if (mbox_sync(mbox, 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
|
320 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
|
321 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
|
322 } |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
323 |
5581
ee2f0f1cd700
If we synced the mbox while saving the message (happens only with quota
Timo Sirainen <tss@iki.fi>
parents:
5580
diff
changeset
|
324 /* the syncing above could have changed the append offset */ |
ee2f0f1cd700
If we synced the mbox while saving the message (happens only with quota
Timo Sirainen <tss@iki.fi>
parents:
5580
diff
changeset
|
325 if (ctx->append_offset == (uoff_t)-1) { |
ee2f0f1cd700
If we synced the mbox while saving the message (happens only with quota
Timo Sirainen <tss@iki.fi>
parents:
5580
diff
changeset
|
326 if (mbox_seek_to_end(ctx, &ctx->append_offset) < 0) |
ee2f0f1cd700
If we synced the mbox while saving the message (happens only with quota
Timo Sirainen <tss@iki.fi>
parents:
5580
diff
changeset
|
327 return -1; |
ee2f0f1cd700
If we synced the mbox while saving the message (happens only with quota
Timo Sirainen <tss@iki.fi>
parents:
5580
diff
changeset
|
328 |
6161
c62f7ee79446
Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
329 ctx->output = o_stream_create_fd_file(mbox->mbox_fd, |
c62f7ee79446
Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
330 ctx->append_offset, |
c62f7ee79446
Split o_stream_create_file() to _create_fd() and _create_fd_file().
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
331 FALSE); |
5581
ee2f0f1cd700
If we synced the mbox while saving the message (happens only with quota
Timo Sirainen <tss@iki.fi>
parents:
5580
diff
changeset
|
332 } |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
333 return 0; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
334 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
335 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
336 static void save_header_callback(struct message_header_line *hdr, |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4681
diff
changeset
|
337 bool *matched, struct mbox_save_context *ctx) |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
338 { |
4681
cc110cb8c56b
Filter out "From " lines from headers. There's no reason they should exist
Timo Sirainen <tss@iki.fi>
parents:
4562
diff
changeset
|
339 if (hdr != NULL) { |
cc110cb8c56b
Filter out "From " lines from headers. There's no reason they should exist
Timo Sirainen <tss@iki.fi>
parents:
4562
diff
changeset
|
340 if (strncmp(hdr->name, "From ", 5) == 0) { |
cc110cb8c56b
Filter out "From " lines from headers. There's no reason they should exist
Timo Sirainen <tss@iki.fi>
parents:
4562
diff
changeset
|
341 /* we can't allow From_-lines in headers. there's no |
cc110cb8c56b
Filter out "From " lines from headers. There's no reason they should exist
Timo Sirainen <tss@iki.fi>
parents:
4562
diff
changeset
|
342 legitimate reason for allowing them in any case, |
cc110cb8c56b
Filter out "From " lines from headers. There's no reason they should exist
Timo Sirainen <tss@iki.fi>
parents:
4562
diff
changeset
|
343 so just drop them. */ |
cc110cb8c56b
Filter out "From " lines from headers. There's no reason they should exist
Timo Sirainen <tss@iki.fi>
parents:
4562
diff
changeset
|
344 *matched = TRUE; |
cc110cb8c56b
Filter out "From " lines from headers. There's no reason they should exist
Timo Sirainen <tss@iki.fi>
parents:
4562
diff
changeset
|
345 return; |
cc110cb8c56b
Filter out "From " lines from headers. There's no reason they should exist
Timo Sirainen <tss@iki.fi>
parents:
4562
diff
changeset
|
346 } |
cc110cb8c56b
Filter out "From " lines from headers. There's no reason they should exist
Timo Sirainen <tss@iki.fi>
parents:
4562
diff
changeset
|
347 |
cc110cb8c56b
Filter out "From " lines from headers. There's no reason they should exist
Timo Sirainen <tss@iki.fi>
parents:
4562
diff
changeset
|
348 if (!*matched && ctx->mbox_md5_ctx != NULL) |
cc110cb8c56b
Filter out "From " lines from headers. There's no reason they should exist
Timo Sirainen <tss@iki.fi>
parents:
4562
diff
changeset
|
349 mbox_md5_continue(ctx->mbox_md5_ctx, hdr); |
cc110cb8c56b
Filter out "From " lines from headers. There's no reason they should exist
Timo Sirainen <tss@iki.fi>
parents:
4562
diff
changeset
|
350 } |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
351 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
352 |
5167
b11b55f8912a
If pop3_uidl_format=%m, add a unique X-Delivery-ID header to all saved
Timo Sirainen <tss@iki.fi>
parents:
5124
diff
changeset
|
353 static void mbox_save_x_delivery_id(struct mbox_save_context *ctx) |
b11b55f8912a
If pop3_uidl_format=%m, add a unique X-Delivery-ID header to all saved
Timo Sirainen <tss@iki.fi>
parents:
5124
diff
changeset
|
354 { |
b11b55f8912a
If pop3_uidl_format=%m, add a unique X-Delivery-ID header to all saved
Timo Sirainen <tss@iki.fi>
parents:
5124
diff
changeset
|
355 unsigned char md5_result[MD5_RESULTLEN]; |
b11b55f8912a
If pop3_uidl_format=%m, add a unique X-Delivery-ID header to all saved
Timo Sirainen <tss@iki.fi>
parents:
5124
diff
changeset
|
356 buffer_t *buf; |
6562
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
357 string_t *str; |
5167
b11b55f8912a
If pop3_uidl_format=%m, add a unique X-Delivery-ID header to all saved
Timo Sirainen <tss@iki.fi>
parents:
5124
diff
changeset
|
358 void *randbuf; |
b11b55f8912a
If pop3_uidl_format=%m, add a unique X-Delivery-ID header to all saved
Timo Sirainen <tss@iki.fi>
parents:
5124
diff
changeset
|
359 |
b11b55f8912a
If pop3_uidl_format=%m, add a unique X-Delivery-ID header to all saved
Timo Sirainen <tss@iki.fi>
parents:
5124
diff
changeset
|
360 buf = buffer_create_dynamic(pool_datastack_create(), 256); |
b11b55f8912a
If pop3_uidl_format=%m, add a unique X-Delivery-ID header to all saved
Timo Sirainen <tss@iki.fi>
parents:
5124
diff
changeset
|
361 buffer_append(buf, &ioloop_time, sizeof(ioloop_time)); |
b11b55f8912a
If pop3_uidl_format=%m, add a unique X-Delivery-ID header to all saved
Timo Sirainen <tss@iki.fi>
parents:
5124
diff
changeset
|
362 buffer_append(buf, &ioloop_timeval.tv_usec, |
b11b55f8912a
If pop3_uidl_format=%m, add a unique X-Delivery-ID header to all saved
Timo Sirainen <tss@iki.fi>
parents:
5124
diff
changeset
|
363 sizeof(ioloop_timeval.tv_usec)); |
b11b55f8912a
If pop3_uidl_format=%m, add a unique X-Delivery-ID header to all saved
Timo Sirainen <tss@iki.fi>
parents:
5124
diff
changeset
|
364 |
b11b55f8912a
If pop3_uidl_format=%m, add a unique X-Delivery-ID header to all saved
Timo Sirainen <tss@iki.fi>
parents:
5124
diff
changeset
|
365 randbuf = buffer_append_space_unsafe(buf, MBOX_DELIVERY_ID_RAND_BYTES); |
b11b55f8912a
If pop3_uidl_format=%m, add a unique X-Delivery-ID header to all saved
Timo Sirainen <tss@iki.fi>
parents:
5124
diff
changeset
|
366 random_fill_weak(randbuf, MBOX_DELIVERY_ID_RAND_BYTES); |
b11b55f8912a
If pop3_uidl_format=%m, add a unique X-Delivery-ID header to all saved
Timo Sirainen <tss@iki.fi>
parents:
5124
diff
changeset
|
367 |
b11b55f8912a
If pop3_uidl_format=%m, add a unique X-Delivery-ID header to all saved
Timo Sirainen <tss@iki.fi>
parents:
5124
diff
changeset
|
368 md5_get_digest(buf->data, buf->used, md5_result); |
b11b55f8912a
If pop3_uidl_format=%m, add a unique X-Delivery-ID header to all saved
Timo Sirainen <tss@iki.fi>
parents:
5124
diff
changeset
|
369 |
6562
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
370 str = t_str_new(128); |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
371 str_append(str, "X-Delivery-ID: "); |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
372 base64_encode(md5_result, sizeof(md5_result), str); |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
373 str_append_c(str, '\n'); |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
374 |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
375 ctx->x_delivery_id_header = i_strdup(str_c(str)); |
5167
b11b55f8912a
If pop3_uidl_format=%m, add a unique X-Delivery-ID header to all saved
Timo Sirainen <tss@iki.fi>
parents:
5124
diff
changeset
|
376 } |
b11b55f8912a
If pop3_uidl_format=%m, add a unique X-Delivery-ID header to all saved
Timo Sirainen <tss@iki.fi>
parents:
5124
diff
changeset
|
377 |
6562
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
378 static struct istream * |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
379 mbox_save_get_input_stream(struct mbox_save_context *ctx, struct istream *input) |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
380 { |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
381 struct istream *filter, *ret, *cache_input, *streams[3]; |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
382 |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
383 /* filter out unwanted headers and keep track of headers' MD5 sum */ |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
384 filter = i_stream_create_header_filter(input, HEADER_FILTER_EXCLUDE | |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
385 HEADER_FILTER_NO_CR, |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
386 mbox_save_drop_headers, |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
387 mbox_save_drop_headers_count, |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
388 save_header_callback, ctx); |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
389 |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
390 if ((ctx->mbox->storage->storage.flags & |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
391 MAIL_STORAGE_FLAG_KEEP_HEADER_MD5) != 0) { |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
392 /* we're using MD5 sums to generate POP3 UIDLs. |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
393 clients don't like it much if there are duplicates, |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
394 so make sure that there can't be any by appending |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
395 our own X-Delivery-ID header. */ |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
396 const char *hdr; |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
397 |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6583
diff
changeset
|
398 T_FRAME( |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6583
diff
changeset
|
399 mbox_save_x_delivery_id(ctx); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6583
diff
changeset
|
400 ); |
6562
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
401 hdr = ctx->x_delivery_id_header; |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
402 |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
403 streams[0] = i_stream_create_from_data(hdr, strlen(hdr)); |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
404 streams[1] = filter; |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
405 streams[2] = NULL; |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
406 ret = i_stream_create_concat(streams); |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
407 i_stream_unref(&filter); |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
408 filter = ret; |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
409 } |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
410 |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
411 /* convert linefeeds to wanted format */ |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
412 ret = (ctx->mbox->storage->storage.flags & |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
413 MAIL_STORAGE_FLAG_SAVE_CRLF) != 0 ? |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
414 i_stream_create_crlf(filter) : i_stream_create_lf(filter); |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
415 i_stream_unref(&filter); |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
416 |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
417 if (ctx->mail != NULL) { |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
418 /* caching creates a tee stream */ |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
419 cache_input = index_mail_cache_parse_init(ctx->mail, ret); |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
420 i_stream_unref(&ret); |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
421 ret = cache_input; |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
422 } |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
423 return ret; |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
424 } |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
425 |
4044
da1d65e064f8
mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3879
diff
changeset
|
426 int mbox_save_init(struct mailbox_transaction_context *_t, |
da1d65e064f8
mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3879
diff
changeset
|
427 enum mail_flags flags, struct mail_keywords *keywords, |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
6339
diff
changeset
|
428 time_t received_date, int timezone_offset ATTR_UNUSED, |
4044
da1d65e064f8
mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3879
diff
changeset
|
429 const char *from_envelope, struct istream *input, |
4268
7112aad504ae
Changed mailbox_save_*() API a bit: Moved the struct mail *dest_mail to
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4193
diff
changeset
|
430 struct mail *dest_mail, struct mail_save_context **ctx_r) |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
431 { |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
432 struct mbox_transaction_context *t = |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
433 (struct mbox_transaction_context *)_t; |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
434 struct mbox_mailbox *mbox = (struct mbox_mailbox *)t->ictx.ibox; |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
435 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
|
436 enum mail_flags save_flags; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
437 uint64_t offset; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
438 |
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
|
439 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
|
440 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
441 /* 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
|
442 if (received_date == (time_t)-1) |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
443 received_date = ioloop_time; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
444 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
445 if (ctx == NULL) { |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
446 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
|
447 ctx->ctx.transaction = &t->ictx.mailbox_ctx; |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
448 ctx->mbox = mbox; |
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
|
449 ctx->trans = t->ictx.trans; |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
450 ctx->append_offset = (uoff_t)-1; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
451 ctx->headers = str_new(default_pool, 512); |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
452 ctx->mail_offset = (uoff_t)-1; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
453 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
454 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
455 ctx->failed = FALSE; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
456 ctx->seq = 0; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
457 |
4268
7112aad504ae
Changed mailbox_save_*() API a bit: Moved the struct mail *dest_mail to
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4193
diff
changeset
|
458 if (mbox_save_init_file(ctx, t, dest_mail != NULL) < 0) { |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
459 ctx->failed = TRUE; |
4044
da1d65e064f8
mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3879
diff
changeset
|
460 return -1; |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
461 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
462 |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
2986
diff
changeset
|
463 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
|
464 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
|
465 if (ctx->synced) { |
5580
071d9bc5a075
If pop3_uidl_format=%m, it wasn't cached correctly when saving new messages
Timo Sirainen <tss@iki.fi>
parents:
5573
diff
changeset
|
466 if (ctx->mbox->mbox_save_md5) |
071d9bc5a075
If pop3_uidl_format=%m, it wasn't cached correctly when saving new messages
Timo Sirainen <tss@iki.fi>
parents:
5573
diff
changeset
|
467 ctx->mbox_md5_ctx = mbox_md5_init(); |
5124
e008f09dc3c9
When saving a message to an empty mbox file, write X-IMAPbase header so the
Timo Sirainen <tss@iki.fi>
parents:
4918
diff
changeset
|
468 if (ctx->output->offset == 0) { |
e008f09dc3c9
When saving a message to an empty mbox file, write X-IMAPbase header so the
Timo Sirainen <tss@iki.fi>
parents:
4918
diff
changeset
|
469 /* writing the first mail. Insert X-IMAPbase as well. */ |
e008f09dc3c9
When saving a message to an empty mbox file, write X-IMAPbase header so the
Timo Sirainen <tss@iki.fi>
parents:
4918
diff
changeset
|
470 str_printfa(ctx->headers, "X-IMAPbase: %u %010u\n", |
e008f09dc3c9
When saving a message to an empty mbox file, write X-IMAPbase header so the
Timo Sirainen <tss@iki.fi>
parents:
4918
diff
changeset
|
471 ctx->uid_validity, ctx->next_uid); |
e008f09dc3c9
When saving a message to an empty mbox file, write X-IMAPbase header so the
Timo Sirainen <tss@iki.fi>
parents:
4918
diff
changeset
|
472 } |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
473 str_printfa(ctx->headers, "X-UID: %u\n", ctx->next_uid); |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
474 if (!mbox->ibox.keep_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
|
475 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
|
476 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
477 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
|
478 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
|
479 save_flags); |
3471
138e242c53c9
Keywords weren't saved to index while saving.
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
480 if (keywords != NULL) { |
138e242c53c9
Keywords weren't saved to index while saving.
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
481 mail_index_update_keywords(ctx->trans, ctx->seq, |
138e242c53c9
Keywords weren't saved to index while saving.
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
482 MODIFY_REPLACE, keywords); |
138e242c53c9
Keywords weren't saved to index while saving.
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
483 } |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
484 |
2261
ba4f6d7b5a58
saving messages to empty mbox was buggy
Timo Sirainen <tss@iki.fi>
parents:
2224
diff
changeset
|
485 offset = ctx->output->offset == 0 ? 0 : |
ba4f6d7b5a58
saving messages to empty mbox was buggy
Timo Sirainen <tss@iki.fi>
parents:
2224
diff
changeset
|
486 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
|
487 mail_index_update_ext(ctx->trans, ctx->seq, |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
488 mbox->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
|
489 ctx->next_uid++; |
3464
0661239a7034
Cache mail headers when saving mails to mbox. We should cache everything,
Timo Sirainen <tss@iki.fi>
parents:
3348
diff
changeset
|
490 |
3471
138e242c53c9
Keywords weren't saved to index while saving.
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
491 /* parse and cache the mail headers as we read it */ |
4268
7112aad504ae
Changed mailbox_save_*() API a bit: Moved the struct mail *dest_mail to
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4193
diff
changeset
|
492 if (dest_mail == NULL) { |
7112aad504ae
Changed mailbox_save_*() API a bit: Moved the struct mail *dest_mail to
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4193
diff
changeset
|
493 if (ctx->mail == NULL) |
6302
a8d5d826318b
Call mail_alloc/mail_free, not index_mail_alloc/index_mail/free directly.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
494 ctx->mail = mail_alloc(_t, 0, NULL); |
4268
7112aad504ae
Changed mailbox_save_*() API a bit: Moved the struct mail *dest_mail to
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4193
diff
changeset
|
495 dest_mail = ctx->mail; |
7112aad504ae
Changed mailbox_save_*() API a bit: Moved the struct mail *dest_mail to
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4193
diff
changeset
|
496 } |
6277
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6267
diff
changeset
|
497 mail_set_seq(dest_mail, ctx->seq); |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
498 } |
3250
3b820e59610e
Recent flag handling cleanups. Added some comments.
Timo Sirainen <tss@iki.fi>
parents:
3245
diff
changeset
|
499 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
|
500 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
|
501 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
|
502 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
503 i_assert(mbox->mbox_lock_type == F_WRLCK); |
0 | 504 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
505 ctx->mail_offset = ctx->output->offset; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
506 ctx->eoh_offset = (uoff_t)-1; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
507 ctx->last_char = '\n'; |
6265
0ee2b0691f3e
Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents:
6161
diff
changeset
|
508 ctx->received_date = received_date; |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
509 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
510 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
|
511 ctx->failed = TRUE; |
6562
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
512 else |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
513 ctx->input = mbox_save_get_input_stream(ctx, input); |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
514 |
4044
da1d65e064f8
mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3879
diff
changeset
|
515 *ctx_r = &ctx->ctx; |
da1d65e064f8
mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3879
diff
changeset
|
516 return ctx->failed ? -1 : 0; |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
517 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
518 |
6556 | 519 static int mbox_save_body_input(struct mbox_save_context *ctx) |
520 { | |
521 const unsigned char *data; | |
522 size_t size; | |
523 | |
524 data = i_stream_get_data(ctx->input, &size); | |
6562
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
525 if (size > 0) { |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
526 if (o_stream_send(ctx->output, data, size) < 0) |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
527 return write_error(ctx); |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
528 ctx->last_char = data[size-1]; |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
529 i_stream_skip(ctx->input, size); |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
530 } |
6556 | 531 return 0; |
532 } | |
533 | |
534 static int mbox_save_body(struct mbox_save_context *ctx) | |
535 { | |
536 ssize_t ret; | |
537 | |
538 while ((ret = i_stream_read(ctx->input)) != -1) { | |
539 if (ctx->mail != NULL) { | |
540 /* i_stream_read() may have returned 0 at EOF | |
541 because of this parser */ | |
542 index_mail_cache_parse_continue(ctx->mail); | |
543 } | |
544 if (ret == 0) | |
545 return 0; | |
546 | |
547 if (mbox_save_body_input(ctx) < 0) | |
548 return -1; | |
549 } | |
550 | |
551 if (ctx->last_char != '\n') { | |
552 /* if mail doesn't end with LF, we'll do that. | |
553 otherwise some mbox parsers don't like the result. | |
554 this makes it impossible to save a mail that doesn't | |
555 end with LF though. */ | |
556 const char *linefeed = | |
557 (ctx->mbox->storage->storage.flags & | |
558 MAIL_STORAGE_FLAG_SAVE_CRLF) != 0 ? | |
559 "\r\n" : "\n"; | |
560 if (o_stream_send_str(ctx->output, linefeed) < 0) | |
561 return write_error(ctx); | |
562 } | |
563 return 0; | |
564 } | |
565 | |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
566 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
|
567 { |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
568 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
|
569 const unsigned char *data; |
6339 | 570 size_t i, size; |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
571 ssize_t ret; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
572 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
573 if (ctx->failed) |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
574 return -1; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
575 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
576 if (ctx->eoh_offset != (uoff_t)-1) { |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
577 /* writing body */ |
6556 | 578 return mbox_save_body(ctx); |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
579 } |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
580 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
581 while ((ret = i_stream_read(ctx->input)) != -1) { |
6337 | 582 if (ctx->mail != NULL) |
583 index_mail_cache_parse_continue(ctx->mail); | |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
584 if (ret == 0) |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
585 return 0; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
586 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
587 data = i_stream_get_data(ctx->input, &size); |
6339 | 588 for (i = 0; i < size; i++) { |
589 if (data[i] == '\n' && | |
590 ((i == 0 && ctx->last_char == '\n') || | |
591 (i > 0 && data[i-1] == '\n'))) { | |
592 /* end of headers. we don't need to worry about | |
593 CRs because they're dropped */ | |
594 break; | |
595 } | |
596 } | |
597 if (i != size) { | |
598 /* found end of headers. write the rest of them | |
599 (not including the finishing empty line) */ | |
600 if (o_stream_send(ctx->output, data, i) < 0) | |
5281
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
601 return write_error(ctx); |
6339 | 602 ctx->last_char = '\n'; |
603 i_stream_skip(ctx->input, i + 1); | |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
604 break; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
605 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
606 |
5281
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
607 if (o_stream_send(ctx->output, data, size) < 0) |
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
608 return write_error(ctx); |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
609 ctx->last_char = data[size-1]; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
610 i_stream_skip(ctx->input, size); |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
611 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
612 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
613 if (ctx->last_char != '\n') { |
5281
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
614 if (o_stream_send(ctx->output, "\n", 1) < 0) |
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
615 return write_error(ctx); |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
616 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
617 |
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
|
618 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
|
619 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
|
620 |
6562
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
621 if (ctx->x_delivery_id_header != NULL) { |
5580
071d9bc5a075
If pop3_uidl_format=%m, it wasn't cached correctly when saving new messages
Timo Sirainen <tss@iki.fi>
parents:
5573
diff
changeset
|
622 struct message_header_line hdr; |
071d9bc5a075
If pop3_uidl_format=%m, it wasn't cached correctly when saving new messages
Timo Sirainen <tss@iki.fi>
parents:
5573
diff
changeset
|
623 |
071d9bc5a075
If pop3_uidl_format=%m, it wasn't cached correctly when saving new messages
Timo Sirainen <tss@iki.fi>
parents:
5573
diff
changeset
|
624 memset(&hdr, 0, sizeof(hdr)); |
6562
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
625 hdr.name = ctx->x_delivery_id_header; |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
626 hdr.name_len = sizeof("X-Delivery-ID")-1; |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
627 hdr.middle = (const unsigned char *)hdr.name + |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
628 hdr.name_len; |
5580
071d9bc5a075
If pop3_uidl_format=%m, it wasn't cached correctly when saving new messages
Timo Sirainen <tss@iki.fi>
parents:
5573
diff
changeset
|
629 hdr.middle_len = 2; |
6562
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
630 hdr.value = hdr.full_value = |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
631 hdr.middle + hdr.middle_len; |
8917cf7fa8ba
More fixes to handling mail saving.
Timo Sirainen <tss@iki.fi>
parents:
6556
diff
changeset
|
632 hdr.value_len = strlen((const char *)hdr.value); |
5580
071d9bc5a075
If pop3_uidl_format=%m, it wasn't cached correctly when saving new messages
Timo Sirainen <tss@iki.fi>
parents:
5573
diff
changeset
|
633 mbox_md5_continue(ctx->mbox_md5_ctx, &hdr); |
071d9bc5a075
If pop3_uidl_format=%m, it wasn't cached correctly when saving new messages
Timo Sirainen <tss@iki.fi>
parents:
5573
diff
changeset
|
634 } |
2973
32cc9186d8eb
If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents:
2892
diff
changeset
|
635 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
|
636 mail_index_update_ext(ctx->trans, ctx->seq, |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
637 ctx->mbox->ibox.md5hdr_ext_idx, |
2973
32cc9186d8eb
If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents:
2892
diff
changeset
|
638 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
|
639 } |
32cc9186d8eb
If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents:
2892
diff
changeset
|
640 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
641 /* 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
|
642 ctx->extra_hdr_offset = ctx->output->offset; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
643 if (o_stream_send(ctx->output, str_data(ctx->headers), |
5281
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
644 str_len(ctx->headers)) < 0) |
2712ba108fba
o_stream_seek() may do buffer flushing internally and cause errors. Do
Timo Sirainen <tss@iki.fi>
parents:
5240
diff
changeset
|
645 return write_error(ctx); |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
646 ctx->eoh_offset = ctx->output->offset; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
647 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
648 /* write body */ |
6556 | 649 if (mbox_save_body_input(ctx) < 0) |
650 return -1; | |
651 return ctx->input->eof ? 0 : mbox_save_body(ctx); | |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
652 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
653 |
4268
7112aad504ae
Changed mailbox_save_*() API a bit: Moved the struct mail *dest_mail to
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4193
diff
changeset
|
654 int mbox_save_finish(struct mail_save_context *_ctx) |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
655 { |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
656 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
|
657 |
4044
da1d65e064f8
mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3879
diff
changeset
|
658 ctx->finished = TRUE; |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
659 if (!ctx->failed) { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6583
diff
changeset
|
660 T_FRAME( |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6583
diff
changeset
|
661 if (mbox_write_content_length(ctx) < 0 || |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6583
diff
changeset
|
662 mbox_append_lf(ctx) < 0) |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6583
diff
changeset
|
663 ctx->failed = TRUE; |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6583
diff
changeset
|
664 ); |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
665 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
666 |
6104
a019240a9df1
Cache everything interesting while saving a message.
Timo Sirainen <tss@iki.fi>
parents:
5741
diff
changeset
|
667 if (ctx->mail != NULL) |
6265
0ee2b0691f3e
Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents:
6161
diff
changeset
|
668 index_mail_cache_parse_deinit(ctx->mail, ctx->received_date); |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
669 if (ctx->input != NULL) |
4070
71b8faa84ec6
Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents:
4044
diff
changeset
|
670 i_stream_destroy(&ctx->input); |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
671 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
672 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
|
673 /* saving this mail failed - truncate back to beginning of it */ |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
674 if (ftruncate(ctx->mbox->mbox_fd, (off_t)ctx->mail_offset) < 0) |
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
675 mbox_set_syscall_error(ctx->mbox, "ftruncate()"); |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
676 ctx->mail_offset = (uoff_t)-1; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
677 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
678 |
4268
7112aad504ae
Changed mailbox_save_*() API a bit: Moved the struct mail *dest_mail to
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4193
diff
changeset
|
679 return ctx->failed ? -1 : 0; |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
680 } |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
681 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
682 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
|
683 { |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
684 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
|
685 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
686 ctx->failed = TRUE; |
4268
7112aad504ae
Changed mailbox_save_*() API a bit: Moved the struct mail *dest_mail to
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4193
diff
changeset
|
687 (void)mbox_save_finish(_ctx); |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
688 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
689 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
690 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
|
691 { |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
692 if (ctx->output != NULL) |
4070
71b8faa84ec6
Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents:
4044
diff
changeset
|
693 o_stream_destroy(&ctx->output); |
3464
0661239a7034
Cache mail headers when saving mails to mbox. We should cache everything,
Timo Sirainen <tss@iki.fi>
parents:
3348
diff
changeset
|
694 if (ctx->mail != NULL) |
6302
a8d5d826318b
Call mail_alloc/mail_free, not index_mail_alloc/index_mail/free directly.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
695 mail_free(&ctx->mail); |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
696 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
|
697 i_free(ctx); |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
698 } |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
699 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
700 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
|
701 { |
5572
896845fbc4ed
Added mailbox_transaction_commit_get_uids() which returns the UID range for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
702 struct mbox_transaction_context *t = |
896845fbc4ed
Added mailbox_transaction_commit_get_uids() which returns the UID range for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
703 (struct mbox_transaction_context *)ctx->ctx.transaction; |
4562
8b9933470cf8
After saving a mail with index being in synced state, update the sync_stamp
Timo Sirainen <tss@iki.fi>
parents:
4527
diff
changeset
|
704 struct stat st; |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
705 int ret = 0; |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
706 |
4044
da1d65e064f8
mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3879
diff
changeset
|
707 i_assert(ctx->finished); |
da1d65e064f8
mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3879
diff
changeset
|
708 |
5741
7a57631e2d6c
Preserve mbox files' atime when saving/syncing.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
709 if (fstat(ctx->mbox->mbox_fd, &st) < 0) { |
7a57631e2d6c
Preserve mbox files' atime when saving/syncing.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
710 mbox_set_syscall_error(ctx->mbox, "fstat()"); |
7a57631e2d6c
Preserve mbox files' atime when saving/syncing.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
711 ret = -1; |
7a57631e2d6c
Preserve mbox files' atime when saving/syncing.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
712 } |
7a57631e2d6c
Preserve mbox files' atime when saving/syncing.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
713 |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
714 if (ctx->synced) { |
6267
3a1eed408cad
mailbox_transaction_commit_get_uids() now returns also UIDVALIDITY. It's the
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
715 *t->ictx.saved_uid_validity = ctx->uid_validity; |
5592 | 716 *t->ictx.first_saved_uid = ctx->first_saved_uid; |
717 | |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
718 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
|
719 offsetof(struct mail_index_header, next_uid), |
3322
49071cc19102
If UIDVALIDITY changes, don't invalidate the whole index. Just expunge all
Timo Sirainen <tss@iki.fi>
parents:
3280
diff
changeset
|
720 &ctx->next_uid, sizeof(ctx->next_uid), FALSE); |
4562
8b9933470cf8
After saving a mail with index being in synced state, update the sync_stamp
Timo Sirainen <tss@iki.fi>
parents:
4527
diff
changeset
|
721 |
5741
7a57631e2d6c
Preserve mbox files' atime when saving/syncing.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
722 if (!ctx->mbox->mbox_sync_dirty && ret == 0) { |
4562
8b9933470cf8
After saving a mail with index being in synced state, update the sync_stamp
Timo Sirainen <tss@iki.fi>
parents:
4527
diff
changeset
|
723 uint32_t sync_stamp = st.st_mtime; |
8b9933470cf8
After saving a mail with index being in synced state, update the sync_stamp
Timo Sirainen <tss@iki.fi>
parents:
4527
diff
changeset
|
724 uint64_t sync_size = st.st_size; |
8b9933470cf8
After saving a mail with index being in synced state, update the sync_stamp
Timo Sirainen <tss@iki.fi>
parents:
4527
diff
changeset
|
725 |
8b9933470cf8
After saving a mail with index being in synced state, update the sync_stamp
Timo Sirainen <tss@iki.fi>
parents:
4527
diff
changeset
|
726 mail_index_update_header(ctx->trans, |
8b9933470cf8
After saving a mail with index being in synced state, update the sync_stamp
Timo Sirainen <tss@iki.fi>
parents:
4527
diff
changeset
|
727 offsetof(struct mail_index_header, sync_stamp), |
8b9933470cf8
After saving a mail with index being in synced state, update the sync_stamp
Timo Sirainen <tss@iki.fi>
parents:
4527
diff
changeset
|
728 &sync_stamp, sizeof(sync_stamp), TRUE); |
8b9933470cf8
After saving a mail with index being in synced state, update the sync_stamp
Timo Sirainen <tss@iki.fi>
parents:
4527
diff
changeset
|
729 mail_index_update_header(ctx->trans, |
8b9933470cf8
After saving a mail with index being in synced state, update the sync_stamp
Timo Sirainen <tss@iki.fi>
parents:
4527
diff
changeset
|
730 offsetof(struct mail_index_header, sync_size), |
8b9933470cf8
After saving a mail with index being in synced state, update the sync_stamp
Timo Sirainen <tss@iki.fi>
parents:
4527
diff
changeset
|
731 &sync_size, sizeof(sync_size), TRUE); |
8b9933470cf8
After saving a mail with index being in synced state, update the sync_stamp
Timo Sirainen <tss@iki.fi>
parents:
4527
diff
changeset
|
732 } |
5572
896845fbc4ed
Added mailbox_transaction_commit_get_uids() which returns the UID range for
Timo Sirainen <tss@iki.fi>
parents:
5459
diff
changeset
|
733 |
5573
9805becea644
Fixed mailbox_transaction_commit_get_uids() to actually work and not just
Timo Sirainen <tss@iki.fi>
parents:
5572
diff
changeset
|
734 *t->ictx.last_saved_uid = ctx->next_uid - 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
|
735 } |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
736 |
5741
7a57631e2d6c
Preserve mbox files' atime when saving/syncing.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
737 if (ret == 0 && ctx->orig_atime != st.st_atime) { |
7a57631e2d6c
Preserve mbox files' atime when saving/syncing.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
738 /* try to set atime back to its original value */ |
7a57631e2d6c
Preserve mbox files' atime when saving/syncing.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
739 struct utimbuf buf; |
7a57631e2d6c
Preserve mbox files' atime when saving/syncing.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
740 |
7a57631e2d6c
Preserve mbox files' atime when saving/syncing.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
741 buf.modtime = st.st_mtime; |
7a57631e2d6c
Preserve mbox files' atime when saving/syncing.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
742 buf.actime = ctx->orig_atime; |
7a57631e2d6c
Preserve mbox files' atime when saving/syncing.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
743 if (utime(ctx->mbox->path, &buf) < 0) |
7a57631e2d6c
Preserve mbox files' atime when saving/syncing.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
744 mbox_set_syscall_error(ctx->mbox, "utime()"); |
7a57631e2d6c
Preserve mbox files' atime when saving/syncing.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
745 } |
7a57631e2d6c
Preserve mbox files' atime when saving/syncing.
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
746 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
747 if (!ctx->synced && ctx->mbox->mbox_fd != -1 && |
4918
2f9173e103fd
Added fsync_disable setting. Also added missing fsync()ing to dbox when
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
748 !ctx->mbox->mbox_writeonly && !ctx->mbox->ibox.fsync_disable) { |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
749 if (fdatasync(ctx->mbox->mbox_fd) < 0) { |
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
750 mbox_set_syscall_error(ctx->mbox, "fdatasync()"); |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
751 ret = -1; |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
752 } |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
753 } |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
754 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
755 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
|
756 return ret; |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
757 } |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
758 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
759 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
|
760 { |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
761 struct mbox_mailbox *mbox = ctx->mbox; |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
762 |
4044
da1d65e064f8
mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3879
diff
changeset
|
763 if (!ctx->finished) |
da1d65e064f8
mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3879
diff
changeset
|
764 mbox_save_cancel(&ctx->ctx); |
da1d65e064f8
mailbox_save_init() supports now returning failure. Quota plugin now checks
Timo Sirainen <timo.sirainen@movial.fi>
parents:
3879
diff
changeset
|
765 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
766 if (ctx->append_offset != (uoff_t)-1 && mbox->mbox_fd != -1) { |
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
767 i_assert(mbox->mbox_lock_type == F_WRLCK); |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
768 |
1015
40a327d356de
Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents:
988
diff
changeset
|
769 /* 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
|
770 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
|
771 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
|
772 o_stream_flush(ctx->output); |
562 | 773 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
774 if (ftruncate(mbox->mbox_fd, (off_t)ctx->append_offset) < 0) |
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
775 mbox_set_syscall_error(mbox, "ftruncate()"); |
1015
40a327d356de
Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents:
988
diff
changeset
|
776 } |
40a327d356de
Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents:
988
diff
changeset
|
777 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
778 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
|
779 } |