annotate src/lib-index/mbox/mbox-rewrite.c @ 362:aa449d013563 HEAD

When updating any of the fields, keep them in the original location in header instead of moving to bottom.
author Timo Sirainen <tss@iki.fi>
date Sun, 06 Oct 2002 05:54:35 +0300
parents f5e59d65d124
children 567e932cdc66
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
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 unsigned int seq;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 unsigned int msg_flags;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 const char **custom_flags;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 unsigned int uid_validity;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 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
27
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
28 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
29 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
30 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
31 unsigned int xstatus_found:1;
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 } MboxRewriteContext;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 /* 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
35 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
36 {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 MailIndexRecord *rec;
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 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
40 while (rec != NULL) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 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
42 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
43 }
209
d85a6898bf39 Don't rewrite mbox if no flags were changed.
Timo Sirainen <tss@iki.fi>
parents: 194
diff changeset
44
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
45 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
46 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
47 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 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
50 uoff_t end_offset)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 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
53
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 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
55 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
56 return FALSE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 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
59 /* 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
60 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
61 "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
62 return FALSE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 return TRUE;
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
362
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
68 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
69 {
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
70 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
71 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
72
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
73 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
74 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
75 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
76 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
77
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
78 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
79 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
80 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
81 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
82
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
83 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
84 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
85 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
86 }
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
87 }
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 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
90 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
91
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 TRUE;
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
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
95 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
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 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
98 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
99
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
100 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
101 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
102 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
103
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
104 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
105 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
106
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
107 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
108 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
109 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
110 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
111 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
112
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
113 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
114 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
115 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
116 }
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
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
119 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
120 /* 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
121 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
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
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
124 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
125 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
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 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
130 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
131
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 TRUE;
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
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
135 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
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 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
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 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
140 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
141 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
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 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
144 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
145 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
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
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 TRUE;
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
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
151 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
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 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
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 /* 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
156 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
157 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
158 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
159
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
160 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
161 (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
162 (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
163 (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
164 (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
165 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
166
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 (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
168 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
169 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
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
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 TRUE;
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
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
175 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
176 const char *list)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 /* 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
179 char *ret, *p;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 unsigned int i;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 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
183 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
184 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
185 *p++ = value[i];
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 if (ret == p)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 return NULL;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 *p = '\0';
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
191 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
192 return ret;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
195 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
196 int index, void *context)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 TempString *str = context;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 if (index < 0) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 /* not found, keep it */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 if (str->len != 0)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 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
204 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
205 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
208 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
209 MboxRewriteContext *ctx)
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 TempString *str;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 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
214 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
215 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
216 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
217 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 static void header_func(MessagePart *part __attr_unused__,
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
220 const char *name, size_t name_len,
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
221 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
222 void *context)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 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
225 const char *str;
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 char *end;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 if (ctx->failed)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 return;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230
362
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
231 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
232 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
233 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
234 (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
235 } 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
236 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
237 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
238 (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
239 } 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
240 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
241 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
242 (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
243 } 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
244 if (ctx->seq == 1) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 /* 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
246 don't overflow it */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 t_push();
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 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
249 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
250 while (*end == ' ') end++;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 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
252 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
253
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 (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
256 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 } else {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258 /* save this header */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259 (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
260 (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
261 (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
262 (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
263 }
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264
362
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
265 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
266 ctx->failed = TRUE;
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 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
270 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
271 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
272 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
273 {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 /* 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
275 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
276 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
277 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
278
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279 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
280
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 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
282 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
283 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
284 */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 MboxRewriteContext ctx;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 MessageSize hdr_size;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 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
289 /* 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
290 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
291 "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
292 return FALSE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294
180
38341ad6a9db partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents: 160
diff changeset
295 t_push();
38341ad6a9db partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents: 160
diff changeset
296
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 /* 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
298 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
299 ctx.outbuf = outbuf;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 ctx.seq = seq;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 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
302 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
303 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
304
290
3dcc2275b4ca IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents: 269
diff changeset
305 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
306 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
307 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
308
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309 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
310
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 /* 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
312 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
313 /* 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
314 (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
315 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316
362
aa449d013563 When updating any of the fields, keep them in the original location in
Timo Sirainen <tss@iki.fi>
parents: 312
diff changeset
317 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
318 (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
319 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
320 (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
321 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
322 (void)mbox_write_xstatus(&ctx, NULL);
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324 t_pop();
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325
180
38341ad6a9db partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents: 160
diff changeset
326 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
327
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 /* empty line ends headers */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329 (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
330
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331 return TRUE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
333
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
334 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
335 {
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
336 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
337 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
338
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
339 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
340
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
341 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
342 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
343 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
344 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
345
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
346 inbuf = io_buffer_create_mmap(in_fd, default_pool, 65536, 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
347 outbuf = io_buffer_create_file(out_fd, default_pool, 1024);
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
348
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
349 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
350 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
351 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
352 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
353 /* 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
354 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
355 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
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
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 io_buffer_destroy(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
359 io_buffer_destroy(inbuf);
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
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 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
362 }
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
180
38341ad6a9db partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents: 160
diff changeset
364 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
365 {
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 /* 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
367 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
368 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
369 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
370 MailIndexRecord *rec;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371 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
372 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
373 const char *path;
194
d82e7d23a28d more size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
374 unsigned int seq;
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
375 int mbox_fd, 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
376
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
377 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
378
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
379 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
380 /* 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
381 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
382 }
19108e7c5af2 Actually, first don't do anything if there's no dirty flags. Then fsck().
Timo Sirainen <tss@iki.fi>
parents: 301
diff changeset
383
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
384 mbox_fd = tmp_fd = -1; locked = 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
385 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
386 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
387 /* 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
388 fsck's unlock and our lock. */
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 mbox_fd = open(index->mbox_path, O_RDWR);
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 if (mbox_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
391 mbox_set_syscall_error(index, "open()");
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 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
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
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
395 if (!mbox_lock(index, index->mbox_path, mbox_fd, 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
396 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
397 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
398
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 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
400 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
401
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
402 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
403 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
404 /* 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
405 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
406 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
407 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
408 }
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
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
410 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
411 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
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
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
414 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
415 } 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
416
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 if (!rewrite) {
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 (locked)
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 (void)mbox_unlock(index, index->mbox_path, mbox_fd);
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
420 if (mbox_fd != -1 && close(mbox_fd) < 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
421 mbox_set_syscall_error(index, "close()");
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 return !failed;
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
424
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
425 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
426 /* 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
427 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
428 } 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
429 dirty_found = FALSE;
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
430 }
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
431 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
432
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
433 inbuf = io_buffer_create_mmap(mbox_fd, default_pool,
298
5509d87fe68b mbox locking changes. support read-locking now. there's still problems
Timo Sirainen <tss@iki.fi>
parents: 297
diff changeset
434 MAIL_MMAP_BLOCK_SIZE, 0);
312
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
435 outbuf = io_buffer_create_file(tmp_fd, default_pool, 8192);
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
436
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437 failed = FALSE; seq = 1;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438 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
439 while (rec != NULL) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
440 /* 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
441 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
442 /* 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
443 failed = TRUE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
444 break;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
445 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
446
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
447 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
448 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
449 failed = TRUE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
450 break;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
451 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
452
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
453 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
454 (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
455 /* 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
456 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
457 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
458
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
459 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
460 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
461
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
462 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
463 /* 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
464 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
465 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
466 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
467 }
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
468
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
469 /* 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
470 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
471 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
472 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
473 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
474 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
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
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
477 /* 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
478 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
479 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
480 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
481 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
482 }
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
483 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
484
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
485 seq++;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
486 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
487 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
488
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
489 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
490 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
491 "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
492 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
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
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
495 /* 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
496 (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
497 if (outbuf->closed) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
498 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
499 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
500 failed = TRUE;
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
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 io_buffer_destroy(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
504 io_buffer_destroy(inbuf);
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
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
506 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
507 /* 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
508 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
509 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
510 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
511 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
512
f5e59d65d124 Rewrite only needed parts of mbox. We don't rename() anymore, which means we
Timo Sirainen <tss@iki.fi>
parents: 303
diff changeset
513 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
514 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
515 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
516 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
517 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
518 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
519
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 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
521 case we can't lose data. */
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 if (fd_copy(tmp_fd, 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
523 /* 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
524 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
525 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
526 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
527 reset_dirty_flags(index);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
528 } 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
529 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
530 failed = TRUE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
531 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
532 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
533
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
534 (void)mbox_unlock(index, index->mbox_path, mbox_fd);
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
535 (void)unlink(path);
297
ef6ae9e1b585 some cleanups + fd leaks when recaching mailbox.
Timo Sirainen <tss@iki.fi>
parents: 290
diff changeset
536
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
537 if (close(mbox_fd) < 0)
298
5509d87fe68b mbox locking changes. support read-locking now. there's still problems
Timo Sirainen <tss@iki.fi>
parents: 297
diff changeset
538 mbox_set_syscall_error(index, "close()");
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 if (close(tmp_fd) < 0)
297
ef6ae9e1b585 some cleanups + fd leaks when recaching mailbox.
Timo Sirainen <tss@iki.fi>
parents: 290
diff changeset
540 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
541 return failed;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
542 }