annotate src/lib-index/mbox/mbox-rewrite.c @ 370:b0a62e264b22 HEAD

Write Content-Length header for rewritten messages.
author Timo Sirainen <tss@iki.fi>
date Sun, 06 Oct 2002 12:34:54 +0300
parents d037915978ca
children 652553a9f54c
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"
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "iobuffer.h"
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "temp-string.h"
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "write-full.h"
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #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
8 #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
9 #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
10 #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
11
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include <stdio.h>
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include <stdlib.h>
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include <unistd.h>
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #include <fcntl.h>
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 typedef struct {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 IOBuffer *outbuf;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 int failed;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20
370
b0a62e264b22 Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents: 369
diff changeset
21 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
22 unsigned int seq;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 unsigned int msg_flags;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 const char **custom_flags;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 unsigned int uid_validity;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 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
28
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
29 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
30 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
31 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
32 unsigned int xstatus_found:1;
370
b0a62e264b22 Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents: 369
diff changeset
33 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
34 } MboxRewriteContext;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 /* 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
37 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
38 {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 MailIndexRecord *rec;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 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
42 while (rec != NULL) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 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
44 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
45 }
209
d85a6898bf39 Don't rewrite mbox if no flags were changed.
Timo Sirainen <tss@iki.fi>
parents: 194
diff changeset
46
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
47 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
48 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
49 }
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 static int mbox_write(MailIndex *index, IOBuffer *inbuf, IOBuffer *outbuf,
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 uoff_t end_offset)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 i_assert(inbuf->offset <= end_offset);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 if (io_buffer_send_iobuffer(outbuf, inbuf,
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 end_offset - inbuf->offset) < 0)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 return FALSE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 if (inbuf->offset < end_offset) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 /* 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
62 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
63 "Unexpected end of file", index->mbox_path);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 return FALSE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 return TRUE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69
362
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
70 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
71 {
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
72 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
73 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
74
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
75 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
76 ctx->uid_validity, ctx->uid_last);
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
77 if (io_buffer_send(ctx->outbuf, str, strlen(str)) < 0)
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
78 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
79
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
80 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
81 if (ctx->custom_flags[i] != NULL) {
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
82 if (io_buffer_send(ctx->outbuf, " ", 1) < 0)
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
83 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
84
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
85 if (io_buffer_send(ctx->outbuf, ctx->custom_flags[i],
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
86 strlen(ctx->custom_flags[i])) < 0)
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 }
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
90
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
91 if (io_buffer_send(ctx->outbuf, "\n", 1) < 0)
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
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
94 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
95 }
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
96
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
97 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
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 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
100 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
101
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
102 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
103 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
104 return TRUE;
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
105
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
106 if (io_buffer_send(ctx->outbuf, "X-Keywords:", 11) < 0)
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
107 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
108
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
109 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
110 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
111 if ((ctx->msg_flags & field) && ctx->custom_flags[i] != NULL) {
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
112 if (io_buffer_send(ctx->outbuf, " ", 1) < 0)
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
113 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
114
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
115 if (io_buffer_send(ctx->outbuf, ctx->custom_flags[i],
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
116 strlen(ctx->custom_flags[i])) < 0)
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
117 return FALSE;
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
118 }
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
119 }
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
120
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
121 if (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
122 /* X-Keywords that aren't custom flags */
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
123 if (io_buffer_send(ctx->outbuf, " ", 1) < 0)
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
124 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
125
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
126 if (io_buffer_send(ctx->outbuf, 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
127 strlen(x_keywords)) < 0)
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
128 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
129 }
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
130
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
131 if (io_buffer_send(ctx->outbuf, "\n", 1) < 0)
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
132 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
133
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
134 return TRUE;
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
135 }
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
136
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
137 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
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 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
140
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
141 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
142 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
143 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
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 if (io_buffer_send(ctx->outbuf, str, strlen(str)) < 0)
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
146 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
147 if (io_buffer_send(ctx->outbuf, "\n", 1) < 0)
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
148 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
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 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
151 }
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
152
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
153 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
154 {
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
155 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
156
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
157 /* 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
158 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
159 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
160 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
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 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
163 (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
164 (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
165 (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
166 (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
167 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
168
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
169 if (io_buffer_send(ctx->outbuf, str, strlen(str)) < 0)
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
170 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
171 if (io_buffer_send(ctx->outbuf, "\n", 1) < 0)
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
172 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
173
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
174 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
175 }
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
176
370
b0a62e264b22 Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents: 369
diff changeset
177 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
178 {
b0a62e264b22 Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents: 369
diff changeset
179 char str[MAX_LARGEST_T_STRLEN+30];
b0a62e264b22 Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents: 369
diff changeset
180
b0a62e264b22 Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents: 369
diff changeset
181 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
182 ctx->content_length);
b0a62e264b22 Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents: 369
diff changeset
183
b0a62e264b22 Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents: 369
diff changeset
184 if (io_buffer_send(ctx->outbuf, str, strlen(str)) < 0)
b0a62e264b22 Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents: 369
diff changeset
185 return FALSE;
b0a62e264b22 Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents: 369
diff changeset
186 return TRUE;
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
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
189 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
190 const char *list)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191 {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 /* 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
193 char *ret, *p;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 unsigned int i;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 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
197 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
198 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
199 *p++ = value[i];
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
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 if (ret == p)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 return NULL;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 *p = '\0';
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
205 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
206 return ret;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
209 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
210 int index, void *context)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 TempString *str = context;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 if (index < 0) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 /* not found, keep it */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 if (str->len != 0)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 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
218 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
219 }
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
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
222 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
223 MboxRewriteContext *ctx)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 TempString *str;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 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
228 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
229 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
230 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
231 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 static void header_func(MessagePart *part __attr_unused__,
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
234 const char *name, size_t name_len,
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
235 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
236 void *context)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 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
239 const char *str;
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 char *end;
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 if (ctx->failed)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 return;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244
362
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
245 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
246 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
247 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
248 (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
249 } 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
250 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
251 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
252 (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
253 } 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
254 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
255 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
256 (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
257 } 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
258 if (ctx->seq == 1) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259 /* 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
260 don't overflow it */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261 t_push();
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 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
263 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
264 while (*end == ' ') end++;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265 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
266 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
267
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
268 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
269 (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
270 }
370
b0a62e264b22 Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents: 369
diff changeset
271 } else if (name_len == 14 &&
b0a62e264b22 Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents: 369
diff changeset
272 strncasecmp(name, "Content-Length", 14) == 0) {
b0a62e264b22 Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents: 369
diff changeset
273 ctx->content_length_found = TRUE;
b0a62e264b22 Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents: 369
diff changeset
274 (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
275 } 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
276 /* save this header */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 (void)io_buffer_send(ctx->outbuf, name, name_len);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278 (void)io_buffer_send(ctx->outbuf, ": ", 2);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279 (void)io_buffer_send(ctx->outbuf, value, value_len);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 (void)io_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
281 }
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282
362
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
283 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
284 ctx->failed = TRUE;
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287 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
288 MailIndexRecord *rec, unsigned int seq,
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289 IOBuffer *inbuf, IOBuffer *outbuf,
180
38341ad6a9db partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents: 160
diff changeset
290 uoff_t end_offset)
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291 {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292 /* 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
293 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
294 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
295 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
296
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 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
298
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299 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
300 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
301 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
302 */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303 MboxRewriteContext ctx;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304 MessageSize hdr_size;
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 if (inbuf->offset >= end_offset) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 /* 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
308 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
309 "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
310 return FALSE;
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
180
38341ad6a9db partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents: 160
diff changeset
313 t_push();
38341ad6a9db partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents: 160
diff changeset
314
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315 /* 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
316 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
317 ctx.outbuf = outbuf;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318 ctx.seq = seq;
370
b0a62e264b22 Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents: 369
diff changeset
319 ctx.content_length = rec->body_size;
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320 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
321 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
322 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
323
290
3dcc2275b4ca IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents: 269
diff changeset
324 io_buffer_set_read_limit(inbuf, inbuf->offset + rec->header_size);
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 message_parse_header(NULL, inbuf, &hdr_size, header_func, &ctx);
290
3dcc2275b4ca IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents: 269
diff changeset
326 io_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
327
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 i_assert(hdr_size.physical_size == rec->header_size);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330 /* 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
331 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
332 /* 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
333 (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
334 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335
362
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
336 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
337 (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
338 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
339 (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
340 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
341 (void)mbox_write_xstatus(&ctx, NULL);
370
b0a62e264b22 Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents: 369
diff changeset
342 if (!ctx.content_length_found)
b0a62e264b22 Write Content-Length header for rewritten messages.
Timo Sirainen <tss@iki.fi>
parents: 369
diff changeset
343 (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
344
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 t_pop();
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346
180
38341ad6a9db partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents: 160
diff changeset
347 mail_custom_flags_list_unref(index->custom_flags);
38341ad6a9db partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents: 160
diff changeset
348
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349 /* empty line ends headers */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350 (void)io_buffer_send(outbuf, "\n", 1);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352 return TRUE;
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
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
355 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
356 {
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
357 IOBuffer *inbuf, *outbuf;
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
358 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
359
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
360 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
361
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 if (lseek(in_fd, 0, 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
363 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
364 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
365 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
366
363
567e932cdc66 Added autoclose_fd-flag for io_buffer_create_file() and
Timo Sirainen <tss@iki.fi>
parents: 362
diff changeset
367 inbuf = io_buffer_create_mmap(in_fd, default_pool, 65536, 0, FALSE);
567e932cdc66 Added autoclose_fd-flag for io_buffer_create_file() and
Timo Sirainen <tss@iki.fi>
parents: 362
diff changeset
368 outbuf = io_buffer_create_file(out_fd, default_pool, 1024, 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
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 ret = io_buffer_send_iobuffer(outbuf, inbuf, inbuf->size);
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 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
372 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
373 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
374 /* we may have shrinked the 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
375 i_assert(out_offset + inbuf->size <= 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
376 ret = ftruncate(out_fd, (off_t) (out_offset + inbuf->size));
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
377 }
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
364
ea958a5b9de1 Added io_buffer_set_start_offset() and io_buffer_ref() and replaced
Timo Sirainen <tss@iki.fi>
parents: 363
diff changeset
379 io_buffer_unref(outbuf);
ea958a5b9de1 Added io_buffer_set_start_offset() and io_buffer_ref() and replaced
Timo Sirainen <tss@iki.fi>
parents: 363
diff changeset
380 io_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
381
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 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
383 }
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
384
180
38341ad6a9db partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents: 160
diff changeset
385 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
386 {
312
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
387 /* 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
388 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
389 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
390 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
391 MailIndexRecord *rec;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 IOBuffer *inbuf, *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
393 uoff_t offset, dirty_offset;
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394 const char *path;
194
d82e7d23a28d more size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
395 unsigned int seq;
364
ea958a5b9de1 Added io_buffer_set_start_offset() and io_buffer_ref() and replaced
Timo Sirainen <tss@iki.fi>
parents: 363
diff changeset
396 int tmp_fd, failed, dirty_found, locked, rewrite;
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
397
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398 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
399
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
400 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
401 /* 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
402 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
403 }
19108e7c5af2 Actually, first don't do anything if there's no dirty flags. Then fsck().
Timo Sirainen <tss@iki.fi>
parents: 301
diff changeset
404
364
ea958a5b9de1 Added io_buffer_set_start_offset() and io_buffer_ref() and replaced
Timo Sirainen <tss@iki.fi>
parents: 363
diff changeset
405 tmp_fd = -1; locked = 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
406 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
407 do {
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
408 /* lock before fscking to prevent race conditions between
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
409 fsck's unlock and our lock. */
364
ea958a5b9de1 Added io_buffer_set_start_offset() and io_buffer_ref() and replaced
Timo Sirainen <tss@iki.fi>
parents: 363
diff changeset
410 inbuf = mbox_file_open(index, 0, TRUE);
ea958a5b9de1 Added io_buffer_set_start_offset() and io_buffer_ref() and replaced
Timo Sirainen <tss@iki.fi>
parents: 363
diff changeset
411 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
412 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
413
365
cb405d2f5fd5 mbox locking cleanups
Timo Sirainen <tss@iki.fi>
parents: 364
diff changeset
414 if (!mbox_lock_write(index))
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
415 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
416 locked = 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
417
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 if (!mbox_index_fsck(index))
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
419 break;
301
1d4d92c2e8c9 fsck() before checking the rewrite-flag, so we won't write the 1-byte
Timo Sirainen <tss@iki.fi>
parents: 300
diff changeset
420
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
421 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
422 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
423 /* 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
424 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
425 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
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
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 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
430 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
431 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
432
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 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
434 } 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
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 if (!rewrite) {
365
cb405d2f5fd5 mbox locking cleanups
Timo Sirainen <tss@iki.fi>
parents: 364
diff changeset
437 if (locked)
cb405d2f5fd5 mbox locking cleanups
Timo Sirainen <tss@iki.fi>
parents: 364
diff changeset
438 (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
439 if (inbuf != NULL)
ea958a5b9de1 Added io_buffer_set_start_offset() and io_buffer_ref() and replaced
Timo Sirainen <tss@iki.fi>
parents: 363
diff changeset
440 io_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
441 return !failed;
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
442 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
443
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
444 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
445 /* 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
446 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
447 } 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
448 dirty_found = FALSE;
160
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 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
451
363
567e932cdc66 Added autoclose_fd-flag for io_buffer_create_file() and
Timo Sirainen <tss@iki.fi>
parents: 362
diff changeset
452 outbuf = io_buffer_create_file(tmp_fd, default_pool, 8192, FALSE);
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
453
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
454 failed = FALSE; seq = 1;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
455 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
456 while (rec != NULL) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
457 /* get offset to beginning of mail headers */
221
ed0d5b17c7a4 Added extra functions for easier printing of error messages. Moved
Timo Sirainen <tss@iki.fi>
parents: 217
diff changeset
458 if (!mbox_mail_get_start_offset(index, rec, &offset)) {
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
459 /* fsck should have fixed it */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
460 failed = TRUE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
461 break;
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
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
464 if (offset + rec->header_size + rec->body_size > inbuf->size) {
221
ed0d5b17c7a4 Added extra functions for easier printing of error messages. Moved
Timo Sirainen <tss@iki.fi>
parents: 217
diff changeset
465 index_set_corrupted(index, "Invalid message size");
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
466 failed = TRUE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
467 break;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
468 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
469
312
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
470 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
471 (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
472 /* 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
473 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
474 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
475
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
476 io_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
477 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
478
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
479 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
480 /* 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
481 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
482 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
483 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
484 }
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
485
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
486 /* write header, updating flag fields */
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 offset += rec->header_size;
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 if (!mbox_write_header(index, rec, seq, inbuf, outbuf,
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
489 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
490 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
491 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
492 }
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
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 /* write body */
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 offset += rec->body_size;
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 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
497 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
498 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
499 }
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
500 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
501
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
502 seq++;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
503 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
504 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
505
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
506 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
507 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
508 "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
509 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
510 }
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
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
512 /* always end with a \n */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
513 (void)io_buffer_send(outbuf, "\n", 1);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
514 if (outbuf->closed) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
515 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
516 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
517 failed = TRUE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
518 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
519
364
ea958a5b9de1 Added io_buffer_set_start_offset() and io_buffer_ref() and replaced
Timo Sirainen <tss@iki.fi>
parents: 363
diff changeset
520 io_buffer_unref(inbuf);
ea958a5b9de1 Added io_buffer_set_start_offset() and io_buffer_ref() and replaced
Timo Sirainen <tss@iki.fi>
parents: 363
diff changeset
521 io_buffer_unref(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
522
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
523 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
524 /* 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
525 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
526 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
527 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
528 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
529
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
530 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
531 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
532 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
533 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
534 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
535 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
536
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
537 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
538 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
539 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
540 /* 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
541 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
542 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
543 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
544 reset_dirty_flags(index);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
545 } 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
546 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
547 failed = TRUE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
548 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
549 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
550
365
cb405d2f5fd5 mbox locking cleanups
Timo Sirainen <tss@iki.fi>
parents: 364
diff changeset
551 (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
552 (void)unlink(path);
297
ef6ae9e1b585 some cleanups + fd leaks when recaching mailbox.
Timo Sirainen <tss@iki.fi>
parents: 290
diff changeset
553
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
554 if (close(tmp_fd) < 0)
297
ef6ae9e1b585 some cleanups + fd leaks when recaching mailbox.
Timo Sirainen <tss@iki.fi>
parents: 290
diff changeset
555 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
556 return failed;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
557 }