annotate src/lib-index/mail-index.c @ 2407:fed6d07bd8ee HEAD

Transaction log file is now read-lockless.
author Timo Sirainen <tss@iki.fi>
date Sat, 31 Jul 2004 06:06:48 +0300
parents e504e7d19bf7
children 9183098d7fdf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (C) 2003-2004 Timo Sirainen */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "buffer.h"
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "file-lock.h"
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "mmap-util.h"
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
7 #include "read-full.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "write-full.h"
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "mail-index-private.h"
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "mail-transaction-log.h"
2200
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
11 #include "mail-cache.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include <stdio.h>
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include <stddef.h>
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #include <time.h>
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
16 #include <sys/stat.h>
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
17
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
18 static int mail_index_try_open_only(struct mail_index *index);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
19
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 struct mail_index *mail_index_alloc(const char *dir, const char *prefix)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 struct mail_index *index;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 index = i_new(struct mail_index, 1);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 index->dir = i_strdup(dir);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 index->prefix = i_strdup(prefix);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 index->fd = -1;
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
28
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
29 index->extra_records_pool =
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
30 pool_alloconly_create("extra_record_pool", 256);
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
31 index->extra_records_buf =
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
32 buffer_create_dynamic(index->extra_records_pool,
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
33 64, (size_t)-1);
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
34 index->max_record_size = sizeof(struct mail_index_record);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 index->mode = 0600;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 index->gid = (gid_t)-1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 return index;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 void mail_index_free(struct mail_index *index)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 {
1967
b6d900688c55 memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 1965
diff changeset
43 mail_index_close(index);
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
44 pool_unref(index->extra_records_pool);
1967
b6d900688c55 memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 1965
diff changeset
45
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 i_free(index->error);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 i_free(index->dir);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 i_free(index->prefix);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 i_free(index);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51
2115
f720b3f15333 Modifying extra_records should work now.
Timo Sirainen <tss@iki.fi>
parents: 2114
diff changeset
52 uint32_t mail_index_register_record_extra(struct mail_index *index,
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
53 const char *name, uint16_t size)
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
54 {
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
55 struct mail_index_extra_record_info info;
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
56 size_t buf_size;
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
57 unsigned int i;
2115
f720b3f15333 Modifying extra_records should work now.
Timo Sirainen <tss@iki.fi>
parents: 2114
diff changeset
58
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
59 /* see if it's there already */
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
60 for (i = 0; i < index->extra_records_count; i++) {
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
61 if (strcmp(index->extra_records[i].name, name) == 0) {
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
62 i_assert(index->extra_records[i].size == size);
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
63 return i;
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
64 }
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
65 }
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
66
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
67 i_assert(size % 4 == 0);
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
68 i_assert(index->max_record_size + size <= 65535);
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
69
2115
f720b3f15333 Modifying extra_records should work now.
Timo Sirainen <tss@iki.fi>
parents: 2114
diff changeset
70 if (index->extra_records_count >= MAIL_INDEX_MAX_EXTRA_RECORDS) {
f720b3f15333 Modifying extra_records should work now.
Timo Sirainen <tss@iki.fi>
parents: 2114
diff changeset
71 i_panic("Maximum extra record count reached, "
f720b3f15333 Modifying extra_records should work now.
Timo Sirainen <tss@iki.fi>
parents: 2114
diff changeset
72 "you'll need to recompile with larger limit. "
f720b3f15333 Modifying extra_records should work now.
Timo Sirainen <tss@iki.fi>
parents: 2114
diff changeset
73 "MAIL_INDEX_MAX_EXTRA_RECORDS = %d",
f720b3f15333 Modifying extra_records should work now.
Timo Sirainen <tss@iki.fi>
parents: 2114
diff changeset
74 MAIL_INDEX_MAX_EXTRA_RECORDS);
f720b3f15333 Modifying extra_records should work now.
Timo Sirainen <tss@iki.fi>
parents: 2114
diff changeset
75 }
f720b3f15333 Modifying extra_records should work now.
Timo Sirainen <tss@iki.fi>
parents: 2114
diff changeset
76
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
77 memset(&info, 0, sizeof(info));
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
78 info.name = p_strdup(index->extra_records_pool, name);
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
79 info.size = size;
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
80 info.offset = index->max_record_size;
2115
f720b3f15333 Modifying extra_records should work now.
Timo Sirainen <tss@iki.fi>
parents: 2114
diff changeset
81
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
82 buffer_append(index->extra_records_buf, &info, sizeof(info));
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
83 index->extra_records =
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
84 buffer_get_data(index->extra_records_buf, &buf_size);
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
85 index->extra_records_count = buf_size / sizeof(info);
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
86
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
87 index->max_record_size += size;
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
88 return index->extra_records_count-1;
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
89 }
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
90
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 static int mail_index_check_header(struct mail_index *index,
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
92 struct mail_index_map *map)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 {
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
94 const struct mail_index_header *hdr = map->hdr;
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
95 unsigned char compat_data[sizeof(hdr->compat_data)];
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
97 memset(compat_data, 0, sizeof(compat_data));
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 #ifndef WORDS_BIGENDIAN
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 compat_data[0] = MAIL_INDEX_COMPAT_LITTLE_ENDIAN;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 #endif
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 compat_data[1] = sizeof(uoff_t);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 compat_data[2] = sizeof(time_t);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 if (hdr->major_version != MAIL_INDEX_MAJOR_VERSION) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 /* major version change - handle silently(?) */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 if (memcmp(hdr->compat_data, compat_data, sizeof(compat_data)) != 0) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 /* architecture change - handle silently(?) */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
113 if ((map->hdr->flags & MAIL_INDEX_HDR_FLAG_CORRUPTED) != 0) {
2095
Timo Sirainen <tss@iki.fi>
parents: 2073
diff changeset
114 /* we've already complained about it */
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
115 return -1;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
116 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 /* following some extra checks that only take a bit of CPU */
2051
596267d8e2e2 Some more UIDVALIDITY issues fixed.
Timo Sirainen <tss@iki.fi>
parents: 2050
diff changeset
119 if (hdr->uid_validity == 0 && hdr->next_uid != 1) {
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 mail_index_set_error(index, "Corrupted index file %s: "
2051
596267d8e2e2 Some more UIDVALIDITY issues fixed.
Timo Sirainen <tss@iki.fi>
parents: 2050
diff changeset
121 "uid_validity = 0, next_uid = %u",
596267d8e2e2 Some more UIDVALIDITY issues fixed.
Timo Sirainen <tss@iki.fi>
parents: 2050
diff changeset
122 index->filepath, hdr->next_uid);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
126 if (hdr->keywords_mask_size != sizeof(keywords_mask_t)) {
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
127 mail_index_set_error(index, "Corrupted index file %s: "
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
128 "keywords_mask_size mismatch: %d != %d",
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
129 index->filepath, hdr->keywords_mask_size,
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
130 (int)sizeof(keywords_mask_t));
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
131 return -1;
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
132 }
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
133
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
134 if (hdr->record_size < sizeof(struct mail_index_record)) {
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
135 mail_index_set_error(index, "Corrupted index file %s: "
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
136 "record_size too small: %u < %"PRIuSIZE_T,
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
137 index->filepath, hdr->record_size,
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
138 sizeof(struct mail_index_record));
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
139 return -1;
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
140 }
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
141
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 if (hdr->next_uid == 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 return 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144
2038
df504dad3aec Recent flag fixes. Should work perfectly now with maildir.
Timo Sirainen <tss@iki.fi>
parents: 2021
diff changeset
145 if (hdr->recent_messages_count > hdr->messages_count ||
df504dad3aec Recent flag fixes. Should work perfectly now with maildir.
Timo Sirainen <tss@iki.fi>
parents: 2021
diff changeset
146 hdr->seen_messages_count > hdr->messages_count ||
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 hdr->deleted_messages_count > hdr->messages_count)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 return 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 if (hdr->first_recent_uid_lowwater > hdr->next_uid ||
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 hdr->first_unseen_uid_lowwater > hdr->next_uid ||
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 hdr->first_deleted_uid_lowwater > hdr->next_uid)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 return 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 return 1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
157 static void mail_index_map_clear(struct mail_index *index,
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
158 struct mail_index_map *map)
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
159 {
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
160 if (map->buffer != NULL) {
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
161 i_assert(map->mmap_base == NULL);
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
162 buffer_free(map->buffer);
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
163 map->buffer = NULL;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
164 } else if (map->mmap_base != NULL) {
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
165 i_assert(map->buffer == NULL);
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
166 if (munmap(map->mmap_base, map->mmap_size) < 0)
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
167 mail_index_set_syscall_error(index, "munmap()");
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
168 map->mmap_base = NULL;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
169 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
170
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
171 if (map->refcount > 0) {
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
172 map->mmap_size = 0;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
173 map->mmap_used_size = 0;
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
174 map->hdr = NULL;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
175 map->records = NULL;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
176 map->records_count = 0;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
177 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
178 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
179
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 void mail_index_unmap(struct mail_index *index, struct mail_index_map *map)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 if (--map->refcount > 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 return;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
185 i_assert(map->refcount == 0);
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
186 mail_index_map_clear(index, map);
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
187 i_free(map);
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
188 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
189
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
190 static void mail_index_unmap_forced(struct mail_index *index,
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
191 struct mail_index_map *map)
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
192 {
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
193 mail_index_map_clear(index, map);
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
194 mail_index_unmap(index, map);
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
195 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
196
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
197 static int mail_index_mmap(struct mail_index *index, struct mail_index_map *map)
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
198 {
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
199 const struct mail_index_header *hdr;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
200 unsigned int records_count;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
201
2193
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
202 i_assert(!map->write_to_disk);
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
203
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
204 if (map->buffer != NULL) {
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
205 /* we had temporarily used a buffer, eg. for updating index */
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
206 buffer_free(map->buffer);
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
207 map->buffer = NULL;
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
208 }
2043
4548def7ac02 Don't try to re-map dirty memory mapping.
Timo Sirainen <tss@iki.fi>
parents: 2038
diff changeset
209
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
210 map->mmap_base = index->lock_type != F_WRLCK ?
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
211 mmap_ro_file(index->fd, &map->mmap_size) :
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
212 mmap_rw_file(index->fd, &map->mmap_size);
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
213 if (map->mmap_base == MAP_FAILED) {
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
214 map->mmap_base = NULL;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
215 mail_index_set_syscall_error(index, "mmap()");
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
216 return -1;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
217 }
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
218
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
219 if (map->mmap_size < MAIL_INDEX_HEADER_MIN_SIZE) {
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
220 mail_index_set_error(index, "Corrupted index file %s: "
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
221 "File too small (%"PRIuSIZE_T")",
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
222 index->filepath, map->mmap_size);
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
223 return 0;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
224 }
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
225
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
226 hdr = map->mmap_base;
2122
db5807f350ca crashfix on error
Timo Sirainen <tss@iki.fi>
parents: 2116
diff changeset
227 map->hdr = hdr;
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
228 map->mmap_used_size = hdr->header_size +
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
229 hdr->messages_count * hdr->record_size;
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
230
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
231 if (map->mmap_used_size > map->mmap_size) {
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
232 records_count = (map->mmap_size - hdr->header_size) /
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
233 hdr->record_size;
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
234 mail_index_set_error(index, "Corrupted index file %s: "
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
235 "messages_count too large (%u > %u)",
2122
db5807f350ca crashfix on error
Timo Sirainen <tss@iki.fi>
parents: 2116
diff changeset
236 index->filepath, hdr->messages_count,
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
237 records_count);
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
238 return 0;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
239 }
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
240
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
241 if (map->hdr->base_header_size < sizeof(*map->hdr)) {
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
242 /* header smaller than ours, make a copy so our newer headers
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
243 won't have garbage in them */
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
244 memcpy(&map->hdr_copy, map->hdr, map->hdr->base_header_size);
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
245 map->hdr = &map->hdr_copy;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
246 }
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
247
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
248 map->records = PTR_OFFSET(map->mmap_base, map->hdr->header_size);
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
249 map->records_count = map->hdr->messages_count;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
250 return 1;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
251 }
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
252
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
253 static int mail_index_read_map(struct mail_index *index,
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
254 struct mail_index_map *map)
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
255 {
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
256 struct mail_index_header hdr;
1939
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
257 void *data = NULL;
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
258 ssize_t ret;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
259 size_t pos, records_size;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
260
2043
4548def7ac02 Don't try to re-map dirty memory mapping.
Timo Sirainen <tss@iki.fi>
parents: 2038
diff changeset
261 i_assert(map->mmap_base == NULL);
4548def7ac02 Don't try to re-map dirty memory mapping.
Timo Sirainen <tss@iki.fi>
parents: 2038
diff changeset
262
1939
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
263 memset(&hdr, 0, sizeof(hdr));
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
264
1939
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
265 ret = 1;
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
266 for (pos = 0; ret > 0 && pos < sizeof(hdr); ) {
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
267 ret = pread(index->fd, PTR_OFFSET(&hdr, pos),
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
268 sizeof(hdr) - pos, pos);
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
269 if (ret > 0)
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
270 pos += ret;
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
271 }
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
272 if (ret >= 0 && pos >= MAIL_INDEX_HEADER_MIN_SIZE) {
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
273 records_size = hdr.messages_count * hdr.record_size;
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
274
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
275 if (map->buffer == NULL) {
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
276 map->buffer = buffer_create_dynamic(default_pool,
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
277 records_size,
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
278 (size_t)-1);
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
279 }
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
280
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
281 /* @UNSAFE */
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
282 buffer_set_used_size(map->buffer, 0);
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
283 data = buffer_append_space_unsafe(map->buffer, records_size);
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
284
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
285 ret = pread_full(index->fd, data, records_size,
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
286 hdr.header_size);
1939
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
287 }
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
288
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
289 if (ret < 0) {
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
290 if (errno == ESTALE)
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
291 return 0;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
292 mail_index_set_syscall_error(index, "pread_full()");
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
293 return -1;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
294 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
295 if (ret == 0) {
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
296 mail_index_set_error(index,
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
297 "Unexpected EOF while reading index file");
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
298 return -1;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
299 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
300
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
301 map->records = data;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
302 map->records_count = hdr.messages_count;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
303
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
304 map->hdr_copy = hdr;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
305 map->hdr = &map->hdr_copy;
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
306 return 1;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
307 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
308
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
309 static int mail_index_read_map_with_retry(struct mail_index *index,
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
310 struct mail_index_map *map)
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
311 {
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
312 int i, ret;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
313
1965
41f6a04154a3 INDEX_KEYWORDS_BYTE_COUNT was counted wrong so index files were larger than
Timo Sirainen <tss@iki.fi>
parents: 1946
diff changeset
314 for (i = 0; i < MAIL_INDEX_ESTALE_RETRY_COUNT; i++) {
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
315 ret = mail_index_read_map(index, map);
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
316 if (ret != 0)
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
317 return ret;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
318
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
319 /* ESTALE - reopen index file */
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
320 if (close(index->fd) < 0)
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
321 mail_index_set_syscall_error(index, "close()");
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
322 index->fd = -1;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
323
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
324 ret = mail_index_try_open_only(index);
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
325 if (ret <= 0) {
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
326 if (ret == 0) {
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
327 /* the file was lost */
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
328 errno = ENOENT;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
329 mail_index_set_syscall_error(index, "open()");
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
330 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
331 return -1;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
332 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
333 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
334
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
335 /* Too many ESTALE retries */
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
336 mail_index_set_syscall_error(index, "read_map()");
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
337 return -1;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 int mail_index_map(struct mail_index *index, int force)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
341 {
1946
dbec6c9dbffa syncing fix
Timo Sirainen <tss@iki.fi>
parents: 1945
diff changeset
342 const struct mail_index_header *hdr;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 struct mail_index_map *map;
1946
dbec6c9dbffa syncing fix
Timo Sirainen <tss@iki.fi>
parents: 1945
diff changeset
344 size_t used_size;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 int ret;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346
1946
dbec6c9dbffa syncing fix
Timo Sirainen <tss@iki.fi>
parents: 1945
diff changeset
347 map = index->map;
2050
ee1095ccfd23 Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents: 2043
diff changeset
348 if (map == NULL) {
ee1095ccfd23 Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents: 2043
diff changeset
349 map = i_new(struct mail_index_map, 1);
ee1095ccfd23 Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents: 2043
diff changeset
350 map->refcount = 1;
ee1095ccfd23 Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents: 2043
diff changeset
351 } else if (MAIL_INDEX_MAP_IS_IN_MEMORY(map)) {
2043
4548def7ac02 Don't try to re-map dirty memory mapping.
Timo Sirainen <tss@iki.fi>
parents: 2038
diff changeset
352 if (map->write_to_disk) {
4548def7ac02 Don't try to re-map dirty memory mapping.
Timo Sirainen <tss@iki.fi>
parents: 2038
diff changeset
353 /* we have modified this mapping and it's waiting to
4548def7ac02 Don't try to re-map dirty memory mapping.
Timo Sirainen <tss@iki.fi>
parents: 2038
diff changeset
354 be written to disk once we drop exclusive lock.
4548def7ac02 Don't try to re-map dirty memory mapping.
Timo Sirainen <tss@iki.fi>
parents: 2038
diff changeset
355 mapping couldn't have changed, so do nothing. */
4548def7ac02 Don't try to re-map dirty memory mapping.
Timo Sirainen <tss@iki.fi>
parents: 2038
diff changeset
356 return 1;
4548def7ac02 Don't try to re-map dirty memory mapping.
Timo Sirainen <tss@iki.fi>
parents: 2038
diff changeset
357 }
1946
dbec6c9dbffa syncing fix
Timo Sirainen <tss@iki.fi>
parents: 1945
diff changeset
358 /* FIXME: we need to re-read header */
2050
ee1095ccfd23 Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents: 2043
diff changeset
359 } else if (map->mmap_base != NULL) {
1946
dbec6c9dbffa syncing fix
Timo Sirainen <tss@iki.fi>
parents: 1945
diff changeset
360 /* see if re-mmaping is needed (file has grown) */
2193
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
361 i_assert(map->buffer == NULL);
1946
dbec6c9dbffa syncing fix
Timo Sirainen <tss@iki.fi>
parents: 1945
diff changeset
362 hdr = map->mmap_base;
2095
Timo Sirainen <tss@iki.fi>
parents: 2073
diff changeset
363
Timo Sirainen <tss@iki.fi>
parents: 2073
diff changeset
364 /* always check corrupted-flag to avoid errors later */
Timo Sirainen <tss@iki.fi>
parents: 2073
diff changeset
365 if ((map->hdr->flags & MAIL_INDEX_HDR_FLAG_CORRUPTED) != 0)
Timo Sirainen <tss@iki.fi>
parents: 2073
diff changeset
366 return -1;
Timo Sirainen <tss@iki.fi>
parents: 2073
diff changeset
367
Timo Sirainen <tss@iki.fi>
parents: 2073
diff changeset
368 used_size = hdr->header_size +
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
369 hdr->messages_count * hdr->record_size;
1984
9c159272f721 syncing fixes
Timo Sirainen <tss@iki.fi>
parents: 1967
diff changeset
370 if (map->mmap_size >= used_size && !force) {
9c159272f721 syncing fixes
Timo Sirainen <tss@iki.fi>
parents: 1967
diff changeset
371 map->records_count = hdr->messages_count;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
372 return 1;
1984
9c159272f721 syncing fixes
Timo Sirainen <tss@iki.fi>
parents: 1967
diff changeset
373 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374
1946
dbec6c9dbffa syncing fix
Timo Sirainen <tss@iki.fi>
parents: 1945
diff changeset
375 if (munmap(map->mmap_base, map->mmap_size) < 0)
dbec6c9dbffa syncing fix
Timo Sirainen <tss@iki.fi>
parents: 1945
diff changeset
376 mail_index_set_syscall_error(index, "munmap()");
dbec6c9dbffa syncing fix
Timo Sirainen <tss@iki.fi>
parents: 1945
diff changeset
377 map->mmap_base = NULL;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
378 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
379
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
380 index->hdr = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381 index->map = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
382
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
383 if (!index->mmap_disable) {
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
384 if ((ret = mail_index_mmap(index, map)) <= 0) {
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
385 mail_index_unmap_forced(index, map);
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
386 return ret;
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
387 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
388 } else {
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
389 if (mail_index_read_map_with_retry(index, map) < 0) {
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
390 mail_index_unmap_forced(index, map);
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
391 return -1;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
392 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
393 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
395 ret = mail_index_check_header(index, map);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
396 if (ret < 0) {
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
397 mail_index_unmap_forced(index, map);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398 return 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
400 if (ret == 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
401 index->fsck = TRUE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
402
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
403 map->log_file_seq = map->hdr->log_file_seq;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
404 map->log_file_offset = map->hdr->log_file_offset;
2296
e504e7d19bf7 crashfix
Timo Sirainen <tss@iki.fi>
parents: 2274
diff changeset
405 map->base_header_size = map->hdr->base_header_size;
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
406
1919
4aeb7357951a locking fixes, mmap_disable=yes fixes
Timo Sirainen <tss@iki.fi>
parents: 1917
diff changeset
407 index->hdr = map->hdr;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408 index->map = map;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
409 return 1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
410 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
411
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
412 struct mail_index_map *
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
413 mail_index_map_to_memory(struct mail_index_map *map, uint32_t new_record_size)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
414 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
415 struct mail_index_map *mem_map;
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
416 void *src, *dest;
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
417 size_t size, copy_size;
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
418 unsigned int i;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
419
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420 if (MAIL_INDEX_MAP_IS_IN_MEMORY(map)) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421 map->refcount++;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422 return map;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
424
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
425 size = map->records_count * new_record_size;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427 mem_map = i_new(struct mail_index_map, 1);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
428 mem_map->refcount = 1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
429 mem_map->buffer = buffer_create_dynamic(default_pool, size, (size_t)-1);
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
430 if (map->hdr->record_size == new_record_size)
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
431 buffer_append(mem_map->buffer, map->records, size);
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
432 else {
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
433 copy_size = I_MIN(map->hdr->record_size, new_record_size);
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
434 src = map->records;
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
435 for (i = 0; i < map->records_count; i++) {
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
436 dest = buffer_append_space_unsafe(mem_map->buffer,
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
437 new_record_size);
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
438 memcpy(dest, src, copy_size);
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
439 src = PTR_OFFSET(src, map->hdr->record_size);
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
440 }
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
441 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
442
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
443 mem_map->records = buffer_get_modifyable_data(mem_map->buffer, NULL);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
444 mem_map->records_count = map->records_count;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
445
2209
2a9c84ed988c Index syncing fixes.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
446 mem_map->hdr_copy = *map->hdr;
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
447 mem_map->hdr_copy.record_size = new_record_size;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
448 mem_map->hdr = &mem_map->hdr_copy;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
449 return mem_map;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
450 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
451
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
452 static int mail_index_try_open_only(struct mail_index *index)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
453 {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
454 int i;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
455
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
456 for (i = 0; i < 3; i++) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
457 index->fd = open(index->filepath, O_RDWR);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
458 if (index->fd == -1 && errno == EACCES) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
459 index->fd = open(index->filepath, O_RDONLY);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
460 index->readonly = TRUE;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
461 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
462 if (index->fd != -1 || errno != ESTALE)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
463 break;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
464
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
465 /* May happen with some OSes with NFS. Try again, although
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
466 there's still a race condition with another computer
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
467 creating the index file again. However, we can't try forever
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
468 as ESTALE happens also if index directory has been deleted
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
469 from server.. */
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
470 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
471 if (index->fd == -1) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
472 if (errno != ENOENT)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
473 return mail_index_set_syscall_error(index, "open()");
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
474
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
475 /* have to create it */
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
476 return 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
477 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
478 return 1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
479 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
480
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
481 static int
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
482 mail_index_try_open(struct mail_index *index, unsigned int *lock_id_r)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
483 {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
484 unsigned int lock_id;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
485 int ret;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
486
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
487 if (lock_id_r != NULL)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
488 *lock_id_r = 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
489
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
490 ret = mail_index_try_open_only(index);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
491 if (ret <= 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
492 return ret;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
493
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
494 if (mail_index_lock_shared(index, FALSE, &lock_id) < 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
495 return -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
496 ret = mail_index_map(index, FALSE);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
497 if (ret == 0) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
498 /* it's corrupted - recreate it */
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
499 mail_index_unlock(index, lock_id);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
500 if (lock_id_r != NULL)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
501 *lock_id_r = 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
502
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
503 (void)close(index->fd);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
504 index->fd = -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
505 } else {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
506 if (lock_id_r != NULL)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
507 *lock_id_r = lock_id;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
508 else
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
509 mail_index_unlock(index, lock_id);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
510 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
511 return ret;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
512 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
513
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
514 int mail_index_write_base_header(struct mail_index *index,
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
515 const struct mail_index_header *hdr)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
516 {
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
517 size_t hdr_size;
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
518
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
519 hdr_size = I_MIN(sizeof(*hdr), hdr->base_header_size);
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
520
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
521 if (!MAIL_INDEX_MAP_IS_IN_MEMORY(index->map)) {
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
522 memcpy(index->map->mmap_base, hdr, hdr_size);
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
523 if (msync(index->map->mmap_base, hdr_size, MS_SYNC) < 0)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
524 return mail_index_set_syscall_error(index, "msync()");
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
525 } else {
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
526 if (pwrite_full(index->fd, hdr, hdr_size, 0) < 0) {
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
527 mail_index_set_syscall_error(index, "pwrite_full()");
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
528 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
529 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
530
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
531 index->map->hdr_copy = *hdr;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
532 index->hdr = &index->map->hdr_copy;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
533 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
534
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
535 return 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
536 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
537
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
538 int mail_index_create_tmp_file(struct mail_index *index, const char **path_r)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
539 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
540 const char *path;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
541 int fd;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
542
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
543 path = *path_r = t_strconcat(index->filepath, ".tmp", NULL);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
544 fd = open(path, O_RDWR|O_CREAT|O_TRUNC, index->mode);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
545 if (fd == -1)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
546 return mail_index_file_set_syscall_error(index, path, "open()");
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
547
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
548 if (index->gid != (gid_t)-1 &&
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
549 fchown(index->fd, (uid_t)-1, index->gid) < 0) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
550 mail_index_file_set_syscall_error(index, path, "fchown()");
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
551 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
552 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
553
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
554 return fd;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
555 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
556
1942
2b114aa7eeec handle losing index file
Timo Sirainen <tss@iki.fi>
parents: 1939
diff changeset
557 static int mail_index_create(struct mail_index *index,
2b114aa7eeec handle losing index file
Timo Sirainen <tss@iki.fi>
parents: 1939
diff changeset
558 struct mail_index_header *hdr)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
559 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
560 const char *path;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
561 uint32_t seq;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
562 uoff_t offset;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
563 int ret;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
564
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
565 /* log file lock protects index creation */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
566 if (mail_transaction_log_sync_lock(index->log, &seq, &offset) < 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
567 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
568
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
569 ret = mail_index_try_open(index, NULL);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
570 if (ret != 0) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
571 mail_transaction_log_sync_unlock(index->log);
2200
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
572 return ret < 0 ? -1 : 0;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
573 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
574
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
575 /* create it fully in index.tmp first */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
576 index->fd = mail_index_create_tmp_file(index, &path);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
577 if (index->fd == -1)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
578 ret = -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
579 else if (write_full(index->fd, hdr, sizeof(*hdr)) < 0) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
580 mail_index_file_set_syscall_error(index, path, "write_full()");
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
581 ret = -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
582 } else {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
583 ret = mail_index_map(index, FALSE);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
584 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
585
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
586 if (ret == 0) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
587 /* it's corrupted even while we just created it,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
588 should never happen unless someone pokes the file directly */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
589 mail_index_set_error(index,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
590 "Newly created index file is corrupted: %s", path);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
591 ret = -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
592 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
593
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
594 if (ret < 0) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
595 if (unlink(path) < 0 && errno != ENOENT) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
596 mail_index_file_set_syscall_error(index, path,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
597 "unlink()");
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
598 }
2170
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
599 } else {
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
600 /* make it visible to others */
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
601 if (rename(path, index->filepath) < 0) {
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
602 mail_index_set_error(index, "rename(%s, %s) failed: %m",
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
603 path, index->filepath);
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
604 ret = -1;
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
605 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
606 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
607
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
608 mail_transaction_log_sync_unlock(index->log);
2170
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
609 return ret;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
610 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
611
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
612 static void mail_index_header_init(struct mail_index *index,
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
613 struct mail_index_header *hdr)
2073
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
614 {
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
615 time_t now = time(NULL);
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
616
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
617 memset(hdr, 0, sizeof(*hdr));
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
618
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
619 hdr->major_version = MAIL_INDEX_MAJOR_VERSION;
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
620 hdr->minor_version = MAIL_INDEX_MINOR_VERSION;
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
621 hdr->base_header_size = sizeof(*hdr);
2073
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
622 hdr->header_size = sizeof(*hdr);
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
623 hdr->record_size = index->max_record_size;
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
624 hdr->keywords_mask_size = sizeof(keywords_mask_t);
2073
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
625
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
626 #ifndef WORDS_BIGENDIAN
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
627 hdr->compat_data[0] = MAIL_INDEX_COMPAT_LITTLE_ENDIAN;
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
628 #endif
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
629 hdr->compat_data[1] = sizeof(uoff_t);
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
630 hdr->compat_data[2] = sizeof(time_t);
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
631
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
632 hdr->indexid = now;
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
633
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
634 hdr->next_uid = 1;
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
635 }
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
636
2200
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
637 /* returns -1 = error, 0 = won't create, 1 = ok */
1942
2b114aa7eeec handle losing index file
Timo Sirainen <tss@iki.fi>
parents: 1939
diff changeset
638 static int mail_index_open_files(struct mail_index *index,
2b114aa7eeec handle losing index file
Timo Sirainen <tss@iki.fi>
parents: 1939
diff changeset
639 enum mail_index_open_flags flags)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
640 {
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
641 struct mail_index_header hdr;
1935
ec4d5ff99f6e Don't modify index file when creating new transaction log.
Timo Sirainen <tss@iki.fi>
parents: 1930
diff changeset
642 unsigned int lock_id = 0;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
643 int ret;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
644
1935
ec4d5ff99f6e Don't modify index file when creating new transaction log.
Timo Sirainen <tss@iki.fi>
parents: 1930
diff changeset
645 ret = mail_index_try_open(index, &lock_id);
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
646 if (ret > 0)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
647 hdr = *index->hdr;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
648 else if (ret == 0) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
649 /* doesn't exist, or corrupted */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
650 if ((flags & MAIL_INDEX_OPEN_FLAG_CREATE) == 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
651 return 0;
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
652 mail_index_header_init(index, &hdr);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
653 index->hdr = &hdr;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
654 } else if (ret < 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
655 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
656
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
657 index->indexid = hdr.indexid;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
658
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
659 index->log = mail_transaction_log_open_or_create(index);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
660 if (index->log == NULL)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
661 return -1;
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
662
2200
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
663 if (index->fd == -1) {
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
664 if (lock_id != 0) {
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
665 mail_index_unlock(index, lock_id);
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
666 lock_id = 0;
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
667 }
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
668 if (mail_index_create(index, &hdr) < 0)
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
669 return -1;
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
670 }
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
671
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
672 if (lock_id == 0) {
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
673 if (mail_index_lock_shared(index, FALSE, &lock_id) < 0)
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
674 return -1;
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
675
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
676 }
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
677
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
678 index->cache = mail_cache_open_or_create(index);
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
679 if (index->cache == NULL)
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
680 return -1;
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
681
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
682 mail_index_unlock(index, lock_id);
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
683 return 1;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
684 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
685
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
686 int mail_index_open(struct mail_index *index, enum mail_index_open_flags flags)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
687 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
688 int i = 0, ret;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
689
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
690 if (index->opened)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
691 return 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
692
1967
b6d900688c55 memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 1965
diff changeset
693 index->filepath = i_strconcat(index->dir, "/", index->prefix, NULL);
b6d900688c55 memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 1965
diff changeset
694
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
695 do {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
696 index->shared_lock_count = 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
697 index->excl_lock_count = 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
698 index->lock_type = F_UNLCK;
2021
19e638ade25c Locking fixes
Timo Sirainen <tss@iki.fi>
parents: 1984
diff changeset
699 index->lock_id = 2;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
700
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
701 index->nodiskspace = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
702 index->index_lock_timeout = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
703 index->log_locked = FALSE;
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
704 index->mmap_disable =
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
705 (flags & MAIL_INDEX_OPEN_FLAG_MMAP_DISABLE) != 0;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
706 index->mmap_no_write =
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
707 (flags & MAIL_INDEX_OPEN_FLAG_MMAP_NO_WRITE) != 0;
1920
d11efbf1d341 Added fcntl_lock_disable setting to allow indexes to work with NFS. Some
Timo Sirainen <tss@iki.fi>
parents: 1919
diff changeset
708 index->fcntl_locks_disable =
d11efbf1d341 Added fcntl_lock_disable setting to allow indexes to work with NFS. Some
Timo Sirainen <tss@iki.fi>
parents: 1919
diff changeset
709 (flags & MAIL_INDEX_OPEN_FLAG_FCNTL_LOCKS_DISABLE) != 0;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
710 index->readonly = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
711
1942
2b114aa7eeec handle losing index file
Timo Sirainen <tss@iki.fi>
parents: 1939
diff changeset
712 ret = mail_index_open_files(index, flags);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
713 if (ret <= 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
714 break;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
715
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
716 index->opened = TRUE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
717 if (index->fsck) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
718 index->fsck = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
719 ret = mail_index_fsck(index);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
720 if (ret == 0) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
721 /* completely broken, reopen */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
722 if (i++ < 3)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
723 continue;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
724 /* too many tries */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
725 ret = -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
726 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
727 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
728 break;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
729 } while (1);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
730
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
731 if (ret <= 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
732 mail_index_close(index);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
733
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
734 return ret;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
735 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
736
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
737 void mail_index_close(struct mail_index *index)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
738 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
739 if (index->log != NULL) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
740 mail_transaction_log_close(index->log);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
741 index->log = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
742 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
743
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
744 if (index->map != NULL) {
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
745 mail_index_unmap(index, index->map);
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
746 index->map = NULL;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
747 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
748
2200
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
749 if (index->cache != NULL) {
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
750 mail_cache_free(index->cache);
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
751 index->cache = NULL;
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
752 }
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
753
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
754 if (index->fd != -1) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
755 if (close(index->fd) < 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
756 mail_index_set_syscall_error(index, "close()");
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
757 index->fd = -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
758 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
759
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
760 i_free(index->copy_lock_path);
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
761 index->copy_lock_path = NULL;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
762 i_free(index->filepath);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
763 index->filepath = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
764
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
765 index->indexid = 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
766 index->opened = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
767 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
768
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
769 int mail_index_reopen(struct mail_index *index, int fd)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
770 {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
771 struct mail_index_map *old_map;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
772 unsigned int old_shared_locks, old_lock_id, lock_id = 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
773 int ret, old_fd, old_lock_type;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
774
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
775 old_map = index->map;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
776 old_fd = index->fd;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
777
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
778 index->map = NULL;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
779 index->hdr = NULL;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
780
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
781 /* new file, new locks. the old fd can keep it's locks, they don't
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
782 matter anymore as no-one's going to modify the file. */
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
783 old_lock_type = index->lock_type;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
784 old_lock_id = index->lock_id;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
785 old_shared_locks = index->shared_lock_count;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
786
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
787 if (index->lock_type == F_RDLCK)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
788 index->lock_type = F_UNLCK;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
789 index->lock_id += 2;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
790 index->shared_lock_count = 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
791
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
792 if (fd != -1) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
793 index->fd = fd;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
794 ret = 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
795 } else {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
796 i_assert(index->excl_lock_count == 0);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
797 ret = mail_index_try_open_only(index);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
798 if (ret > 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
799 ret = mail_index_lock_shared(index, FALSE, &lock_id);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
800 else if (ret == 0) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
801 /* index file is lost */
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
802 ret = -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
803 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
804 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
805
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
806 if (ret == 0) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
807 if (mail_index_map(index, FALSE) <= 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
808 ret = -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
809 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
810
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
811 if (lock_id != 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
812 mail_index_unlock(index, lock_id);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
813
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
814 if (ret == 0) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
815 mail_index_unmap(index, old_map);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
816 if (close(old_fd) < 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
817 mail_index_set_syscall_error(index, "close()");
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
818 } else {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
819 if (index->map != NULL)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
820 mail_index_unmap(index, index->map);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
821 if (index->fd != -1) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
822 if (close(index->fd) < 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
823 mail_index_set_syscall_error(index, "close()");
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
824 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
825
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
826 index->map = old_map;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
827 index->hdr = index->map->hdr;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
828 index->fd = old_fd;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
829 index->lock_type = old_lock_type;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
830 index->lock_id = old_lock_id;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
831 index->shared_lock_count = old_shared_locks;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
832 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
833 return ret;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
834 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
835
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
836 int mail_index_refresh(struct mail_index *index)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
837 {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
838 struct stat st1, st2;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
839
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
840 if (fstat(index->fd, &st1) < 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
841 return mail_index_set_syscall_error(index, "fstat()");
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
842 if (stat(index->filepath, &st2) < 0) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
843 mail_index_set_syscall_error(index, "stat()");
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
844 if (errno != ENOENT)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
845 return -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
846
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
847 /* lost it? recreate */
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
848 (void)mail_index_mark_corrupted(index);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
849 return -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
850 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
851
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
852 if (st1.st_ino != st2.st_ino ||
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
853 !CMP_DEV_T(st1.st_dev, st2.st_dev)) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
854 if (mail_index_reopen(index, -1) < 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
855 return -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
856 return 1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
857 } else {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
858 return 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
859 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
860 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
861
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
862 struct mail_cache *mail_index_get_cache(struct mail_index *index)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
863 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
864 return index->cache;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
865 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
866
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
867 int mail_index_set_error(struct mail_index *index, const char *fmt, ...)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
868 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
869 va_list va;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
870
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
871 i_free(index->error);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
872
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
873 if (fmt == NULL)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
874 index->error = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
875 else {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
876 va_start(va, fmt);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
877 index->error = i_strdup_vprintf(fmt, va);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
878 va_end(va);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
879
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
880 i_error("%s", index->error);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
881 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
882
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
883 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
884 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
885
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
886 void mail_index_set_inconsistent(struct mail_index *index)
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
887 {
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
888 index->indexid = 0;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
889 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
890
1945
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
891 void mail_index_mark_corrupted(struct mail_index *index)
1943
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
892 {
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
893 struct mail_index_header hdr;
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
894
1945
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
895 mail_index_set_inconsistent(index);
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
896
1943
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
897 if (index->readonly)
1945
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
898 return;
1943
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
899
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
900 /* make sure we can write the header */
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
901 if (!MAIL_INDEX_MAP_IS_IN_MEMORY(index->map)) {
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
902 if (mprotect(index->map->mmap_base, sizeof(hdr),
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
903 PROT_READ | PROT_WRITE) < 0) {
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
904 mail_index_set_syscall_error(index, "mprotect()");
1945
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
905 return;
1943
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
906 }
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
907 }
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
908
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
909 hdr = *index->hdr;
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
910 hdr.flags |= MAIL_INDEX_HDR_FLAG_CORRUPTED;
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
911 if (mail_index_write_base_header(index, &hdr) == 0) {
1945
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
912 if (fsync(index->fd) < 0)
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
913 mail_index_set_syscall_error(index, "fsync()");
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
914 }
1943
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
915 }
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
916
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
917 int mail_index_set_syscall_error(struct mail_index *index,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
918 const char *function)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
919 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
920 i_assert(function != NULL);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
921
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
922 if (ENOSPACE(errno)) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
923 index->nodiskspace = TRUE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
924 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
925 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
926
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
927 return mail_index_set_error(index, "%s failed with index file %s: %m",
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
928 function, index->filepath);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
929 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
930
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
931 int mail_index_file_set_syscall_error(struct mail_index *index,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
932 const char *filepath,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
933 const char *function)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
934 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
935 i_assert(filepath != NULL);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
936 i_assert(function != NULL);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
937
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
938 if (ENOSPACE(errno)) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
939 index->nodiskspace = TRUE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
940 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
941 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
942
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
943 return mail_index_set_error(index, "%s failed with file %s: %m",
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
944 function, filepath);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
945 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
946
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
947 enum mail_index_error mail_index_get_last_error(struct mail_index *index)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
948 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
949 if (index->nodiskspace)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
950 return MAIL_INDEX_ERROR_DISKSPACE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
951 if (index->error != NULL)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
952 return MAIL_INDEX_ERROR_INTERNAL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
953
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
954 return MAIL_INDEX_ERROR_NONE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
955 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
956
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
957 const char *mail_index_get_error_message(struct mail_index *index)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
958 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
959 return index->error;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
960 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
961
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
962 void mail_index_reset_error(struct mail_index *index)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
963 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
964 if (index->error != NULL) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
965 i_free(index->error);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
966 index->error = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
967 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
968
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
969 index->nodiskspace = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
970 index->index_lock_timeout = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
971 }
2407
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
972
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
973 uint32_t mail_index_uint32_to_offset(uint32_t offset)
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
974 {
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
975 unsigned char buf[4];
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
976
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
977 i_assert(offset < 0x40000000);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
978 i_assert((offset & 3) == 0);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
979
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
980 offset >>= 2;
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
981 buf[0] = 0x80 | ((offset & 0x0fe00000) >> 21);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
982 buf[1] = 0x80 | ((offset & 0x001fc000) >> 14);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
983 buf[2] = 0x80 | ((offset & 0x00003f80) >> 7);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
984 buf[3] = 0x80 | (offset & 0x0000007f);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
985 return *((uint32_t *) buf);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
986 }
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
987
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
988 uint32_t mail_index_offset_to_uint32(uint32_t offset)
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
989 {
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
990 const unsigned char *buf = (const unsigned char *) &offset;
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
991
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
992 if ((offset & 0x80808080) != 0x80808080)
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
993 return 0;
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
994
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
995 return (((uint32_t)buf[3] & 0x7f) << 2) |
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
996 (((uint32_t)buf[2] & 0x7f) << 9) |
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
997 (((uint32_t)buf[1] & 0x7f) << 16) |
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
998 (((uint32_t)buf[0] & 0x7f) << 23);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
999 }