annotate src/lib-index/mbox/mbox-rewrite.c @ 301:1d4d92c2e8c9 HEAD

fsck() before checking the rewrite-flag, so we won't write the 1-byte files..
author Timo Sirainen <tss@iki.fi>
date Mon, 23 Sep 2002 19:41:09 +0300
parents a101127403a7
children 19108e7c5af2
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 const char *status, *x_status, *x_keywords;
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;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 } MboxRewriteContext;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 /* 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
31 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
32 {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 MailIndexRecord *rec;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 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
36 while (rec != NULL) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 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
38 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
39 }
209
d85a6898bf39 Don't rewrite mbox if no flags were changed.
Timo Sirainen <tss@iki.fi>
parents: 194
diff changeset
40
d85a6898bf39 Don't rewrite mbox if no flags were changed.
Timo Sirainen <tss@iki.fi>
parents: 194
diff changeset
41 index->header->flags &= ~MAIL_INDEX_FLAG_DIRTY_MESSAGES;
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 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
45 uoff_t end_offset)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 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
48
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 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
50 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
51 return FALSE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 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
54 /* 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
55 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
56 "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
57 return FALSE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 }
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 return TRUE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
63 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
64 const char *list)
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 /* 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
67 char *ret, *p;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 unsigned int i;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 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
71 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
72 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
73 *p++ = value[i];
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 if (ret == p)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 return NULL;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 *p = '\0';
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
79 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
80 return ret;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
83 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
84 int index, void *context)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 TempString *str = context;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 if (index < 0) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 /* not found, keep it */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 if (str->len != 0)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 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
92 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
93 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
96 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
97 MboxRewriteContext *ctx)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 TempString *str;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 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
102 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
103 update_stripped_custom_flags, str);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 return str->str;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 static void header_func(MessagePart *part __attr_unused__,
184
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
108 const char *name, size_t name_len,
4223b9ed0c80 move size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 180
diff changeset
109 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
110 void *context)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 MboxRewriteContext *ctx = context;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 char *end;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 if (ctx->failed)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 return;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 if (name_len == 6 && strncasecmp(name, "Status", 6) == 0)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 ctx->status = strip_chars(value, value_len, "RO");
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 else if (name_len == 8 && strncasecmp(name, "X-Status", 8) == 0)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 ctx->x_status = strip_chars(value, value_len, "ADFT");
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 else if (name_len == 10 && strncasecmp(name, "X-Keywords", 10) == 0)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 ctx->x_keywords = strip_custom_flags(value, value_len, ctx);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 else if (name_len == 10 && strncasecmp(name, "X-IMAPbase", 10) == 0) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 if (ctx->seq == 1) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 /* 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
127 don't overflow it */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 t_push();
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 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
130 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
131 while (*end == ' ') end++;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 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
133 t_pop();
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 } else {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 /* save this header */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 (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
138 (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
139 (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
140 (void)io_buffer_send(ctx->outbuf, "\n", 1);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 if (ctx->outbuf->closed)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 ctx->failed = TRUE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 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
148 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
149 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
150 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
151 {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 /* 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
153 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
154 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
155 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
156
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 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
158
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 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
160 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
161 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
162 */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 MboxRewriteContext ctx;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 MessageSize hdr_size;
180
38341ad6a9db partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents: 160
diff changeset
165 const char *str, *flags, **custom_flags;
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 unsigned int field;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 int i;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 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
170 /* 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
171 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
172 "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
173 return FALSE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175
180
38341ad6a9db partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents: 160
diff changeset
176 t_push();
38341ad6a9db partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents: 160
diff changeset
177
38341ad6a9db partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents: 160
diff changeset
178 custom_flags = mail_custom_flags_list_get(index->custom_flags);
38341ad6a9db partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents: 160
diff changeset
179
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 /* 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
181 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
182 ctx.outbuf = outbuf;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 ctx.seq = seq;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 ctx.msg_flags = rec->msg_flags;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 ctx.custom_flags = custom_flags;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186
290
3dcc2275b4ca IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents: 269
diff changeset
187 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
188 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
189 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
190
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191 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
192
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 /* append the flag fields */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 if (seq == 1) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 /* write X-IMAPbase header to first message */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 if (ctx.uid_validity == 0)
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 ctx.uid_validity = index->header->uid_validity-1;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 str = t_strdup_printf("X-IMAPbase: %u %u",
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 ctx.uid_validity, ctx.uid_last);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 (void)io_buffer_send(outbuf, str, strlen(str));
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 for (i = 0; i < MAIL_CUSTOM_FLAGS_COUNT; i++) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 if (custom_flags[i] != NULL) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 (void)io_buffer_send(outbuf, " ", 1);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 (void)io_buffer_send(outbuf, custom_flags[i],
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 strlen(custom_flags[i]));
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 (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
211 }
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 if ((rec->msg_flags & MAIL_CUSTOM_FLAGS_MASK) ||
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 ctx.x_keywords != NULL) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 /* write X-Keywords header containing custom flags */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 (void)io_buffer_send(outbuf, "X-Keywords:", 11);
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 field = 1 << MAIL_CUSTOM_FLAG_1_BIT;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 for (i = 0; i < MAIL_CUSTOM_FLAGS_COUNT; i++, field <<= 1) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 if ((rec->msg_flags & field) &&
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 custom_flags[i] != NULL) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 (void)io_buffer_send(outbuf, " ", 1);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 (void)io_buffer_send(outbuf, custom_flags[i],
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 strlen(custom_flags[i]));
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 }
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
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 if (ctx.x_keywords != NULL && ctx.x_keywords[0] != '\0') {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 /* X-Keywords that aren't custom flags */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 (void)io_buffer_send(outbuf, " ", 1);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 (void)io_buffer_send(outbuf, ctx.x_keywords,
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 strlen(ctx.x_keywords));
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 (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
235 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 /* Status field */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 flags = (rec->msg_flags & MAIL_SEEN) ? "Status: RO" : "Status: O";
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 flags = t_strconcat(flags, ctx.status, NULL);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 (void)io_buffer_send(outbuf, flags, strlen(flags));
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 (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
242
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 /* X-Status field */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 if ((rec->msg_flags & (MAIL_SYSTEM_FLAGS_MASK^MAIL_SEEN)) != 0 ||
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 ctx.x_status != NULL) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 flags = t_strconcat("X-Status: ",
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 (rec->msg_flags & MAIL_ANSWERED) ? "A" : "",
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 (rec->msg_flags & MAIL_DRAFT) ? "D" : "",
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 (rec->msg_flags & MAIL_FLAGGED) ? "F" : "",
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250 (rec->msg_flags & MAIL_DELETED) ? "T" : "",
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 ctx.x_status, NULL);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252 (void)io_buffer_send(outbuf, flags, strlen(flags));
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 (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
254 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 t_pop();
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256
180
38341ad6a9db partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents: 160
diff changeset
257 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
258
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259 /* empty line ends headers */
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(outbuf, "\n", 1);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 return TRUE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264
180
38341ad6a9db partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents: 160
diff changeset
265 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
266 {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 /* Write it to temp file and then rename() to real file.
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 easier and much safer than moving data inside the file.
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 This rewriting relies quite a lot on valid header/body sizes
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 which fsck() should have ensured. */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 MailIndexRecord *rec;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 IOBuffer *inbuf, *outbuf;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 uoff_t offset;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 const char *path;
194
d82e7d23a28d more size_t fixes
Timo Sirainen <tss@iki.fi>
parents: 184
diff changeset
275 unsigned int seq;
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276 int in_fd, out_fd, failed;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278 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
279
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
280 if (!mbox_index_fsck(index))
1d4d92c2e8c9 fsck() before checking the rewrite-flag, so we won't write the 1-byte
Timo Sirainen <tss@iki.fi>
parents: 300
diff changeset
281 return FALSE;
1d4d92c2e8c9 fsck() before checking the rewrite-flag, so we won't write the 1-byte
Timo Sirainen <tss@iki.fi>
parents: 300
diff changeset
282
241
fc8ad9d30478 mbox fixes
Timo Sirainen <tss@iki.fi>
parents: 222
diff changeset
283 if ((index->header->flags & MAIL_INDEX_FLAG_DIRTY_MESSAGES) == 0) {
209
d85a6898bf39 Don't rewrite mbox if no flags were changed.
Timo Sirainen <tss@iki.fi>
parents: 194
diff changeset
284 /* no need to rewrite */
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 return TRUE;
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
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 in_fd = open(index->mbox_path, O_RDWR);
222
cf4d065f2f85 lots of cleanups. also index/datafile is now capable of staying in memory,
Timo Sirainen <tss@iki.fi>
parents: 221
diff changeset
289 if (in_fd == -1)
cf4d065f2f85 lots of cleanups. also index/datafile is now capable of staying in memory,
Timo Sirainen <tss@iki.fi>
parents: 221
diff changeset
290 return mbox_set_syscall_error(index, "open()");
cf4d065f2f85 lots of cleanups. also index/datafile is now capable of staying in memory,
Timo Sirainen <tss@iki.fi>
parents: 221
diff changeset
291
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292 out_fd = mail_index_create_temp_file(index, &path);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 if (out_fd == -1) {
297
ef6ae9e1b585 some cleanups + fd leaks when recaching mailbox.
Timo Sirainen <tss@iki.fi>
parents: 290
diff changeset
294 if (close(in_fd) < 0)
ef6ae9e1b585 some cleanups + fd leaks when recaching mailbox.
Timo Sirainen <tss@iki.fi>
parents: 290
diff changeset
295 mbox_set_syscall_error(index, "close()");
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296 return FALSE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 }
298
5509d87fe68b mbox locking changes. support read-locking now. there's still problems
Timo Sirainen <tss@iki.fi>
parents: 297
diff changeset
298
300
a101127403a7 keep exclusive lock while rewriting.
Timo Sirainen <tss@iki.fi>
parents: 298
diff changeset
299 if (!mbox_lock(index, index->mbox_path, in_fd, TRUE)) {
298
5509d87fe68b mbox locking changes. support read-locking now. there's still problems
Timo Sirainen <tss@iki.fi>
parents: 297
diff changeset
300 if (close(in_fd) < 0)
5509d87fe68b mbox locking changes. support read-locking now. there's still problems
Timo Sirainen <tss@iki.fi>
parents: 297
diff changeset
301 mbox_set_syscall_error(index, "close()");
5509d87fe68b mbox locking changes. support read-locking now. there's still problems
Timo Sirainen <tss@iki.fi>
parents: 297
diff changeset
302 if (close(out_fd) < 0)
5509d87fe68b mbox locking changes. support read-locking now. there's still problems
Timo Sirainen <tss@iki.fi>
parents: 297
diff changeset
303 index_file_set_syscall_error(index, path, "close()");
5509d87fe68b mbox locking changes. support read-locking now. there's still problems
Timo Sirainen <tss@iki.fi>
parents: 297
diff changeset
304 return FALSE;
5509d87fe68b mbox locking changes. support read-locking now. there's still problems
Timo Sirainen <tss@iki.fi>
parents: 297
diff changeset
305 }
5509d87fe68b mbox locking changes. support read-locking now. there's still problems
Timo Sirainen <tss@iki.fi>
parents: 297
diff changeset
306
5509d87fe68b mbox locking changes. support read-locking now. there's still problems
Timo Sirainen <tss@iki.fi>
parents: 297
diff changeset
307 inbuf = io_buffer_create_mmap(in_fd, default_pool,
5509d87fe68b mbox locking changes. support read-locking now. there's still problems
Timo Sirainen <tss@iki.fi>
parents: 297
diff changeset
308 MAIL_MMAP_BLOCK_SIZE, 0);
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309 outbuf = io_buffer_create_file(out_fd, default_pool, 8192);
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 failed = FALSE; seq = 1;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312 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
313 while (rec != NULL) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 /* 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
315 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
316 /* 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
317 failed = TRUE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318 break;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321 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
322 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
323 failed = TRUE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324 break;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327 /* write the From-line */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 if (!mbox_write(index, inbuf, outbuf, offset)) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329 failed = TRUE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330 break;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331 }
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 /* write header, updating flag fields */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334 offset += rec->header_size;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335 if (!mbox_write_header(index, rec, seq, inbuf, outbuf,
180
38341ad6a9db partial changes to add X-IMAPbase parser update custom flags
Timo Sirainen <tss@iki.fi>
parents: 160
diff changeset
336 offset)) {
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337 failed = TRUE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338 break;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
341 /* write body */
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 offset += rec->body_size;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 if (!mbox_write(index, inbuf, outbuf, offset)) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 failed = TRUE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 break;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
347
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348 seq++;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349 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
350 }
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 /* 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
353 (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
354 if (outbuf->closed) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355 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
356 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
357 failed = TRUE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360 if (!failed) {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
361 if (rename(path, index->mbox_path) == 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
362 /* 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
363 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
364 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
365 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
366 reset_dirty_flags(index);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
367 } else {
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
368 index_set_error(index, "rename(%s, %s) failed: %m",
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
369 path, index->mbox_path);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
370 failed = TRUE;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
372 }
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
373
298
5509d87fe68b mbox locking changes. support read-locking now. there's still problems
Timo Sirainen <tss@iki.fi>
parents: 297
diff changeset
374 (void)mbox_unlock(index, index->mbox_path, in_fd);
160
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375 (void)unlink(path);
297
ef6ae9e1b585 some cleanups + fd leaks when recaching mailbox.
Timo Sirainen <tss@iki.fi>
parents: 290
diff changeset
376
298
5509d87fe68b mbox locking changes. support read-locking now. there's still problems
Timo Sirainen <tss@iki.fi>
parents: 297
diff changeset
377 if (close(in_fd) < 0)
5509d87fe68b mbox locking changes. support read-locking now. there's still problems
Timo Sirainen <tss@iki.fi>
parents: 297
diff changeset
378 mbox_set_syscall_error(index, "close()");
297
ef6ae9e1b585 some cleanups + fd leaks when recaching mailbox.
Timo Sirainen <tss@iki.fi>
parents: 290
diff changeset
379 if (close(out_fd) < 0)
ef6ae9e1b585 some cleanups + fd leaks when recaching mailbox.
Timo Sirainen <tss@iki.fi>
parents: 290
diff changeset
380 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
381 io_buffer_destroy(outbuf);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
382 io_buffer_destroy(inbuf);
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
383 return failed;
ff05b320482c Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384 }