annotate src/lib-index/mbox/mbox-rewrite.c @ 556:9d72849fe68e HEAD

mbox locking fixes
author Timo Sirainen <tss@iki.fi>
date Tue, 29 Oct 2002 20:01:10 +0200
parents 3b53dd1280c6
children c834e77b624c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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"
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
4 #include "ibuffer.h"
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
5 #include "obuffer.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 {
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
19 OBuffer *outbuf;
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
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
52 static int mbox_write(MailIndex *index, IBuffer *inbuf, OBuffer *outbuf,
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
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
58 i_assert(inbuf->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
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
60 old_limit = inbuf->v_limit;
416
cca1c7004a6f Bugfixes to mbox and OBuffer handling.
Timo Sirainen <tss@iki.fi>
parents: 410
diff changeset
61 i_buffer_set_read_limit(inbuf, end_offset);
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
62 if (o_buffer_send_ibuffer(outbuf, inbuf) < 0) {
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",
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
64 index->mbox_path, strerror(outbuf->buf_errno));
484
006202bcab99 input buffer limit wasn't reset in error conditions.
Timo Sirainen <tss@iki.fi>
parents: 452
diff changeset
65 failed = TRUE;
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
66 } else if (inbuf->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
67 /* 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
68 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
69 "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
70 failed = TRUE;
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
71 } else {
484
006202bcab99 input buffer limit wasn't reset in error conditions.
Timo Sirainen <tss@iki.fi>
parents: 452
diff changeset
72 failed = FALSE;
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
75 i_buffer_set_read_limit(inbuf, old_limit);
484
006202bcab99 input buffer limit wasn't reset in error conditions.
Timo Sirainen <tss@iki.fi>
parents: 452
diff changeset
76 return !failed;
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78
362
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
79 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
80 {
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
81 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
82 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
83
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
84 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
85 ctx->uid_validity, ctx->uid_last);
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
86 if (o_buffer_send(ctx->outbuf, str, strlen(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
87 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
88
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
89 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
90 if (ctx->custom_flags[i] != NULL) {
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
91 if (o_buffer_send(ctx->outbuf, " ", 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
92 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
93
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
94 if (o_buffer_send(ctx->outbuf, ctx->custom_flags[i],
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
95 strlen(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
96 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
97 }
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
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
100 if (o_buffer_send(ctx->outbuf, "\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
101 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
102
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
103 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
104 }
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 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
107 {
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
108 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
109 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
110
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
111 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
112 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
113 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
114
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
115 if (o_buffer_send(ctx->outbuf, "X-Keywords:", 11) < 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
116 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
117
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
118 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
119 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
120 if ((ctx->msg_flags & field) && ctx->custom_flags[i] != NULL) {
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
121 if (o_buffer_send(ctx->outbuf, " ", 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
122 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
123
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
124 if (o_buffer_send(ctx->outbuf, ctx->custom_flags[i],
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
125 strlen(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
126 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
127 }
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 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
131 /* X-Keywords that aren't custom flags */
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
132 if (o_buffer_send(ctx->outbuf, " ", 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
133 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
134
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
135 if (o_buffer_send(ctx->outbuf, x_keywords,
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
136 strlen(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
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
140 if (o_buffer_send(ctx->outbuf, "\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
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
154 if (o_buffer_send(ctx->outbuf, str, strlen(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;
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
156 if (o_buffer_send(ctx->outbuf, "\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
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
178 if (o_buffer_send(ctx->outbuf, str, strlen(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;
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
180 if (o_buffer_send(ctx->outbuf, "\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 {
b0a62e264b22 Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents: 369
diff changeset
188 char str[MAX_LARGEST_T_STRLEN+30];
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
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
193 if (o_buffer_send(ctx->outbuf, str, strlen(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
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
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 {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 /* leave only unknown flags, very likely none */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 char *ret, *p;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 unsigned int i;
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
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
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
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
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
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
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
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
243 const char *name, size_t name_len,
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
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 */
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
286 (void)o_buffer_send(ctx->outbuf, name, name_len);
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
287 (void)o_buffer_send(ctx->outbuf, ": ", 2);
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
288 (void)o_buffer_send(ctx->outbuf, value, value_len);
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
289 (void)o_buffer_send(ctx->outbuf, "\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
362
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
292 if (ctx->outbuf->closed)
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,
525
2cb2e0a3423b Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents: 521
diff changeset
298 IBuffer *inbuf, OBuffer *outbuf, uoff_t end_offset,
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
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
315 if (inbuf->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));
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 ctx.outbuf = outbuf;
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
525
2cb2e0a3423b Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents: 521
diff changeset
333 i_buffer_set_read_limit(inbuf, inbuf->v_offset + hdr_size);
2cb2e0a3423b Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents: 521
diff changeset
334 message_parse_header(NULL, inbuf, &hdr_parsed_size, header_func, &ctx);
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
335 i_buffer_set_read_limit(inbuf, 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 */
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
357 (void)o_buffer_send(outbuf, "\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 {
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
364 IBuffer *inbuf;
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
365 OBuffer *outbuf;
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
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
375 inbuf = i_buffer_create_mmap(in_fd, data_stack_pool,
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);
532
3b53dd1280c6 I/O buffers now use real blocking instead of setting up a sub-ioloop to
Timo Sirainen <tss@iki.fi>
parents: 525
diff changeset
377 outbuf = o_buffer_create_file(out_fd, data_stack_pool, 1024, 0, FALSE);
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
378
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
379 ret = o_buffer_send_ibuffer(outbuf, inbuf);
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
380 if (ret < 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
381 errno = outbuf->buf_errno;
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
382 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
383 /* we may have shrinked the file */
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
384 i_assert(out_offset + inbuf->v_size <= OFF_T_MAX);
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
385 ret = ftruncate(out_fd, (off_t) (out_offset + inbuf->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
386 }
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
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
388 o_buffer_unref(outbuf);
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
389 i_buffer_unref(inbuf);
404
f25e575bf1ca Created datastack_mempool which is used by at least a few temporary
Timo Sirainen <tss@iki.fi>
parents: 389
diff changeset
390 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
391
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 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
393 }
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
180
38341ad6a9db partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents: 160
diff changeset
395 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
396 {
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
397 /* 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
398 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
399 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
400 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
401 MailIndexRecord *rec;
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
402 IBuffer *inbuf;
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
403 OBuffer *outbuf;
525
2cb2e0a3423b Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents: 521
diff changeset
404 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
405 const char *path;
194
d82e7d23a28d more size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
406 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
407 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
408
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
409 i_assert(index->lock_type == MAIL_LOCK_EXCLUSIVE);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
410
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
411 if ((index->header->flags & MAIL_INDEX_FLAG_DIRTY_MESSAGES) == 0) {
19108e7c5af2 Actually, first don't do anything if there's no dirty flags. Then fsck().
Timo Sirainen <tss@iki.fi>
parents: 301
diff changeset
412 /* 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
413 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
414 }
19108e7c5af2 Actually, first don't do anything if there's no dirty flags. Then fsck().
Timo Sirainen <tss@iki.fi>
parents: 301
diff changeset
415
556
9d72849fe68e mbox locking fixes
Timo Sirainen <tss@iki.fi>
parents: 532
diff changeset
416 tmp_fd = -1; inbuf = 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
417 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
418 do {
556
9d72849fe68e mbox locking fixes
Timo Sirainen <tss@iki.fi>
parents: 532
diff changeset
419 /* make sync() lock the file to prevent race conditions */
9d72849fe68e mbox locking fixes
Timo Sirainen <tss@iki.fi>
parents: 532
diff changeset
420 index->mbox_lock_next_sync = MAIL_LOCK_EXCLUSIVE;
9d72849fe68e mbox locking fixes
Timo Sirainen <tss@iki.fi>
parents: 532
diff changeset
421 if (!index->sync(index))
9d72849fe68e mbox locking fixes
Timo Sirainen <tss@iki.fi>
parents: 532
diff changeset
422 break;
9d72849fe68e mbox locking fixes
Timo Sirainen <tss@iki.fi>
parents: 532
diff changeset
423
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 484
diff changeset
424 inbuf = mbox_get_inbuf(index, 0, MAIL_LOCK_EXCLUSIVE);
364
ea958a5b9de1 Added io_buffer_set_start_offset() and io_buffer_ref() and replaced
Timo Sirainen <tss@iki.fi>
parents: 363
diff changeset
425 if (inbuf == 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
426 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
427
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
428 if ((index->header->flags &
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
429 MAIL_INDEX_FLAG_DIRTY_MESSAGES) == 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
430 /* 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
431 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
432 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
433 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
434 }
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
435
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
436 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
437 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
438 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
439
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 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
441 } 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
442
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 if (!rewrite) {
521
83da62e0675a mbox locking fixes / changes. we now read-lock the mbox file before syncing
Timo Sirainen <tss@iki.fi>
parents: 484
diff changeset
444 (void)mbox_unlock(index);
364
ea958a5b9de1 Added io_buffer_set_start_offset() and io_buffer_ref() and replaced
Timo Sirainen <tss@iki.fi>
parents: 363
diff changeset
445 if (inbuf != NULL)
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
446 i_buffer_unref(inbuf);
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
447 return !failed;
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
448 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
449
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
450 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
451 /* 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
452 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
453 } 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
454 dirty_found = FALSE;
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
455 }
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
456 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
457
525
2cb2e0a3423b Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents: 521
diff changeset
458 //offset = hdr_size = body_size = 0; /* just to keep compiler happy */
2cb2e0a3423b Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents: 521
diff changeset
459
404
f25e575bf1ca Created datastack_mempool which is used by at least a few temporary
Timo Sirainen <tss@iki.fi>
parents: 389
diff changeset
460 t_push();
532
3b53dd1280c6 I/O buffers now use real blocking instead of setting up a sub-ioloop to
Timo Sirainen <tss@iki.fi>
parents: 525
diff changeset
461 outbuf = o_buffer_create_file(tmp_fd, data_stack_pool, 8192, 0, FALSE);
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 failed = FALSE; seq = 1;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
464 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
465 while (rec != NULL) {
383
652553a9f54c minor speedups
Timo Sirainen <tss@iki.fi>
parents: 370
diff changeset
466 if (dirty_found || (rec->index_flags & INDEX_MAIL_FLAG_DIRTY)) {
652553a9f54c minor speedups
Timo Sirainen <tss@iki.fi>
parents: 370
diff changeset
467 /* 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
468 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
469 &hdr_size, &body_size)) {
383
652553a9f54c minor speedups
Timo Sirainen <tss@iki.fi>
parents: 370
diff changeset
470 /* fsck should have fixed it */
652553a9f54c minor speedups
Timo Sirainen <tss@iki.fi>
parents: 370
diff changeset
471 failed = TRUE;
652553a9f54c minor speedups
Timo Sirainen <tss@iki.fi>
parents: 370
diff changeset
472 break;
652553a9f54c minor speedups
Timo Sirainen <tss@iki.fi>
parents: 370
diff changeset
473 }
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
474
525
2cb2e0a3423b Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents: 521
diff changeset
475 if (offset + hdr_size + body_size > inbuf->v_size) {
383
652553a9f54c minor speedups
Timo Sirainen <tss@iki.fi>
parents: 370
diff changeset
476 index_set_corrupted(index,
652553a9f54c minor speedups
Timo Sirainen <tss@iki.fi>
parents: 370
diff changeset
477 "Invalid message size");
652553a9f54c minor speedups
Timo Sirainen <tss@iki.fi>
parents: 370
diff changeset
478 failed = TRUE;
652553a9f54c minor speedups
Timo Sirainen <tss@iki.fi>
parents: 370
diff changeset
479 break;
652553a9f54c minor speedups
Timo Sirainen <tss@iki.fi>
parents: 370
diff changeset
480 }
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
481 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
482
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
483 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
484 (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
485 /* 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
486 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
487 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
488
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
489 i_buffer_seek(inbuf, dirty_offset);
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
490 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
491
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
492 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
493 /* write the From-line */
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
494 if (!mbox_write(index, inbuf, outbuf, 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
495 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
496 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
497 }
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
498
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
499 /* 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
500 offset += hdr_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
501 if (!mbox_write_header(index, rec, seq, inbuf, outbuf,
525
2cb2e0a3423b Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents: 521
diff changeset
502 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
503 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
504 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
505 }
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
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 /* 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
508 offset += 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
509 if (!mbox_write(index, inbuf, outbuf, 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
510 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
511 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
512 }
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
513 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
514
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
515 seq++;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
516 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
517 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
518
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
519 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
520 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
521 "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
522 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
523 }
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
484
006202bcab99 input buffer limit wasn't reset in error conditions.
Timo Sirainen <tss@iki.fi>
parents: 452
diff changeset
525 if (!failed) {
006202bcab99 input buffer limit wasn't reset in error conditions.
Timo Sirainen <tss@iki.fi>
parents: 452
diff changeset
526 /* always end with a \n */
006202bcab99 input buffer limit wasn't reset in error conditions.
Timo Sirainen <tss@iki.fi>
parents: 452
diff changeset
527 (void)o_buffer_send(outbuf, "\n", 1);
006202bcab99 input buffer limit wasn't reset in error conditions.
Timo Sirainen <tss@iki.fi>
parents: 452
diff changeset
528 }
006202bcab99 input buffer limit wasn't reset in error conditions.
Timo Sirainen <tss@iki.fi>
parents: 452
diff changeset
529
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
530 if (outbuf->closed) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
531 errno = outbuf->buf_errno;
221
ed0d5b17c7a4 Added extra functions for easier printing of error messages. Moved
Timo Sirainen <tss@iki.fi>
parents: 217
diff changeset
532 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
533 failed = TRUE;
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
410
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
536 i_buffer_unref(inbuf);
1f0e7229ee58 Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents: 404
diff changeset
537 o_buffer_unref(outbuf);
404
f25e575bf1ca Created datastack_mempool which is used by at least a few temporary
Timo Sirainen <tss@iki.fi>
parents: 389
diff changeset
538 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
539
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
540 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
541 /* 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
542 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
543 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
544 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
545 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
546
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
547 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
548 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
549 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
550 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
551 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
552 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
553
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
554 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
555 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
556 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
557 /* 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
558 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
559 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
560 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
561 reset_dirty_flags(index);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
562 } 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
563 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
564 failed = TRUE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
565 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
566 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
567
365
cb405d2f5fd5 mbox locking cleanups
Timo Sirainen <tss@iki.fi>
parents: 364
diff changeset
568 (void)mbox_unlock(index);
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
569 (void)unlink(path);
297
ef6ae9e1b585 some cleanups + fd leaks when recaching mailbox.
Timo Sirainen <tss@iki.fi>
parents: 290
diff changeset
570
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
571 if (close(tmp_fd) < 0)
297
ef6ae9e1b585 some cleanups + fd leaks when recaching mailbox.
Timo Sirainen <tss@iki.fi>
parents: 290
diff changeset
572 index_file_set_syscall_error(index, path, "close()");
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
573 return failed;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
574 }