Mercurial > dovecot > core-2.2
annotate src/lib-storage/index/mbox/mbox-save.c @ 3565:2b167cc13887 HEAD
assert fix
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 29 Aug 2005 00:28:59 +0300 |
parents | bf294d77e1ec |
children | 247501e81026 |
rev | line source |
---|---|
0 | 1 /* Copyright (C) 2002 Timo Sirainen */ |
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" |
0 | 6 #include "hostpid.h" |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
7 #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
|
8 #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
|
9 #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
|
10 #include "write-full.h" |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
11 #include "istream-header-filter.h" |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
12 #include "ostream-crlf.h" |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
13 #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
|
14 #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
|
15 #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
|
16 #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
|
17 #include "mbox-from.h" |
0 | 18 #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
|
19 #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
|
20 #include "mbox-sync-private.h" |
0 | 21 |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
22 #include <stddef.h> |
0 | 23 #include <stdlib.h> |
24 #include <unistd.h> | |
25 #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
|
26 #include <sys/stat.h> |
22
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
27 #include <netdb.h> |
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
28 |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
29 struct mbox_save_context { |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
30 struct mail_save_context ctx; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
31 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
32 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
|
33 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
|
34 struct mail *mail; |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
35 uoff_t append_offset, mail_offset; |
1015
40a327d356de
Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents:
988
diff
changeset
|
36 |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
37 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
|
38 size_t space_end_idx; |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
39 uint32_t seq, next_uid; |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
40 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
41 struct istream *input; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
42 struct ostream *output, *body_output; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
43 uoff_t extra_hdr_offset, eoh_offset, eoh_input_offset; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
44 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
|
45 |
2973
32cc9186d8eb
If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents:
2892
diff
changeset
|
46 struct mbox_md5_context *mbox_md5_ctx; |
1209
539b7336b68a
mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
47 |
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 unsigned int synced:1; |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
49 unsigned int failed:1; |
1015
40a327d356de
Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents:
988
diff
changeset
|
50 }; |
40a327d356de
Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents:
988
diff
changeset
|
51 |
22
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
52 static char my_hostdomain[256] = ""; |
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
53 |
2486 | 54 static void write_error(struct mbox_save_context *ctx, int error) |
223
ca6967899c05
More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
55 { |
2486 | 56 if (ENOSPACE(error)) { |
3280
2c72492dfd91
Created mbox_storage and maildir_storage.
Timo Sirainen <tss@iki.fi>
parents:
3279
diff
changeset
|
57 mail_storage_set_error(STORAGE(ctx->mbox->storage), |
1015
40a327d356de
Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents:
988
diff
changeset
|
58 "Not enough disk space"); |
40a327d356de
Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents:
988
diff
changeset
|
59 } else { |
2486 | 60 errno = error; |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
61 mbox_set_syscall_error(ctx->mbox, "write()"); |
223
ca6967899c05
More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
62 } |
3348
34dea04a191e
Crashfix for some failure handling.
Timo Sirainen <tss@iki.fi>
parents:
3322
diff
changeset
|
63 |
34dea04a191e
Crashfix for some failure handling.
Timo Sirainen <tss@iki.fi>
parents:
3322
diff
changeset
|
64 ctx->failed = TRUE; |
223
ca6967899c05
More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
65 } |
ca6967899c05
More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
66 |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
67 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
|
68 { |
521
83da62e0675a
mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents:
492
diff
changeset
|
69 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
|
70 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
|
71 int fd; |
223
ca6967899c05
More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
72 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
73 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
|
74 *offset = 0; |
51a05fd00324
Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents:
2978
diff
changeset
|
75 return 0; |
51a05fd00324
Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents:
2978
diff
changeset
|
76 } |
51a05fd00324
Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents:
2978
diff
changeset
|
77 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
78 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
|
79 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
|
80 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
|
81 |
1039
793f05a7e50e
signed/unsigned/const pointer fixes
Timo Sirainen <tss@iki.fi>
parents:
1030
diff
changeset
|
82 *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
|
83 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
|
84 return 0; |
223
ca6967899c05
More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
85 |
1209
539b7336b68a
mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
86 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
|
87 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
|
88 |
1209
539b7336b68a
mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
89 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
|
90 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
|
91 |
521
83da62e0675a
mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents:
492
diff
changeset
|
92 if (ch != '\n') { |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
93 if (write_full(fd, "\n", 1) < 0) { |
2486 | 94 write_error(ctx, errno); |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
95 return -1; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
96 } |
1015
40a327d356de
Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents:
988
diff
changeset
|
97 *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
|
98 } |
223
ca6967899c05
More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
99 |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
100 return 0; |
223
ca6967899c05
More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
101 } |
ca6967899c05
More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
102 |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
103 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
|
104 { |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
105 if (o_stream_send(ctx->output, "\n", 1) < 0) { |
2486 | 106 write_error(ctx, ctx->output->stream_errno); |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
107 return -1; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
108 } |
266
757c32a1920d
expunging last message from mbox duplicated the whole file. appending mail
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
109 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
110 return 0; |
266
757c32a1920d
expunging last message from mbox duplicated the whole file. appending mail
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
111 } |
757c32a1920d
expunging last message from mbox duplicated the whole file. appending mail
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
112 |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
113 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
|
114 const char *from_envelope) |
22
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
115 { |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
116 const char *line, *name; |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
117 int ret; |
22
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
118 |
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
119 if (*my_hostdomain == '\0') { |
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
120 struct hostent *hent; |
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
121 |
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
122 hent = gethostbyname(my_hostname); |
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 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
|
125 if (name == NULL) { |
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
126 /* failed, use just the hostname */ |
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
127 name = my_hostname; |
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
128 } |
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
129 |
809
27554afad17e
Limit the mailbox path. A few cleanups.
Timo Sirainen <tss@iki.fi>
parents:
807
diff
changeset
|
130 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
|
131 } |
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
132 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
133 t_push(); |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
134 if (from_envelope == NULL) { |
3280
2c72492dfd91
Created mbox_storage and maildir_storage.
Timo Sirainen <tss@iki.fi>
parents:
3279
diff
changeset
|
135 from_envelope = |
2c72492dfd91
Created mbox_storage and maildir_storage.
Timo Sirainen <tss@iki.fi>
parents:
3279
diff
changeset
|
136 t_strconcat(INDEX_STORAGE(ctx->mbox->storage)->user, |
2c72492dfd91
Created mbox_storage and maildir_storage.
Timo Sirainen <tss@iki.fi>
parents:
3279
diff
changeset
|
137 "@", my_hostdomain, NULL); |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
138 } |
22
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
139 |
492
efa46e28a0d7
Fixes to timezone handling which were handling quite badly. added
Timo Sirainen <tss@iki.fi>
parents:
472
diff
changeset
|
140 /* save in local timezone, no matter what it was given with */ |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
141 line = mbox_from_create(from_envelope, received_date); |
22
a946ce1f09b7
mbox fixes, not fully working yet but almost :)
Timo Sirainen <tss@iki.fi>
parents:
13
diff
changeset
|
142 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
143 if ((ret = o_stream_send_str(ctx->output, line)) < 0) |
2486 | 144 write_error(ctx, ctx->output->stream_errno); |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
145 t_pop(); |
314
d2a305fa0ec2
mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents:
305
diff
changeset
|
146 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
147 return ret; |
314
d2a305fa0ec2
mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents:
305
diff
changeset
|
148 } |
d2a305fa0ec2
mbox ignored message flags for APPEND.
Timo Sirainen <tss@iki.fi>
parents:
305
diff
changeset
|
149 |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
150 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
|
151 { |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
152 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
|
153 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
|
154 size_t len; |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
155 int ret = 0; |
1209
539b7336b68a
mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
156 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
157 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
|
158 /* 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
|
159 return 0; |
51a05fd00324
Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents:
2978
diff
changeset
|
160 } |
51a05fd00324
Named pipes are now treated as write-only mboxes.
Timo Sirainen <tss@iki.fi>
parents:
2978
diff
changeset
|
161 |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
162 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
|
163 |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
164 /* 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
|
165 t_push(); |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
166 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
|
167 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
|
168 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
|
169 |
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 if (o_stream_seek(ctx->output, ctx->extra_hdr_offset + |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
171 ctx->space_end_idx - len) < 0) { |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
172 mbox_set_syscall_error(ctx->mbox, "o_stream_seek()"); |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
173 ret = -1; |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
174 } else if (o_stream_send(ctx->output, str, len) < 0) { |
2486 | 175 write_error(ctx, ctx->output->stream_errno); |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
176 ret = -1; |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
177 } else { |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
178 if (o_stream_seek(ctx->output, end_offset) < 0) { |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
179 mbox_set_syscall_error(ctx->mbox, "o_stream_seek()"); |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
180 ret = -1; |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
181 } |
1209
539b7336b68a
mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
182 } |
539b7336b68a
mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
183 |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
184 t_pop(); |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
185 return ret; |
1209
539b7336b68a
mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
186 } |
539b7336b68a
mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
187 |
2892
62d53b49110d
Changed mail_index_get_header() to return the header as return value because
Timo Sirainen <tss@iki.fi>
parents:
2877
diff
changeset
|
188 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
|
189 { |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
190 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
|
191 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
|
192 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
|
193 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
|
194 |
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
|
195 /* 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
|
196 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
|
197 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
|
198 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
|
199 |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
200 ctx->next_uid = hdr->next_uid; |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
201 ctx->synced = TRUE; |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
202 t->mbox_modified = TRUE; |
3221
af8fc972fe95
If want_mail = TRUE for mbox_save_init() and we sync the mbox, we'll have to
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
203 |
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
|
204 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
|
205 } |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
206 |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
207 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
|
208 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
|
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 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
|
211 |
3250
3b820e59610e
Recent flag handling cleanups. Added some comments.
Timo Sirainen <tss@iki.fi>
parents:
3245
diff
changeset
|
212 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
|
213 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
|
214 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
|
215 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
|
216 } |
3250
3b820e59610e
Recent flag handling cleanups. Added some comments.
Timo Sirainen <tss@iki.fi>
parents:
3245
diff
changeset
|
217 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
|
218 } |
1209
539b7336b68a
mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
219 |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
220 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
|
221 { |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
222 if ((flags & 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
|
223 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
|
224 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
|
225 str_append_c(str, '\n'); |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
226 } |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
227 |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
228 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
|
229 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
|
230 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
|
231 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
|
232 } |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
233 } |
1209
539b7336b68a
mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
234 |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
2986
diff
changeset
|
235 static void |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
2986
diff
changeset
|
236 mbox_save_append_keyword_headers(struct mbox_save_context *ctx, |
3086 | 237 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
|
238 { |
2273
c48822c8713f
Updated comment about how syncing is done, and s/extra space/padding/
Timo Sirainen <tss@iki.fi>
parents:
2261
diff
changeset
|
239 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
|
240 sizeof("Content-Length: \n")-1 + MAX_INT_STRLEN]; |
3254
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3250
diff
changeset
|
241 const array_t *keyword_names_list; |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3250
diff
changeset
|
242 ARRAY_SET_TYPE(keyword_names_list, const char *); |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3250
diff
changeset
|
243 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
|
244 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
|
245 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
246 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
|
247 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
|
248 |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
249 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
|
250 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
|
251 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
|
252 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
|
253 |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
254 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
|
255 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
|
256 } |
1209
539b7336b68a
mbox: strip some headers when saving message. also always set Content-Length
Timo Sirainen <tss@iki.fi>
parents:
1039
diff
changeset
|
257 |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
258 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
|
259 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
|
260 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
|
261 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
|
262 } |
0 | 263 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
264 static int |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
265 mbox_save_init_file(struct mbox_save_context *ctx, |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
266 struct mbox_transaction_context *t, int want_mail) |
0 | 267 { |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
268 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
|
269 int ret; |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
270 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
271 if (ctx->mbox->mbox_readonly || ctx->mbox->ibox.readonly) { |
3280
2c72492dfd91
Created mbox_storage and maildir_storage.
Timo Sirainen <tss@iki.fi>
parents:
3279
diff
changeset
|
272 mail_storage_set_error(STORAGE(ctx->mbox->storage), |
3245
6491dab63e54
Added input stream parameter to mailbox_open(). With mbox it now allows
Timo Sirainen <tss@iki.fi>
parents:
3221
diff
changeset
|
273 "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
|
274 return -1; |
6491dab63e54
Added input stream parameter to mailbox_open(). With mbox it now allows
Timo Sirainen <tss@iki.fi>
parents:
3221
diff
changeset
|
275 } |
6491dab63e54
Added input stream parameter to mailbox_open(). With mbox it now allows
Timo Sirainen <tss@iki.fi>
parents:
3221
diff
changeset
|
276 |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
277 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
|
278 /* 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
|
279 if (mbox->mbox_lock_type != F_WRLCK) { |
3565 | 280 i_assert(mbox->mbox_lock_type != F_RDLCK); |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
281 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
|
282 return -1; |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
283 } |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
284 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
285 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
|
286 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
|
287 return -1; |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
288 } |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
289 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
290 if (!want_mail) { |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
291 /* assign UIDs only if mbox doesn't require syncing */ |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
292 ret = mbox_sync_has_changed(mbox, TRUE); |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
293 if (ret < 0) |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
294 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
|
295 if (ret == 0) |
62d53b49110d
Changed mail_index_get_header() to return the header as return value because
Timo Sirainen <tss@iki.fi>
parents:
2877
diff
changeset
|
296 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
|
297 } |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
298 |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
299 if (mbox_seek_to_end(ctx, &ctx->append_offset) < 0) |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
300 return -1; |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
301 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
302 ctx->output = o_stream_create_file(mbox->mbox_fd, default_pool, |
2421
d141e1bfdd63
We never do blocking reads/writes to network anymore. Changed imap and pop3
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
303 0, FALSE); |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
304 } |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
305 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
306 if (!ctx->synced && want_mail) { |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
307 /* 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
|
308 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
|
309 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
|
310 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
|
311 } |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
312 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
313 return 0; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
314 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
315 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
316 static void save_header_callback(struct message_header_line *hdr, |
2973
32cc9186d8eb
If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents:
2892
diff
changeset
|
317 int *matched, void *context) |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
318 { |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
319 struct mbox_save_context *ctx = context; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
320 |
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
|
321 if (!*matched && ctx->mbox_md5_ctx && hdr != NULL) |
2973
32cc9186d8eb
If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents:
2892
diff
changeset
|
322 mbox_md5_continue(ctx->mbox_md5_ctx, hdr); |
32cc9186d8eb
If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents:
2892
diff
changeset
|
323 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
324 if ((hdr == NULL && ctx->eoh_input_offset == (uoff_t)-1) || |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
325 (hdr != NULL && hdr->eoh)) |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
326 ctx->eoh_input_offset = ctx->input->v_offset; |
3464
0661239a7034
Cache mail headers when saving mails to mbox. We should cache everything,
Timo Sirainen <tss@iki.fi>
parents:
3348
diff
changeset
|
327 |
0661239a7034
Cache mail headers when saving mails to mbox. We should cache everything,
Timo Sirainen <tss@iki.fi>
parents:
3348
diff
changeset
|
328 if (ctx->mail != NULL) { |
0661239a7034
Cache mail headers when saving mails to mbox. We should cache everything,
Timo Sirainen <tss@iki.fi>
parents:
3348
diff
changeset
|
329 index_mail_parse_header(NULL, hdr, |
0661239a7034
Cache mail headers when saving mails to mbox. We should cache everything,
Timo Sirainen <tss@iki.fi>
parents:
3348
diff
changeset
|
330 (struct index_mail *)ctx->mail); |
0661239a7034
Cache mail headers when saving mails to mbox. We should cache everything,
Timo Sirainen <tss@iki.fi>
parents:
3348
diff
changeset
|
331 } |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
332 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
333 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
334 struct mail_save_context * |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
335 mbox_save_init(struct mailbox_transaction_context *_t, |
3086 | 336 enum mail_flags flags, struct mail_keywords *keywords, |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
337 time_t received_date, int timezone_offset __attr_unused__, |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
338 const char *from_envelope, struct istream *input, int want_mail) |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
339 { |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
340 struct mbox_transaction_context *t = |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
341 (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
|
342 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
|
343 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
|
344 enum mail_flags save_flags; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
345 uint64_t offset; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
346 |
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
|
347 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
|
348 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
349 /* 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
|
350 if (received_date == (time_t)-1) |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
351 received_date = ioloop_time; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
352 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
353 if (ctx == NULL) { |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
354 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
|
355 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
|
356 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
|
357 ctx->trans = t->ictx.trans; |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
358 ctx->append_offset = (uoff_t)-1; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
359 ctx->headers = str_new(default_pool, 512); |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
360 ctx->mail_offset = (uoff_t)-1; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
361 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
362 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
363 ctx->failed = FALSE; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
364 ctx->seq = 0; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
365 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
366 if (mbox_save_init_file(ctx, t, want_mail) < 0) { |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
367 ctx->failed = TRUE; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
368 return &ctx->ctx; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
369 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
370 |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
2986
diff
changeset
|
371 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
|
372 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
|
373 if (ctx->synced) { |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
374 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
|
375 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
|
376 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
|
377 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
378 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
|
379 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
|
380 save_flags); |
3471
138e242c53c9
Keywords weren't saved to index while saving.
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
381 if (keywords != NULL) { |
138e242c53c9
Keywords weren't saved to index while saving.
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
382 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
|
383 MODIFY_REPLACE, keywords); |
138e242c53c9
Keywords weren't saved to index while saving.
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
384 } |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
385 |
2261
ba4f6d7b5a58
saving messages to empty mbox was buggy
Timo Sirainen <tss@iki.fi>
parents:
2224
diff
changeset
|
386 offset = ctx->output->offset == 0 ? 0 : |
ba4f6d7b5a58
saving messages to empty mbox was buggy
Timo Sirainen <tss@iki.fi>
parents:
2224
diff
changeset
|
387 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
|
388 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
|
389 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
|
390 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
|
391 |
3471
138e242c53c9
Keywords weren't saved to index while saving.
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
392 /* parse and cache the mail headers as we read it */ |
3464
0661239a7034
Cache mail headers when saving mails to mbox. We should cache everything,
Timo Sirainen <tss@iki.fi>
parents:
3348
diff
changeset
|
393 if (ctx->mail == NULL) |
0661239a7034
Cache mail headers when saving mails to mbox. We should cache everything,
Timo Sirainen <tss@iki.fi>
parents:
3348
diff
changeset
|
394 ctx->mail = index_mail_alloc(_t, 0, NULL); |
0661239a7034
Cache mail headers when saving mails to mbox. We should cache everything,
Timo Sirainen <tss@iki.fi>
parents:
3348
diff
changeset
|
395 mail_set_seq(ctx->mail, ctx->seq); |
0661239a7034
Cache mail headers when saving mails to mbox. We should cache everything,
Timo Sirainen <tss@iki.fi>
parents:
3348
diff
changeset
|
396 index_mail_parse_header_init((struct index_mail *)ctx->mail, |
0661239a7034
Cache mail headers when saving mails to mbox. We should cache everything,
Timo Sirainen <tss@iki.fi>
parents:
3348
diff
changeset
|
397 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
|
398 } |
3250
3b820e59610e
Recent flag handling cleanups. Added some comments.
Timo Sirainen <tss@iki.fi>
parents:
3245
diff
changeset
|
399 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
|
400 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
|
401 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
|
402 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
403 i_assert(mbox->mbox_lock_type == F_WRLCK); |
0 | 404 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
405 ctx->mail_offset = ctx->output->offset; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
406 ctx->eoh_input_offset = (uoff_t)-1; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
407 ctx->eoh_offset = (uoff_t)-1; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
408 ctx->last_char = '\n'; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
409 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
410 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
|
411 ctx->failed = TRUE; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
412 else { |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
413 ctx->input = |
2451
f6fef42f01b9
Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents:
2446
diff
changeset
|
414 i_stream_create_header_filter(input, |
f6fef42f01b9
Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents:
2446
diff
changeset
|
415 HEADER_FILTER_EXCLUDE | |
f6fef42f01b9
Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents:
2446
diff
changeset
|
416 HEADER_FILTER_NO_CR, |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
417 mbox_hide_headers, |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
418 mbox_hide_headers_count, |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
419 save_header_callback, |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
420 ctx); |
3260
6a179bf1272e
Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents:
3254
diff
changeset
|
421 ctx->body_output = |
3280
2c72492dfd91
Created mbox_storage and maildir_storage.
Timo Sirainen <tss@iki.fi>
parents:
3279
diff
changeset
|
422 (STORAGE(mbox->storage)->flags & |
3260
6a179bf1272e
Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents:
3254
diff
changeset
|
423 MAIL_STORAGE_FLAG_SAVE_CRLF) != 0 ? |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
424 o_stream_create_crlf(default_pool, ctx->output) : |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
425 o_stream_create_lf(default_pool, ctx->output); |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
426 if (ctx->mbox->mbox_save_md5 && ctx->synced) |
2973
32cc9186d8eb
If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents:
2892
diff
changeset
|
427 ctx->mbox_md5_ctx = mbox_md5_init(); |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
428 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
429 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
430 return &ctx->ctx; |
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 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
433 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
|
434 { |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
435 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
|
436 const unsigned char *data; |
2456 | 437 size_t size; |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
438 ssize_t ret; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
439 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
440 if (ctx->failed) |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
441 return -1; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
442 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
443 if (ctx->eoh_offset != (uoff_t)-1) { |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
444 /* writing body */ |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
445 if (o_stream_send_istream(ctx->body_output, ctx->input) < 0) { |
3348
34dea04a191e
Crashfix for some failure handling.
Timo Sirainen <tss@iki.fi>
parents:
3322
diff
changeset
|
446 write_error(ctx, ctx->body_output->stream_errno); |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
447 return -1; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
448 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
449 return 0; |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
450 } |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
451 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
452 while ((ret = i_stream_read(ctx->input)) != -1) { |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
453 if (ret == 0) |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
454 return 0; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
455 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
456 data = i_stream_get_data(ctx->input, &size); |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
457 if (ctx->eoh_input_offset != (uoff_t)-1 && |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
458 ctx->input->v_offset + size >= ctx->eoh_input_offset) { |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
459 /* found end of headers. write the rest of them. */ |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
460 size = ctx->eoh_input_offset - ctx->input->v_offset; |
2456 | 461 if (o_stream_send(ctx->output, data, size) < 0) { |
3348
34dea04a191e
Crashfix for some failure handling.
Timo Sirainen <tss@iki.fi>
parents:
3322
diff
changeset
|
462 write_error(ctx, ctx->output->stream_errno); |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
463 return -1; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
464 } |
2456 | 465 if (size > 0) |
466 ctx->last_char = data[size-1]; | |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
467 i_stream_skip(ctx->input, size + 1); |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
468 break; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
469 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
470 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
471 if (o_stream_send(ctx->output, data, size) < 0) { |
3348
34dea04a191e
Crashfix for some failure handling.
Timo Sirainen <tss@iki.fi>
parents:
3322
diff
changeset
|
472 write_error(ctx, ctx->output->stream_errno); |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
473 return -1; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
474 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
475 ctx->last_char = data[size-1]; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
476 i_stream_skip(ctx->input, size); |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
477 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
478 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
479 if (ctx->last_char != '\n') { |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
480 if (o_stream_send(ctx->output, "\n", 1) < 0) { |
3348
34dea04a191e
Crashfix for some failure handling.
Timo Sirainen <tss@iki.fi>
parents:
3322
diff
changeset
|
481 write_error(ctx, ctx->output->stream_errno); |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
482 return -1; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
483 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
484 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
485 |
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
|
486 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
|
487 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
|
488 |
32cc9186d8eb
If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents:
2892
diff
changeset
|
489 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
|
490 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
|
491 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
|
492 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
|
493 } |
32cc9186d8eb
If we want MD5 sums in indexes, mail saving should also add them.
Timo Sirainen <tss@iki.fi>
parents:
2892
diff
changeset
|
494 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
495 /* 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
|
496 ctx->extra_hdr_offset = ctx->output->offset; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
497 if (o_stream_send(ctx->output, str_data(ctx->headers), |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
498 str_len(ctx->headers)) < 0) { |
3348
34dea04a191e
Crashfix for some failure handling.
Timo Sirainen <tss@iki.fi>
parents:
3322
diff
changeset
|
499 write_error(ctx, ctx->output->stream_errno); |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
500 return -1; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
501 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
502 ctx->eoh_offset = ctx->output->offset; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
503 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
504 /* write body */ |
2461 | 505 (void)i_stream_get_data(ctx->input, &size); |
506 return ctx->input->eof && size == 0 ? 0 : mbox_save_continue(_ctx); | |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
507 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
508 |
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
|
509 int mbox_save_finish(struct mail_save_context *_ctx, struct mail *dest_mail) |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
510 { |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
511 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
|
512 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
513 if (!ctx->failed) { |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
514 if (mbox_write_content_length(ctx) < 0 || |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
515 mbox_append_lf(ctx) < 0) |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
516 ctx->failed = TRUE; |
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 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
519 if (ctx->input != NULL) { |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
520 i_stream_unref(ctx->input); |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
521 ctx->input = NULL; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
522 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
523 if (ctx->body_output != NULL) { |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
524 o_stream_unref(ctx->body_output); |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
525 ctx->body_output = NULL; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
526 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
527 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
528 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
|
529 /* 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
|
530 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
|
531 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
|
532 ctx->mail_offset = (uoff_t)-1; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
533 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
534 |
3348
34dea04a191e
Crashfix for some failure handling.
Timo Sirainen <tss@iki.fi>
parents:
3322
diff
changeset
|
535 if (ctx->failed) |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
536 return -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
|
537 |
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
|
538 if (dest_mail != NULL) { |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
539 i_assert(ctx->seq != 0); |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
540 |
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
|
541 if (mail_set_seq(dest_mail, ctx->seq) < 0) |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
542 return -1; |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
543 } |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
544 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
545 return 0; |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
546 } |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
547 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
548 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
|
549 { |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
550 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
|
551 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
552 ctx->failed = TRUE; |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
553 (void)mbox_save_finish(_ctx, NULL); |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
554 } |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
555 |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
556 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
|
557 { |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
558 i_assert(ctx->body_output == NULL); |
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
559 |
1978
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
560 if (ctx->output != NULL) |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
561 o_stream_unref(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
|
562 if (ctx->mail != NULL) |
0661239a7034
Cache mail headers when saving mails to mbox. We should cache everything,
Timo Sirainen <tss@iki.fi>
parents:
3348
diff
changeset
|
563 index_mail_free(ctx->mail); |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
564 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
|
565 i_free(ctx); |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
566 } |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
567 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
568 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
|
569 { |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
570 int ret = 0; |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
571 |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
572 if (ctx->synced) { |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
573 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
|
574 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
|
575 &ctx->next_uid, sizeof(ctx->next_uid), FALSE); |
2190
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
576 } |
755ec9442a58
mailbox_save() and mailbox_copy() functions can now return the saved mail so
Timo Sirainen <tss@iki.fi>
parents:
2129
diff
changeset
|
577 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
578 if (!ctx->synced && ctx->mbox->mbox_fd != -1 && |
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
579 !ctx->mbox->mbox_writeonly) { |
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
580 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
|
581 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
|
582 ret = -1; |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
583 } |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
584 } |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
585 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
586 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
|
587 return ret; |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
588 } |
6303ef092c5b
mbox code compiles again, but syncing is only partially implemented so
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
589 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
590 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
|
591 { |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
592 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
|
593 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
594 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
|
595 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
|
596 |
1015
40a327d356de
Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents:
988
diff
changeset
|
597 /* 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
|
598 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
|
599 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
|
600 o_stream_flush(ctx->output); |
562 | 601 |
3279
b698ae839a18
Moved mbox/maildir-specific variables from struct index_mailbox to
Timo Sirainen <tss@iki.fi>
parents:
3262
diff
changeset
|
602 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
|
603 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
|
604 } |
40a327d356de
Support for MULTIAPPEND extension. COPY now behaves like spec says - if it
Timo Sirainen <tss@iki.fi>
parents:
988
diff
changeset
|
605 |
2446
47e1e05cede0
Changed mail saving API to be nonblocking.
Timo Sirainen <tss@iki.fi>
parents:
2421
diff
changeset
|
606 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
|
607 } |