Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-index/mbox/mbox-rewrite.c @ 807:35abd7a5d381 HEAD
Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Added str_path() and str_ppath() functions. i_snprintf() now returns only -1
or 0 depending on if buffer got full. dec2str() returns the string allocated
from data stack. Instead of just casting to (long) or (int), we now use
dec2str() with printf-like functions. Added o_stream_send_str(). Added
strocpy() and replaced all strcpy()s and strncpy()s with it.
Pretty much untested, hope it doesn't break too badly :)
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 19 Dec 2002 03:02:34 +0200 |
parents | 5ac361acb316 |
children | 86cf24da85f1 |
rev | line source |
---|---|
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* Copyright (C) 2002 Timo Sirainen */ |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
4 #include "istream.h" |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
5 #include "ostream.h" |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "temp-string.h" |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "write-full.h" |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "mbox-index.h" |
298
5509d87fe68b
mbox locking changes. support read-locking now. there's still problems
Timo Sirainen <tss@iki.fi>
parents:
297
diff
changeset
|
9 #include "mbox-lock.h" |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include "mail-index-util.h" |
180
38341ad6a9db
partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents:
160
diff
changeset
|
11 #include "mail-custom-flags.h" |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 #include <stdio.h> |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #include <stdlib.h> |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 #include <unistd.h> |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 #include <fcntl.h> |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 typedef struct { |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
19 OStream *output; |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 int failed; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 |
370
b0a62e264b22
Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
22 uoff_t content_length; |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 unsigned int seq; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 unsigned int msg_flags; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 const char **custom_flags; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 unsigned int uid_validity; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 unsigned int uid_last; |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
29 |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
30 unsigned int ximapbase_found:1; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
31 unsigned int xkeywords_found:1; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
32 unsigned int status_found:1; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
33 unsigned int xstatus_found:1; |
370
b0a62e264b22
Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
34 unsigned int content_length_found:1; |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 } MboxRewriteContext; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 /* Remove dirty flag from all messages */ |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 static void reset_dirty_flags(MailIndex *index) |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 { |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 MailIndexRecord *rec; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 rec = index->lookup(index, 1); |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 while (rec != NULL) { |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 rec->index_flags &= ~INDEX_MAIL_FLAG_DIRTY; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 rec = index->next(index, rec); |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 } |
209
d85a6898bf39
Don't rewrite mbox if no flags were changed.
Timo Sirainen <tss@iki.fi>
parents:
194
diff
changeset
|
47 |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
48 index->header->flags &= ~(MAIL_INDEX_FLAG_DIRTY_MESSAGES | |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
49 MAIL_INDEX_FLAG_DIRTY_CUSTOMFLAGS); |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
52 static int mbox_write(MailIndex *index, IStream *input, OStream *output, |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 uoff_t end_offset) |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 { |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
404
diff
changeset
|
55 uoff_t old_limit; |
484
006202bcab99
input buffer limit wasn't reset in error conditions.
Timo Sirainen <tss@iki.fi>
parents:
452
diff
changeset
|
56 int failed; |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
404
diff
changeset
|
57 |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
58 i_assert(input->v_offset <= end_offset); |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
60 old_limit = input->v_limit; |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
61 i_stream_set_read_limit(input, end_offset); |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
62 if (o_stream_send_istream(output, input) < 0) { |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
404
diff
changeset
|
63 index_set_error(index, "Error rewriting mbox file %s: %s", |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
64 index->mbox_path, |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
65 strerror(output->stream_errno)); |
484
006202bcab99
input buffer limit wasn't reset in error conditions.
Timo Sirainen <tss@iki.fi>
parents:
452
diff
changeset
|
66 failed = TRUE; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
67 } else if (input->v_offset < end_offset) { |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 /* fsck should have noticed it.. */ |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 index_set_error(index, "Error rewriting mbox file %s: " |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 "Unexpected end of file", index->mbox_path); |
484
006202bcab99
input buffer limit wasn't reset in error conditions.
Timo Sirainen <tss@iki.fi>
parents:
452
diff
changeset
|
71 failed = TRUE; |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
404
diff
changeset
|
72 } else { |
484
006202bcab99
input buffer limit wasn't reset in error conditions.
Timo Sirainen <tss@iki.fi>
parents:
452
diff
changeset
|
73 failed = FALSE; |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
76 i_stream_set_read_limit(input, old_limit); |
484
006202bcab99
input buffer limit wasn't reset in error conditions.
Timo Sirainen <tss@iki.fi>
parents:
452
diff
changeset
|
77 return !failed; |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
80 static int mbox_write_ximapbase(MboxRewriteContext *ctx) |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
81 { |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
82 const char *str; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
83 int i; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
84 |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
85 str = t_strdup_printf("X-IMAPbase: %u %u", |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
86 ctx->uid_validity, ctx->uid_last); |
807
35abd7a5d381
Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents:
805
diff
changeset
|
87 if (o_stream_send_str(ctx->output, str) < 0) |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
88 return FALSE; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
89 |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
90 for (i = 0; i < MAIL_CUSTOM_FLAGS_COUNT; i++) { |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
91 if (ctx->custom_flags[i] != NULL) { |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
92 if (o_stream_send(ctx->output, " ", 1) < 0) |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
93 return FALSE; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
94 |
807
35abd7a5d381
Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents:
805
diff
changeset
|
95 if (o_stream_send_str(ctx->output, |
35abd7a5d381
Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents:
805
diff
changeset
|
96 ctx->custom_flags[i]) < 0) |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
97 return FALSE; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
98 } |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
99 } |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
100 |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
101 if (o_stream_send(ctx->output, "\n", 1) < 0) |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
102 return FALSE; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
103 |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
104 return TRUE; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
105 } |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
106 |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
107 static int mbox_write_xkeywords(MboxRewriteContext *ctx, const char *x_keywords) |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
108 { |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
109 unsigned int field; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
110 int i; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
111 |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
112 if ((ctx->msg_flags & MAIL_CUSTOM_FLAGS_MASK) == 0 && |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
113 x_keywords == NULL) |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
114 return TRUE; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
115 |
807
35abd7a5d381
Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents:
805
diff
changeset
|
116 if (o_stream_send_str(ctx->output, "X-Keywords:") < 0) |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
117 return FALSE; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
118 |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
119 field = 1 << MAIL_CUSTOM_FLAG_1_BIT; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
120 for (i = 0; i < MAIL_CUSTOM_FLAGS_COUNT; i++, field <<= 1) { |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
121 if ((ctx->msg_flags & field) && ctx->custom_flags[i] != NULL) { |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
122 if (o_stream_send(ctx->output, " ", 1) < 0) |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
123 return FALSE; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
124 |
807
35abd7a5d381
Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents:
805
diff
changeset
|
125 if (o_stream_send_str(ctx->output, |
35abd7a5d381
Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents:
805
diff
changeset
|
126 ctx->custom_flags[i]) < 0) |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
127 return FALSE; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
128 } |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
129 } |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
130 |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
131 if (x_keywords != NULL) { |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
132 /* X-Keywords that aren't custom flags */ |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
133 if (o_stream_send(ctx->output, " ", 1) < 0) |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
134 return FALSE; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
135 |
807
35abd7a5d381
Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents:
805
diff
changeset
|
136 if (o_stream_send_str(ctx->output, x_keywords) < 0) |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
137 return FALSE; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
138 } |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
139 |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
140 if (o_stream_send(ctx->output, "\n", 1) < 0) |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
141 return FALSE; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
142 |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
143 return TRUE; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
144 } |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
145 |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
146 static int mbox_write_status(MboxRewriteContext *ctx, const char *status) |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
147 { |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
148 const char *str; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
149 |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
150 str = (ctx->msg_flags & MAIL_SEEN) ? "Status: RO" : "Status: O"; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
151 if (status != NULL) |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
152 str = t_strconcat(str, status, NULL); |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
153 |
807
35abd7a5d381
Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents:
805
diff
changeset
|
154 if (o_stream_send_str(ctx->output, str) < 0) |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
155 return FALSE; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
156 if (o_stream_send(ctx->output, "\n", 1) < 0) |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
157 return FALSE; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
158 |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
159 return TRUE; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
160 } |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
161 |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
162 static int mbox_write_xstatus(MboxRewriteContext *ctx, const char *x_status) |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
163 { |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
164 const char *str; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
165 |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
166 /* X-Status field */ |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
167 if ((ctx->msg_flags & (MAIL_SYSTEM_FLAGS_MASK^MAIL_SEEN)) == 0 && |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
168 x_status == NULL) |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
169 return TRUE; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
170 |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
171 str = t_strconcat("X-Status: ", |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
172 (ctx->msg_flags & MAIL_ANSWERED) ? "A" : "", |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
173 (ctx->msg_flags & MAIL_DRAFT) ? "D" : "", |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
174 (ctx->msg_flags & MAIL_FLAGGED) ? "F" : "", |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
175 (ctx->msg_flags & MAIL_DELETED) ? "T" : "", |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
176 x_status, NULL); |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
177 |
807
35abd7a5d381
Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents:
805
diff
changeset
|
178 if (o_stream_send_str(ctx->output, str) < 0) |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
179 return FALSE; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
180 if (o_stream_send(ctx->output, "\n", 1) < 0) |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
181 return FALSE; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
182 |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
183 return TRUE; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
184 } |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
185 |
370
b0a62e264b22
Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
186 static int mbox_write_content_length(MboxRewriteContext *ctx) |
b0a62e264b22
Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
187 { |
678
1e5c655bad25
Renamed largest_t to uintmax_t which already exists in C99.
Timo Sirainen <tss@iki.fi>
parents:
642
diff
changeset
|
188 char str[MAX_INT_STRLEN+30]; |
370
b0a62e264b22
Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
189 |
b0a62e264b22
Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
190 i_snprintf(str, sizeof(str), "Content-Length: %"PRIuUOFF_T"\n", |
b0a62e264b22
Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
191 ctx->content_length); |
b0a62e264b22
Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
192 |
807
35abd7a5d381
Buffer related cleanups. Use PATH_MAX instead of hardcoded 1024 for paths.
Timo Sirainen <tss@iki.fi>
parents:
805
diff
changeset
|
193 if (o_stream_send_str(ctx->output, str) < 0) |
370
b0a62e264b22
Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
194 return FALSE; |
b0a62e264b22
Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
195 return TRUE; |
b0a62e264b22
Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
196 } |
b0a62e264b22
Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
197 |
184 | 198 static const char *strip_chars(const char *value, size_t value_len, |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 const char *list) |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 { |
805
5ac361acb316
Marked all non-trivial buffer modifications with @UNSAFE tag. Several
Timo Sirainen <tss@iki.fi>
parents:
765
diff
changeset
|
201 /* @UNSAFE: leave only unknown flags, very likely none */ |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 char *ret, *p; |
765
553f050c8313
Added buffer API. Point is to hide all buffer writing behind this API which
Timo Sirainen <tss@iki.fi>
parents:
764
diff
changeset
|
203 size_t i; |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 ret = p = t_buffer_get(value_len+1); |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 for (i = 0; i < value_len; i++) { |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 if (strchr(list, value[i]) == NULL) |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 *p++ = value[i]; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 if (ret == p) |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
212 return NULL; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 *p = '\0'; |
184 | 214 t_buffer_alloc((size_t) (p-ret)+1); |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 return ret; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
216 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
217 |
184 | 218 static void update_stripped_custom_flags(const char *value, size_t len, |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 int index, void *context) |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
220 { |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
221 TempString *str = context; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
222 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
223 if (index < 0) { |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
224 /* not found, keep it */ |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 if (str->len != 0) |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
226 t_string_append_c(str, ' '); |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
227 t_string_append_n(str, value, len); |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
228 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
230 |
184 | 231 static const char *strip_custom_flags(const char *value, size_t len, |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
232 MboxRewriteContext *ctx) |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
233 { |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
234 TempString *str; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
235 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
236 str = t_string_new(len+1); |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
237 mbox_keywords_parse(value, len, ctx->custom_flags, |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
238 update_stripped_custom_flags, str); |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
239 return str->len == 0 ? NULL : str->str; |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
240 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
241 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
242 static void header_func(MessagePart *part __attr_unused__, |
184 | 243 const char *name, size_t name_len, |
244 const char *value, size_t value_len, | |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
245 void *context) |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 { |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
247 MboxRewriteContext *ctx = context; |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
248 const char *str; |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 char *end; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
250 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 if (ctx->failed) |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
252 return; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
253 |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
254 if (name_len == 6 && strncasecmp(name, "Status", 6) == 0) { |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
255 ctx->status_found = TRUE; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
256 str = strip_chars(value, value_len, "RO"); |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
257 (void)mbox_write_status(ctx, str); |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
258 } else if (name_len == 8 && strncasecmp(name, "X-Status", 8) == 0) { |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
259 ctx->xstatus_found = TRUE; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
260 str = strip_chars(value, value_len, "ADFT"); |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
261 (void)mbox_write_xstatus(ctx, str); |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
262 } else if (name_len == 10 && strncasecmp(name, "X-Keywords", 10) == 0) { |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
263 ctx->ximapbase_found = TRUE; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
264 str = strip_custom_flags(value, value_len, ctx); |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
265 (void)mbox_write_xkeywords(ctx, str); |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
266 } else if (name_len == 10 && strncasecmp(name, "X-IMAPbase", 10) == 0) { |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
267 if (ctx->seq == 1) { |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
268 /* temporarily copy the value to make sure we |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
269 don't overflow it */ |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
270 t_push(); |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 value = t_strndup(value, value_len); |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 ctx->uid_validity = strtoul(value, &end, 10); |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
273 while (*end == ' ') end++; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
274 ctx->uid_last = strtoul(end, &end, 10); |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
275 t_pop(); |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
276 |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
277 ctx->ximapbase_found = TRUE; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
278 (void)mbox_write_ximapbase(ctx); |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
279 } |
370
b0a62e264b22
Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
280 } else if (name_len == 14 && |
b0a62e264b22
Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
281 strncasecmp(name, "Content-Length", 14) == 0) { |
b0a62e264b22
Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
282 ctx->content_length_found = TRUE; |
b0a62e264b22
Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
283 (void)mbox_write_content_length(ctx); |
369
d037915978ca
message_parse_header() now calls the function with empty name/value at end
Timo Sirainen <tss@iki.fi>
parents:
365
diff
changeset
|
284 } else if (name_len > 0) { |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
285 /* save this header */ |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
286 (void)o_stream_send(ctx->output, name, name_len); |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
287 (void)o_stream_send(ctx->output, ": ", 2); |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
288 (void)o_stream_send(ctx->output, value, value_len); |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
289 (void)o_stream_send(ctx->output, "\n", 1); |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
290 } |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
291 |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
292 if (ctx->output->closed) |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
293 ctx->failed = TRUE; |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
294 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
295 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
296 static int mbox_write_header(MailIndex *index, |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
297 MailIndexRecord *rec, unsigned int seq, |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
298 IStream *input, OStream *output, uoff_t end_offset, |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
521
diff
changeset
|
299 uoff_t hdr_size, uoff_t body_size) |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
300 { |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
301 /* We need to update fields that define message flags. Standard fields |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
302 are stored in Status and X-Status. For custom flags we use |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
303 uw-imapd compatible format, by first listing them in first message's |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
304 X-IMAPbase field and actually defining them in X-Keywords field. |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
305 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
306 Format of X-IMAPbase is: <UID validity> <last used UID> <flag names> |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
307 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
308 We don't want to sync our UIDs with the mbox file, so the UID |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
309 validity is always kept different from our internal UID validity. |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
310 Last used UID is also not updated, and set to 0 initially. |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
311 */ |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
312 MboxRewriteContext ctx; |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
521
diff
changeset
|
313 MessageSize hdr_parsed_size; |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
314 |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
315 if (input->v_offset >= end_offset) { |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 /* fsck should have noticed it.. */ |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
317 index_set_error(index, "Error rewriting mbox file %s: " |
221
ed0d5b17c7a4
Added extra functions for easier printing of error messages. Moved
Timo Sirainen <tss@iki.fi>
parents:
217
diff
changeset
|
318 "Unexpected end of file", index->mbox_path); |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
319 return FALSE; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
320 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
321 |
180
38341ad6a9db
partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents:
160
diff
changeset
|
322 t_push(); |
38341ad6a9db
partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents:
160
diff
changeset
|
323 |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
324 /* parse the header, write the fields we don't want to change */ |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
325 memset(&ctx, 0, sizeof(ctx)); |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
326 ctx.output = output; |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
327 ctx.seq = seq; |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
521
diff
changeset
|
328 ctx.content_length = body_size; |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
329 ctx.msg_flags = rec->msg_flags; |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
330 ctx.uid_validity = index->header->uid_validity-1; |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
331 ctx.custom_flags = mail_custom_flags_list_get(index->custom_flags); |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
332 |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
333 i_stream_set_read_limit(input, input->v_offset + hdr_size); |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
334 message_parse_header(NULL, input, &hdr_parsed_size, header_func, &ctx); |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
335 i_stream_set_read_limit(input, 0); |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
336 |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
521
diff
changeset
|
337 i_assert(hdr_parsed_size.physical_size == hdr_size); |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
338 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
339 /* append the flag fields */ |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
340 if (seq == 1 && !ctx.ximapbase_found) { |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
341 /* write X-IMAPbase header to first message */ |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
342 (void)mbox_write_ximapbase(&ctx); |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
343 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
344 |
362
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
345 if (!ctx.xkeywords_found) |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
346 (void)mbox_write_xkeywords(&ctx, NULL); |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
347 if (!ctx.status_found) |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
348 (void)mbox_write_status(&ctx, NULL); |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
349 if (!ctx.xstatus_found) |
aa449d013563
When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents:
312
diff
changeset
|
350 (void)mbox_write_xstatus(&ctx, NULL); |
370
b0a62e264b22
Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
351 if (!ctx.content_length_found) |
b0a62e264b22
Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
352 (void)mbox_write_content_length(&ctx); |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
353 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
354 t_pop(); |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
355 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
356 /* empty line ends headers */ |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
357 (void)o_stream_send(output, "\n", 1); |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
358 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
359 return TRUE; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
360 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
361 |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
362 static int fd_copy(int in_fd, int out_fd, uoff_t out_offset) |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
363 { |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
364 IStream *input; |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
365 OStream *output; |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
366 int ret; |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
367 |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
368 i_assert(out_offset <= OFF_T_MAX); |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
369 |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
370 if (lseek(out_fd, (off_t)out_offset, SEEK_SET) < 0) |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
371 return -1; |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
372 |
404
f25e575bf1ca
Created datastack_mempool which is used by at least a few temporary
Timo Sirainen <tss@iki.fi>
parents:
389
diff
changeset
|
373 t_push(); |
f25e575bf1ca
Created datastack_mempool which is used by at least a few temporary
Timo Sirainen <tss@iki.fi>
parents:
389
diff
changeset
|
374 |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
375 input = i_stream_create_mmap(in_fd, data_stack_pool, |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
404
diff
changeset
|
376 1024*256, 0, 0, FALSE); |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
377 output = o_stream_create_file(out_fd, data_stack_pool, 1024, 0, FALSE); |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
378 o_stream_set_blocking(output, 60000, NULL, NULL); |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
379 |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
380 ret = o_stream_send_istream(output, input); |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
381 if (ret < 0) |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
382 errno = output->stream_errno; |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
383 else { |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
384 /* we may have shrinked the file */ |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
385 i_assert(out_offset + input->v_size <= OFF_T_MAX); |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
386 ret = ftruncate(out_fd, (off_t) (out_offset + input->v_size)); |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
387 } |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
388 |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
389 o_stream_unref(output); |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
390 i_stream_unref(input); |
404
f25e575bf1ca
Created datastack_mempool which is used by at least a few temporary
Timo Sirainen <tss@iki.fi>
parents:
389
diff
changeset
|
391 t_pop(); |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
392 |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
393 return ret; |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
394 } |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
395 |
629
2f3b2a5d74d7
If first message with our X-IMAPbase is deleted, make sure it's added back.
Timo Sirainen <tss@iki.fi>
parents:
604
diff
changeset
|
396 #define INDEX_DIRTY_FLAGS \ |
2f3b2a5d74d7
If first message with our X-IMAPbase is deleted, make sure it's added back.
Timo Sirainen <tss@iki.fi>
parents:
604
diff
changeset
|
397 (MAIL_INDEX_FLAG_DIRTY_MESSAGES | MAIL_INDEX_FLAG_DIRTY_CUSTOMFLAGS) |
2f3b2a5d74d7
If first message with our X-IMAPbase is deleted, make sure it's added back.
Timo Sirainen <tss@iki.fi>
parents:
604
diff
changeset
|
398 |
180
38341ad6a9db
partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents:
160
diff
changeset
|
399 int mbox_index_rewrite(MailIndex *index) |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
400 { |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
401 /* Write messages beginning from the first dirty one to temp file, |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
402 then copy it over the mbox file. This may create data loss if |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
403 interrupted (see below). This rewriting relies quite a lot on |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
404 valid header/body sizes which fsck() should have ensured. */ |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
405 MailIndexRecord *rec; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
406 IStream *input; |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
407 OStream *output; |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
521
diff
changeset
|
408 uoff_t offset, hdr_size, body_size, dirty_offset; |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
409 const char *path; |
194 | 410 unsigned int seq; |
521
83da62e0675a
mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents:
484
diff
changeset
|
411 int tmp_fd, failed, dirty_found, rewrite; |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
412 |
559
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
556
diff
changeset
|
413 i_assert(index->lock_type == MAIL_LOCK_UNLOCK); |
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
556
diff
changeset
|
414 |
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
556
diff
changeset
|
415 if (!index->set_lock(index, MAIL_LOCK_SHARED)) |
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
556
diff
changeset
|
416 return FALSE; |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
417 |
642
5f5fdc45c19d
Don't rewrite when there's no messages (ie. don't write the one '\n').
Timo Sirainen <tss@iki.fi>
parents:
629
diff
changeset
|
418 rewrite = (index->header->flags & INDEX_DIRTY_FLAGS) && |
5f5fdc45c19d
Don't rewrite when there's no messages (ie. don't write the one '\n').
Timo Sirainen <tss@iki.fi>
parents:
629
diff
changeset
|
419 index->header->messages_count > 0; |
559
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
556
diff
changeset
|
420 |
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
556
diff
changeset
|
421 if (!index->set_lock(index, MAIL_LOCK_UNLOCK)) |
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
556
diff
changeset
|
422 return FALSE; |
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
556
diff
changeset
|
423 |
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
556
diff
changeset
|
424 if (!rewrite) { |
303
19108e7c5af2
Actually, first don't do anything if there's no dirty flags. Then fsck().
Timo Sirainen <tss@iki.fi>
parents:
301
diff
changeset
|
425 /* no need to rewrite */ |
19108e7c5af2
Actually, first don't do anything if there's no dirty flags. Then fsck().
Timo Sirainen <tss@iki.fi>
parents:
301
diff
changeset
|
426 return TRUE; |
19108e7c5af2
Actually, first don't do anything if there's no dirty flags. Then fsck().
Timo Sirainen <tss@iki.fi>
parents:
301
diff
changeset
|
427 } |
19108e7c5af2
Actually, first don't do anything if there's no dirty flags. Then fsck().
Timo Sirainen <tss@iki.fi>
parents:
301
diff
changeset
|
428 |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
429 tmp_fd = -1; input = NULL; |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
430 failed = TRUE; rewrite = FALSE; |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
431 do { |
570
2626acd3c6f4
And more locking/syncing fixes. Now it's finally beginning to look sane
Timo Sirainen <tss@iki.fi>
parents:
560
diff
changeset
|
432 if (!index->set_lock(index, MAIL_LOCK_EXCLUSIVE)) |
2626acd3c6f4
And more locking/syncing fixes. Now it's finally beginning to look sane
Timo Sirainen <tss@iki.fi>
parents:
560
diff
changeset
|
433 break; |
2626acd3c6f4
And more locking/syncing fixes. Now it's finally beginning to look sane
Timo Sirainen <tss@iki.fi>
parents:
560
diff
changeset
|
434 |
559
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
556
diff
changeset
|
435 if (!index->sync_and_lock(index, MAIL_LOCK_EXCLUSIVE, NULL)) |
556 | 436 break; |
437 | |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
438 input = mbox_get_stream(index, 0, MAIL_LOCK_EXCLUSIVE); |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
439 if (input == NULL) |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
440 break; |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
441 |
629
2f3b2a5d74d7
If first message with our X-IMAPbase is deleted, make sure it's added back.
Timo Sirainen <tss@iki.fi>
parents:
604
diff
changeset
|
442 if ((index->header->flags & INDEX_DIRTY_FLAGS) == 0) { |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
443 /* fsck() figured out there's no dirty messages |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
444 after all */ |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
445 failed = FALSE; rewrite = FALSE; |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
446 break; |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
447 } |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
448 |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
449 tmp_fd = mail_index_create_temp_file(index, &path); |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
450 if (tmp_fd == -1) |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
451 break; |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
452 |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
453 failed = FALSE; rewrite = TRUE; |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
454 } while (0); |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
455 |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
456 if (!rewrite) { |
560 | 457 if (!index->set_lock(index, MAIL_LOCK_UNLOCK)) |
559
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
556
diff
changeset
|
458 failed = TRUE; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
459 if (input != NULL) |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
460 i_stream_unref(input); |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
461 return !failed; |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
462 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
463 |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
464 if (index->header->flags & MAIL_INDEX_FLAG_DIRTY_CUSTOMFLAGS) { |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
465 /* need to update X-IMAPbase in first message */ |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
466 dirty_found = TRUE; |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
467 } else { |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
468 dirty_found = FALSE; |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
469 } |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
470 dirty_offset = 0; |
298
5509d87fe68b
mbox locking changes. support read-locking now. there's still problems
Timo Sirainen <tss@iki.fi>
parents:
297
diff
changeset
|
471 |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
472 /* note: we can't use data_stack_pool with output stream because it's |
559
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
556
diff
changeset
|
473 being written to inside t_push() .. t_pop() calls */ |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
474 output = o_stream_create_file(tmp_fd, system_pool, 8192, 0, FALSE); |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
475 o_stream_set_blocking(output, 60000, NULL, NULL); |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
476 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
477 failed = FALSE; seq = 1; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
478 rec = index->lookup(index, 1); |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
479 while (rec != NULL) { |
383 | 480 if (dirty_found || (rec->index_flags & INDEX_MAIL_FLAG_DIRTY)) { |
481 /* get offset to beginning of mail headers */ | |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
521
diff
changeset
|
482 if (!mbox_mail_get_location(index, rec, &offset, |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
521
diff
changeset
|
483 &hdr_size, &body_size)) { |
383 | 484 /* fsck should have fixed it */ |
485 failed = TRUE; | |
486 break; | |
487 } | |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
488 |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
489 if (offset < input->v_offset) { |
570
2626acd3c6f4
And more locking/syncing fixes. Now it's finally beginning to look sane
Timo Sirainen <tss@iki.fi>
parents:
560
diff
changeset
|
490 index_set_corrupted(index, |
2626acd3c6f4
And more locking/syncing fixes. Now it's finally beginning to look sane
Timo Sirainen <tss@iki.fi>
parents:
560
diff
changeset
|
491 "Invalid message offset"); |
2626acd3c6f4
And more locking/syncing fixes. Now it's finally beginning to look sane
Timo Sirainen <tss@iki.fi>
parents:
560
diff
changeset
|
492 failed = TRUE; |
2626acd3c6f4
And more locking/syncing fixes. Now it's finally beginning to look sane
Timo Sirainen <tss@iki.fi>
parents:
560
diff
changeset
|
493 break; |
2626acd3c6f4
And more locking/syncing fixes. Now it's finally beginning to look sane
Timo Sirainen <tss@iki.fi>
parents:
560
diff
changeset
|
494 } |
2626acd3c6f4
And more locking/syncing fixes. Now it's finally beginning to look sane
Timo Sirainen <tss@iki.fi>
parents:
560
diff
changeset
|
495 |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
496 if (offset + hdr_size + body_size > input->v_size) { |
383 | 497 index_set_corrupted(index, |
498 "Invalid message size"); | |
499 failed = TRUE; | |
500 break; | |
501 } | |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
502 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
503 |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
504 if (!dirty_found && |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
505 (rec->index_flags & INDEX_MAIL_FLAG_DIRTY)) { |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
506 /* first dirty message */ |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
507 dirty_found = TRUE; |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
508 dirty_offset = offset; |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
509 |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
510 i_stream_seek(input, dirty_offset); |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
511 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
512 |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
513 if (dirty_found) { |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
514 /* write the From-line */ |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
515 if (!mbox_write(index, input, output, offset)) { |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
516 failed = TRUE; |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
517 break; |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
518 } |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
519 |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
520 /* write header, updating flag fields */ |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
521
diff
changeset
|
521 offset += hdr_size; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
522 if (!mbox_write_header(index, rec, seq, input, output, |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
521
diff
changeset
|
523 offset, hdr_size, body_size)) { |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
524 failed = TRUE; |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
525 break; |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
526 } |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
527 |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
528 /* write body */ |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
521
diff
changeset
|
529 offset += body_size; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
530 if (!mbox_write(index, input, output, offset)) { |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
531 failed = TRUE; |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
532 break; |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
533 } |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
534 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
535 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
536 seq++; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
537 rec = index->next(index, rec); |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
538 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
539 |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
540 if (!dirty_found) { |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
541 index_set_error(index, "Expected dirty messages not found " |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
542 "from mbox file %s", index->mbox_path); |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
543 failed = TRUE; |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
544 } |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
545 |
484
006202bcab99
input buffer limit wasn't reset in error conditions.
Timo Sirainen <tss@iki.fi>
parents:
452
diff
changeset
|
546 if (!failed) { |
006202bcab99
input buffer limit wasn't reset in error conditions.
Timo Sirainen <tss@iki.fi>
parents:
452
diff
changeset
|
547 /* always end with a \n */ |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
548 (void)o_stream_send(output, "\n", 1); |
484
006202bcab99
input buffer limit wasn't reset in error conditions.
Timo Sirainen <tss@iki.fi>
parents:
452
diff
changeset
|
549 } |
006202bcab99
input buffer limit wasn't reset in error conditions.
Timo Sirainen <tss@iki.fi>
parents:
452
diff
changeset
|
550 |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
551 if (output->closed) { |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
552 errno = output->stream_errno; |
221
ed0d5b17c7a4
Added extra functions for easier printing of error messages. Moved
Timo Sirainen <tss@iki.fi>
parents:
217
diff
changeset
|
553 mbox_set_syscall_error(index, "write()"); |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
554 failed = TRUE; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
555 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
556 |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
557 i_stream_unref(input); |
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
558 o_stream_unref(output); |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
559 |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
560 if (!failed) { |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
561 /* POSSIBLE DATA LOSS HERE. We're writing to the mbox file, |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
562 so if we get killed here before finished, we'll lose some |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
563 bytes. I can't really think of any way to fix this, |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
564 rename() is problematic too especially because of file |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
565 locking issues (new mail could be lost). |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
566 |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
567 Usually we're moving the data by just a few bytes, so |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
568 the data loss should never be more than those few bytes.. |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
569 If we moved more, we could have written the file from end |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
570 to beginning in blocks (it'd be a bit slow to do it in |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
571 blocks of ~1-10 bytes which is the usual case, so we don't |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
572 bother). |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
573 |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
574 Also, we might as well be shrinking the file, in which |
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
575 case we can't lose data. */ |
364
ea958a5b9de1
Added io_buffer_set_start_offset() and io_buffer_ref() and replaced
Timo Sirainen <tss@iki.fi>
parents:
363
diff
changeset
|
576 if (fd_copy(tmp_fd, index->mbox_fd, dirty_offset) == 0) { |
269
a4eb58705351
FSCK flag is removed at set_lock(), so it can't be directly set anywhere..
Timo Sirainen <tss@iki.fi>
parents:
241
diff
changeset
|
577 /* all ok, we need to fsck the index next time. |
a4eb58705351
FSCK flag is removed at set_lock(), so it can't be directly set anywhere..
Timo Sirainen <tss@iki.fi>
parents:
241
diff
changeset
|
578 use set_flags because set_lock() would remove it |
a4eb58705351
FSCK flag is removed at set_lock(), so it can't be directly set anywhere..
Timo Sirainen <tss@iki.fi>
parents:
241
diff
changeset
|
579 if we modified it directly */ |
a4eb58705351
FSCK flag is removed at set_lock(), so it can't be directly set anywhere..
Timo Sirainen <tss@iki.fi>
parents:
241
diff
changeset
|
580 index->set_flags |= MAIL_INDEX_FLAG_FSCK; |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
581 reset_dirty_flags(index); |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
582 } else { |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
583 mbox_set_syscall_error(index, "fd_copy()"); |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
584 failed = TRUE; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
585 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
586 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
587 |
559
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
556
diff
changeset
|
588 if (!index->set_lock(index, MAIL_LOCK_UNLOCK)) |
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
556
diff
changeset
|
589 failed = TRUE; |
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
556
diff
changeset
|
590 |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
591 (void)unlink(path); |
297
ef6ae9e1b585
some cleanups + fd leaks when recaching mailbox.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
592 |
312
f5e59d65d124
Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents:
303
diff
changeset
|
593 if (close(tmp_fd) < 0) |
297
ef6ae9e1b585
some cleanups + fd leaks when recaching mailbox.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
594 index_file_set_syscall_error(index, path, "close()"); |
559
c834e77b624c
Mostly mbox locking/syncing fixes. Still some problems though.
Timo Sirainen <tss@iki.fi>
parents:
556
diff
changeset
|
595 return !failed; |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
596 } |