annotate src/lib-index/mail-index.c @ 2853:512dd7d76cdc HEAD

Removed cache_offset from mail_index_record and changed it to use extension instead. Added possibility to register sync and expunge handlers for extensions. Changed the way extension resets work: all extension updates which were committed without having seen the reset are ignored.
author Timo Sirainen <tss@iki.fi>
date Sat, 06 Nov 2004 19:20:18 +0200
parents 645b8442b519
children b4a46746eb52
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 "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
6 #include "read-full.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "write-full.h"
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "mail-index-private.h"
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #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
10 #include "mail-cache.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include <stdio.h>
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include <stddef.h>
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #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
15 #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
16
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
17 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
18
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 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
20 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 struct mail_index *index;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 index = i_new(struct mail_index, 1);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 index->dir = i_strdup(dir);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 index->prefix = i_strdup(prefix);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 index->fd = -1;
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
27
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
28 index->extension_pool = pool_alloconly_create("extension", 256);
2708
f1e9f3ec8135 Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents: 2683
diff changeset
29 index->extensions = buffer_create_dynamic(index->extension_pool, 64);
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
30 index->sync_handlers = buffer_create_dynamic(default_pool, 32);
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
31 index->expunge_handlers = buffer_create_dynamic(default_pool, 32);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 index->mode = 0600;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 index->gid = (gid_t)-1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 return index;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 void mail_index_free(struct mail_index *index)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 {
1967
b6d900688c55 memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 1965
diff changeset
40 mail_index_close(index);
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
41 pool_unref(index->extension_pool);
1967
b6d900688c55 memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 1965
diff changeset
42
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
43 buffer_free(index->sync_handlers);
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
44 buffer_free(index->expunge_handlers);
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
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
2650
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
52 void mail_index_set_permissions(struct mail_index *index,
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
53 mode_t mode, gid_t gid)
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
54 {
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
55 index->mode = mode & 0666;
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
56 index->gid = gid;
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
57 }
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
58
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
59 uint32_t mail_index_ext_register(struct mail_index *index, const char *name,
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
60 uint32_t default_hdr_size,
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
61 uint16_t default_record_size,
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
62 uint16_t default_record_align)
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
63 {
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
64 const struct mail_index_ext *extensions;
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
65 struct mail_index_ext ext;
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
66 size_t ext_count;
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
67 unsigned int i;
2115
f720b3f15333 Modifying extra_records should work now.
Timo Sirainen <tss@iki.fi>
parents: 2114
diff changeset
68
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
69 extensions = buffer_get_data(index->extensions, &ext_count);
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
70 ext_count /= sizeof(*extensions);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
71
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
72 i_assert(index->sync_handlers->used /
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
73 sizeof(mail_index_sync_handler_t *) == ext_count);
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
74
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
75 /* see if it's already there */
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
76 for (i = 0; i < ext_count; i++) {
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
77 if (strcmp(extensions[i].name, name) == 0)
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
78 return i;
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
79 }
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
80
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
81 memset(&ext, 0, sizeof(ext));
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
82 ext.name = p_strdup(index->extension_pool, name);
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
83 ext.hdr_size = default_hdr_size;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
84 ext.record_size = default_record_size;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
85 ext.record_align = default_record_align;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
86
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
87 buffer_append(index->extensions, &ext, sizeof(ext));
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
88 buffer_append_zero(index->sync_handlers,
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
89 sizeof(mail_index_sync_handler_t *));
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
90 return ext_count;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
91 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
92
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
93 void mail_index_register_expunge_handler(struct mail_index *index,
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
94 uint32_t ext_id,
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
95 mail_index_expunge_handler_t *cb)
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
96 {
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
97 buffer_write(index->expunge_handlers, ext_id * sizeof(cb),
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
98 &cb, sizeof(cb));
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
99 }
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
100
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
101 void mail_index_register_sync_handler(struct mail_index *index, uint32_t ext_id,
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
102 mail_index_sync_handler_t *cb)
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
103 {
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
104 buffer_write(index->sync_handlers, ext_id * sizeof(cb),
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
105 &cb, sizeof(cb));
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
106 }
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
107
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
108 static void mail_index_map_init_extbufs(struct mail_index_map *map,
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
109 unsigned int initial_count)
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
110 {
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
111 size_t ext_size, ext_id_map_size, size;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
112
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
113 ext_size = initial_count * sizeof(struct mail_index_ext);
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
114 ext_id_map_size = initial_count * sizeof(uint32_t);
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
115 if (map->extension_pool == NULL) {
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
116 size = ext_size + ext_id_map_size +
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
117 (initial_count * 20); /* for names */
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
118 map->extension_pool =
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
119 pool_alloconly_create("extensions",
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
120 nearest_power(size));
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
121 } else {
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
122 p_clear(map->extension_pool);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
123 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
124
2708
f1e9f3ec8135 Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents: 2683
diff changeset
125 map->extensions = buffer_create_dynamic(map->extension_pool, ext_size);
f1e9f3ec8135 Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents: 2683
diff changeset
126 map->ext_id_map =
f1e9f3ec8135 Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents: 2683
diff changeset
127 buffer_create_dynamic(map->extension_pool, ext_id_map_size);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
128 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
129
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
130 uint32_t mail_index_map_lookup_ext(struct mail_index_map *map, const char *name)
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
131 {
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
132 const struct mail_index_ext *extensions;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
133 size_t i, size;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
134
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
135 if (map->extensions == NULL)
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
136 return (uint32_t)-1;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
137
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
138 extensions = buffer_get_data(map->extensions, &size);
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
139 size /= sizeof(*extensions);
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
140
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
141 for (i = 0; i < size; i++) {
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
142 if (strcmp(extensions[i].name, name) == 0)
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
143 return i;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
144 }
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
145 return (uint32_t)-1;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
146 }
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
147
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
148 uint32_t
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
149 mail_index_map_register_ext(struct mail_index *index,
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
150 struct mail_index_map *map, const char *name,
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
151 uint32_t hdr_offset, uint32_t hdr_size,
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
152 uint32_t record_offset, uint32_t record_size,
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
153 uint32_t record_align, uint32_t reset_id)
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
154 {
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
155 struct mail_index_ext *ext;
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
156 uint32_t idx, ext_id;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
157
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
158 if (map->extensions == NULL) {
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
159 mail_index_map_init_extbufs(map, 5);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
160 idx = 0;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
161 } else {
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
162 idx = map->extensions->used / sizeof(*ext);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
163 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
164
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
165 ext = buffer_append_space_unsafe(map->extensions, sizeof(*ext));
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
166 memset(ext, 0, sizeof(*ext));
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
167
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
168 ext->name = p_strdup(map->extension_pool, name);
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
169 ext->hdr_offset = hdr_offset;
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
170 ext->hdr_size = hdr_size;
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
171 ext->record_offset = record_offset;
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
172 ext->record_size = record_size;
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
173 ext->record_align = record_align;
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
174 ext->reset_id = reset_id;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
175
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
176 ext_id = mail_index_ext_register(index, name, hdr_size,
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
177 record_size, record_align);
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
178 buffer_write(map->ext_id_map, ext_id * sizeof(uint32_t),
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
179 &idx, sizeof(idx));
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
180 return idx;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
181 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
182
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
183 static int size_check(size_t *size_left, size_t size)
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
184 {
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
185 if (size > *size_left)
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
186 return FALSE;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
187 *size_left -= size;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
188 return TRUE;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
189 }
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
190
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
191 static size_t get_align(size_t name_len)
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
192 {
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
193 size_t size = sizeof(struct mail_index_ext_header) + name_len;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
194 return MAIL_INDEX_HEADER_SIZE_ALIGN(size) - size;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
195 }
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
196
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
197 static int mail_index_read_extensions(struct mail_index *index,
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
198 struct mail_index_map *map)
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
199 {
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
200 const struct mail_index_ext_header *ext_hdr;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
201 unsigned int i, old_count;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
202 const char *name;
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
203 uint32_t ext_id, offset, name_offset;
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
204 size_t size_left;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
205
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
206 /* extension headers always start from 64bit offsets, so if base header
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
207 doesn't happen to be 64bit aligned we'll skip some bytes */
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
208 offset = MAIL_INDEX_HEADER_SIZE_ALIGN(map->hdr->base_header_size);
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
209 if (offset >= map->hdr->header_size && map->extension_pool == NULL) {
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
210 /* nothing to do, skip allocatations and all */
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
211 return 1;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
212 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
213
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
214 old_count = index->extensions->used / sizeof(struct mail_index_ext);
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
215 mail_index_map_init_extbufs(map, old_count + 5);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
216
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
217 ext_id = (uint32_t)-1;
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
218 for (i = 0; i < old_count; i++)
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
219 buffer_append(map->ext_id_map, &ext_id, sizeof(ext_id));
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
220
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
221 while (offset < map->hdr->header_size) {
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
222 ext_hdr = CONST_PTR_OFFSET(map->hdr_base, offset);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
223
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
224 size_left = map->hdr->header_size - offset;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
225 if (!size_check(&size_left, sizeof(*ext_hdr)) ||
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
226 !size_check(&size_left, ext_hdr->name_size) ||
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
227 !size_check(&size_left, get_align(ext_hdr->name_size)) ||
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
228 !size_check(&size_left, ext_hdr->hdr_size)) {
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
229 mail_index_set_error(index, "Corrupted index file %s: "
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
230 "Header extension goes outside header",
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
231 index->filepath);
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
232 return -1;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
233 }
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
234 offset += sizeof(*ext_hdr);
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
235 name_offset = offset;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
236 offset += ext_hdr->name_size + get_align(ext_hdr->name_size);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
237
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
238 t_push();
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
239 name = t_strndup(CONST_PTR_OFFSET(map->hdr_base, name_offset),
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
240 ext_hdr->name_size);
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
241 mail_index_map_register_ext(index, map, name,
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
242 offset, ext_hdr->hdr_size,
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
243 ext_hdr->record_offset,
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
244 ext_hdr->record_size,
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
245 ext_hdr->record_align,
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
246 ext_hdr->reset_id);
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
247 t_pop();
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
248
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
249 offset += MAIL_INDEX_HEADER_SIZE_ALIGN(ext_hdr->hdr_size);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
250 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
251 return 1;
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
252 }
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
253
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 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
255 struct mail_index_map *map)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 {
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
257 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
258 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
259
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
260 memset(compat_data, 0, sizeof(compat_data));
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261 #ifndef WORDS_BIGENDIAN
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 compat_data[0] = MAIL_INDEX_COMPAT_LITTLE_ENDIAN;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 #endif
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 compat_data[1] = sizeof(uoff_t);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265 compat_data[2] = sizeof(time_t);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 if (hdr->major_version != MAIL_INDEX_MAJOR_VERSION) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 /* major version change - handle silently(?) */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 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
272 /* architecture change - handle silently(?) */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
276 if ((map->hdr->flags & MAIL_INDEX_HDR_FLAG_CORRUPTED) != 0) {
2095
Timo Sirainen <tss@iki.fi>
parents: 2073
diff changeset
277 /* we've already complained about it */
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
278 return -1;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
279 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 /* 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
282 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
283 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
284 "uid_validity = 0, next_uid = %u",
596267d8e2e2 Some more UIDVALIDITY issues fixed.
Timo Sirainen <tss@iki.fi>
parents: 2050
diff changeset
285 index->filepath, hdr->next_uid);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
289 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
290 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
291 "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
292 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
293 (int)sizeof(keywords_mask_t));
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
294 return -1;
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
295 }
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
296
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
297 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
298 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
299 "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
300 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
301 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
302 return -1;
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
303 }
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
304
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 if (hdr->next_uid == 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 return 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307
2038
df504dad3aec Recent flag fixes. Should work perfectly now with maildir.
Timo Sirainen <tss@iki.fi>
parents: 2021
diff changeset
308 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
309 hdr->seen_messages_count > hdr->messages_count ||
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 hdr->deleted_messages_count > hdr->messages_count)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 return 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312 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
313 hdr->first_unseen_uid_lowwater > hdr->next_uid ||
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 hdr->first_deleted_uid_lowwater > hdr->next_uid)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315 return 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
317 return mail_index_read_extensions(index, map);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
320 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
321 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
322 {
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
323 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
324 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
325 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
326 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
327 } 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
328 i_assert(map->buffer == NULL);
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
329 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
330 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
331 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
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 if (map->refcount > 0) {
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
335 map->mmap_size = 0;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
336 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
337 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
338 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
339 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
340 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
341 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
342
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 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
344 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 if (--map->refcount > 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346 return;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
347
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
348 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
349 mail_index_map_clear(index, map);
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
350 if (map->extension_pool != NULL)
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
351 pool_unref(map->extension_pool);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
352 buffer_free(map->hdr_copy_buf);
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
353 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
354 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
355
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
356 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
357 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
358 {
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
359 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
360 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
361 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
362
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
363 static int mail_index_mmap(struct mail_index *index, struct mail_index_map *map)
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
364 {
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
365 const struct mail_index_header *hdr;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
366 struct mail_index_header *mhdr;
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
367 unsigned int records_count;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
368
2193
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
369 i_assert(!map->write_to_disk);
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
370
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
371 if (map->buffer != NULL) {
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
372 /* we had temporarily used a buffer, eg. for updating index */
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
373 buffer_free(map->buffer);
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
374 map->buffer = NULL;
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
375 }
2043
4548def7ac02 Don't try to re-map dirty memory mapping.
Timo Sirainen <tss@iki.fi>
parents: 2038
diff changeset
376
2761
f96a7b2d1c52 Removed mmap() memory area protections. They weren't always set correctly.
Timo Sirainen <tss@iki.fi>
parents: 2723
diff changeset
377 map->mmap_base = index->readonly ?
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
378 mmap_ro_file(index->fd, &map->mmap_size) :
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
379 mmap_rw_file(index->fd, &map->mmap_size);
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
380 if (map->mmap_base == MAP_FAILED) {
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
381 map->mmap_base = NULL;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
382 mail_index_set_syscall_error(index, "mmap()");
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
383 return -1;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
384 }
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
385
2822
280c933983a9 Handle major version changes silently even if the file isn't large enough to
Timo Sirainen <tss@iki.fi>
parents: 2821
diff changeset
386 hdr = map->mmap_base;
280c933983a9 Handle major version changes silently even if the file isn't large enough to
Timo Sirainen <tss@iki.fi>
parents: 2821
diff changeset
387 if (map->mmap_size >
280c933983a9 Handle major version changes silently even if the file isn't large enough to
Timo Sirainen <tss@iki.fi>
parents: 2821
diff changeset
388 offsetof(struct mail_index_header, major_version) &&
280c933983a9 Handle major version changes silently even if the file isn't large enough to
Timo Sirainen <tss@iki.fi>
parents: 2821
diff changeset
389 hdr->major_version != MAIL_INDEX_MAJOR_VERSION) {
280c933983a9 Handle major version changes silently even if the file isn't large enough to
Timo Sirainen <tss@iki.fi>
parents: 2821
diff changeset
390 /* major version change - handle silently */
280c933983a9 Handle major version changes silently even if the file isn't large enough to
Timo Sirainen <tss@iki.fi>
parents: 2821
diff changeset
391 return 0;
280c933983a9 Handle major version changes silently even if the file isn't large enough to
Timo Sirainen <tss@iki.fi>
parents: 2821
diff changeset
392 }
280c933983a9 Handle major version changes silently even if the file isn't large enough to
Timo Sirainen <tss@iki.fi>
parents: 2821
diff changeset
393
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
394 if (map->mmap_size < MAIL_INDEX_HEADER_MIN_SIZE) {
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
395 mail_index_set_error(index, "Corrupted index file %s: "
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
396 "File too small (%"PRIuSIZE_T")",
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
397 index->filepath, map->mmap_size);
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
398 return 0;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
399 }
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
400
2122
db5807f350ca crashfix on error
Timo Sirainen <tss@iki.fi>
parents: 2116
diff changeset
401 map->hdr = hdr;
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
402 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
403 hdr->messages_count * hdr->record_size;
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
404
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
405 if (map->mmap_used_size > map->mmap_size) {
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
406 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
407 hdr->record_size;
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
408 mail_index_set_error(index, "Corrupted index file %s: "
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
409 "messages_count too large (%u > %u)",
2122
db5807f350ca crashfix on error
Timo Sirainen <tss@iki.fi>
parents: 2116
diff changeset
410 index->filepath, hdr->messages_count,
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
411 records_count);
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
412 return 0;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
413 }
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
414
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
415 if (map->hdr->base_header_size < sizeof(*map->hdr)) {
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
416 /* header smaller than ours, make a copy so our newer headers
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
417 won't have garbage in them */
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
418 buffer_reset(map->hdr_copy_buf);
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
419 buffer_append(map->hdr_copy_buf,
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
420 map->hdr, map->hdr->base_header_size);
2618
a9599d2f1af6 Fix buffer_set_used_size crashes.
Timo Sirainen <tss@iki.fi>
parents: 2563
diff changeset
421 buffer_append_zero(map->hdr_copy_buf, sizeof(*map->hdr) -
a9599d2f1af6 Fix buffer_set_used_size crashes.
Timo Sirainen <tss@iki.fi>
parents: 2563
diff changeset
422 map->hdr->base_header_size);
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
423
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
424 mhdr = buffer_get_modifyable_data(map->hdr_copy_buf, NULL);
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
425 mhdr->base_header_size = sizeof(*map->hdr);
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
426 mhdr->header_size = map->hdr_copy_buf->used;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
427
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
428 map->hdr = mhdr;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
429 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
430
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
431 map->hdr_base = map->mmap_base;
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
432 map->records = PTR_OFFSET(map->mmap_base, map->hdr->header_size);
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
433 map->records_count = map->hdr->messages_count;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
434 return 1;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
435 }
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
436
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
437 static int mail_index_read_map(struct mail_index *index,
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
438 struct mail_index_map *map, int *retry_r)
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
439 {
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
440 struct mail_index_header hdr, *hdrp;
1939
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
441 void *data = NULL;
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
442 ssize_t ret;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
443 size_t pos, records_size;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
444
2043
4548def7ac02 Don't try to re-map dirty memory mapping.
Timo Sirainen <tss@iki.fi>
parents: 2038
diff changeset
445 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
446
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
447 *retry_r = FALSE;
1939
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
448 memset(&hdr, 0, sizeof(hdr));
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
449
1939
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
450 ret = 1;
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
451 for (pos = 0; ret > 0 && pos < sizeof(hdr); ) {
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
452 ret = pread(index->fd, PTR_OFFSET(&hdr, pos),
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
453 sizeof(hdr) - pos, pos);
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
454 if (ret > 0)
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
455 pos += ret;
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
456 }
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
457
2825
645b8442b519 one more major version change fix
Timo Sirainen <tss@iki.fi>
parents: 2824
diff changeset
458 if (pos > (ssize_t)offsetof(struct mail_index_header, major_version) &&
2822
280c933983a9 Handle major version changes silently even if the file isn't large enough to
Timo Sirainen <tss@iki.fi>
parents: 2821
diff changeset
459 hdr.major_version != MAIL_INDEX_MAJOR_VERSION) {
280c933983a9 Handle major version changes silently even if the file isn't large enough to
Timo Sirainen <tss@iki.fi>
parents: 2821
diff changeset
460 /* major version change - handle silently */
280c933983a9 Handle major version changes silently even if the file isn't large enough to
Timo Sirainen <tss@iki.fi>
parents: 2821
diff changeset
461 return 0;
280c933983a9 Handle major version changes silently even if the file isn't large enough to
Timo Sirainen <tss@iki.fi>
parents: 2821
diff changeset
462 }
280c933983a9 Handle major version changes silently even if the file isn't large enough to
Timo Sirainen <tss@iki.fi>
parents: 2821
diff changeset
463
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
464 if (ret >= 0 && pos >= MAIL_INDEX_HEADER_MIN_SIZE &&
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
465 (ret > 0 || pos >= hdr.base_header_size)) {
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
466 if (hdr.base_header_size < MAIL_INDEX_HEADER_MIN_SIZE ||
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
467 hdr.header_size < hdr.base_header_size) {
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
468 mail_index_set_error(index, "Corrupted index file %s: "
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
469 "Corrupted header sizes (base %u, full %u)",
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
470 index->filepath, hdr.base_header_size,
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
471 hdr.header_size);
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
472 return 0;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
473 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
474
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
475 buffer_reset(map->hdr_copy_buf);
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
476 if (hdr.base_header_size < sizeof(hdr)) {
2618
a9599d2f1af6 Fix buffer_set_used_size crashes.
Timo Sirainen <tss@iki.fi>
parents: 2563
diff changeset
477 buffer_append_zero(map->hdr_copy_buf, sizeof(hdr) +
a9599d2f1af6 Fix buffer_set_used_size crashes.
Timo Sirainen <tss@iki.fi>
parents: 2563
diff changeset
478 hdr.header_size -
a9599d2f1af6 Fix buffer_set_used_size crashes.
Timo Sirainen <tss@iki.fi>
parents: 2563
diff changeset
479 hdr.base_header_size);
a9599d2f1af6 Fix buffer_set_used_size crashes.
Timo Sirainen <tss@iki.fi>
parents: 2563
diff changeset
480 buffer_write(map->hdr_copy_buf, 0,
a9599d2f1af6 Fix buffer_set_used_size crashes.
Timo Sirainen <tss@iki.fi>
parents: 2563
diff changeset
481 &hdr, hdr.base_header_size);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
482
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
483 /* @UNSAFE */
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
484 ret = pread_full(index->fd,
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
485 PTR_OFFSET(map->hdr_copy_buf->data,
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
486 sizeof(hdr)),
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
487 hdr.header_size - hdr.base_header_size,
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
488 hdr.base_header_size);
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
489
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
490 hdrp = buffer_get_modifyable_data(map->hdr_copy_buf,
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
491 NULL);
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
492 hdrp->base_header_size = sizeof(hdr);
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
493 hdrp->header_size = map->hdr_copy_buf->used;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
494 } else {
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
495 buffer_append(map->hdr_copy_buf, &hdr, pos);
2618
a9599d2f1af6 Fix buffer_set_used_size crashes.
Timo Sirainen <tss@iki.fi>
parents: 2563
diff changeset
496 buffer_append_zero(map->hdr_copy_buf,
a9599d2f1af6 Fix buffer_set_used_size crashes.
Timo Sirainen <tss@iki.fi>
parents: 2563
diff changeset
497 hdr.header_size - pos);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
498 /* @UNSAFE */
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
499 ret = pread_full(index->fd,
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
500 PTR_OFFSET(map->hdr_copy_buf->data,
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
501 pos),
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
502 hdr.header_size - pos, pos);
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
503 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
504 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
505
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
506 if (ret > 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
507 records_size = hdr.messages_count * hdr.record_size;
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
508
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
509 if (map->buffer == NULL) {
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
510 map->buffer = buffer_create_dynamic(default_pool,
2708
f1e9f3ec8135 Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents: 2683
diff changeset
511 records_size);
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
512 }
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
513
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
514 /* @UNSAFE */
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
515 buffer_set_used_size(map->buffer, 0);
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
516 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
517
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
518 ret = pread_full(index->fd, data, records_size,
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
519 hdr.header_size);
1939
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
520 }
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
521
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
522 if (ret < 0) {
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
523 if (errno == ESTALE) {
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
524 *retry_r = TRUE;
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
525 return 0;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
526 }
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
527 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
528 return -1;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
529 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
530 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
531 mail_index_set_error(index,
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
532 "Corrupted index file %s: File too small",
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
533 index->filepath);
2824
431f677bc0b9 More rebuilding fixes with mmap_disable=yes
Timo Sirainen <tss@iki.fi>
parents: 2823
diff changeset
534 return 0;
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
535 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
536
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
537 map->records = data;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
538 map->records_count = hdr.messages_count;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
539
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
540 map->hdr = map->hdr_copy_buf->data;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
541 map->hdr_base = map->hdr_copy_buf->data;
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
542 return 1;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
543 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
544
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
545 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
546 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
547 {
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
548 int i, ret, retry;
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
549
1965
41f6a04154a3 INDEX_KEYWORDS_BYTE_COUNT was counted wrong so index files were larger than
Timo Sirainen <tss@iki.fi>
parents: 1946
diff changeset
550 for (i = 0; i < MAIL_INDEX_ESTALE_RETRY_COUNT; i++) {
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
551 ret = mail_index_read_map(index, map, &retry);
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
552 if (ret != 0 || !retry)
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
553 return ret;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
554
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
555 /* 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
556 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
557 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
558 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
559
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
560 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
561 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
562 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
563 /* 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
564 errno = ENOENT;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
565 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
566 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
567 return -1;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
568 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
569 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
570
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
571 /* 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
572 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
573 return -1;
1915
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
2553
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
576 static int mail_index_map_try_existing(struct mail_index_map *map)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
577 {
1946
dbec6c9dbffa syncing fix
Timo Sirainen <tss@iki.fi>
parents: 1945
diff changeset
578 const struct mail_index_header *hdr;
2553
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
579 size_t used_size;
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
580
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
581 if (MAIL_INDEX_MAP_IS_IN_MEMORY(map))
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
582 return 0;
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
583
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
584 hdr = map->mmap_base;
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
585
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
586 /* always check corrupted-flag to avoid errors later */
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
587 if ((hdr->flags & MAIL_INDEX_HDR_FLAG_CORRUPTED) != 0)
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
588 return -1;
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
589
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
590 used_size = hdr->header_size + hdr->messages_count * hdr->record_size;
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
591 if (map->mmap_size >= used_size && map->hdr == hdr) {
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
592 map->records_count = hdr->messages_count;
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
593 return 1;
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
594 }
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
595 return 0;
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
596 }
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
597
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
598 int mail_index_map(struct mail_index *index, int force)
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
599 {
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
600 struct mail_index_map *map;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
601 int ret;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
602
2553
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
603 if (!force && index->map != NULL) {
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
604 ret = mail_index_map_try_existing(index->map);
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
605 if (ret != 0)
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
606 return ret;
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
607
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
608 if (index->lock_type == F_WRLCK) {
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
609 /* we're syncing, don't break the mapping */
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
610 return 1;
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
611 }
2553
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
612 }
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
613
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
614 i_assert(index->lock_type != F_WRLCK);
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
615
2542
c3608081d0e4 When updating index mappings, don't let it affect existing views mappings.
Timo Sirainen <tss@iki.fi>
parents: 2409
diff changeset
616 if (index->map != NULL && index->map->refcount > 1) {
c3608081d0e4 When updating index mappings, don't let it affect existing views mappings.
Timo Sirainen <tss@iki.fi>
parents: 2409
diff changeset
617 /* this map is already used by some views and they may have
c3608081d0e4 When updating index mappings, don't let it affect existing views mappings.
Timo Sirainen <tss@iki.fi>
parents: 2409
diff changeset
618 pointers into it. leave them and create a new mapping. */
c3608081d0e4 When updating index mappings, don't let it affect existing views mappings.
Timo Sirainen <tss@iki.fi>
parents: 2409
diff changeset
619 index->map->refcount--;
c3608081d0e4 When updating index mappings, don't let it affect existing views mappings.
Timo Sirainen <tss@iki.fi>
parents: 2409
diff changeset
620 index->map = NULL;
c3608081d0e4 When updating index mappings, don't let it affect existing views mappings.
Timo Sirainen <tss@iki.fi>
parents: 2409
diff changeset
621 }
c3608081d0e4 When updating index mappings, don't let it affect existing views mappings.
Timo Sirainen <tss@iki.fi>
parents: 2409
diff changeset
622
1946
dbec6c9dbffa syncing fix
Timo Sirainen <tss@iki.fi>
parents: 1945
diff changeset
623 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
624 if (map == NULL) {
ee1095ccfd23 Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents: 2043
diff changeset
625 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
626 map->refcount = 1;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
627 map->hdr_copy_buf =
2708
f1e9f3ec8135 Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents: 2683
diff changeset
628 buffer_create_dynamic(default_pool, sizeof(*map->hdr));
2050
ee1095ccfd23 Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents: 2043
diff changeset
629 } 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
630 if (map->write_to_disk) {
4548def7ac02 Don't try to re-map dirty memory mapping.
Timo Sirainen <tss@iki.fi>
parents: 2038
diff changeset
631 /* 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
632 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
633 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
634 return 1;
4548def7ac02 Don't try to re-map dirty memory mapping.
Timo Sirainen <tss@iki.fi>
parents: 2038
diff changeset
635 }
1946
dbec6c9dbffa syncing fix
Timo Sirainen <tss@iki.fi>
parents: 1945
diff changeset
636 /* 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
637 } else if (map->mmap_base != NULL) {
2193
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
638 i_assert(map->buffer == NULL);
1946
dbec6c9dbffa syncing fix
Timo Sirainen <tss@iki.fi>
parents: 1945
diff changeset
639 if (munmap(map->mmap_base, map->mmap_size) < 0)
dbec6c9dbffa syncing fix
Timo Sirainen <tss@iki.fi>
parents: 1945
diff changeset
640 mail_index_set_syscall_error(index, "munmap()");
dbec6c9dbffa syncing fix
Timo Sirainen <tss@iki.fi>
parents: 1945
diff changeset
641 map->mmap_base = NULL;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
642 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
643
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
644 index->hdr = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
645 index->map = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
646
2823
43bab10e060d Rebuild broken index files with mmap_disabled=yes too..
Timo Sirainen <tss@iki.fi>
parents: 2822
diff changeset
647 if (!index->mmap_disable)
43bab10e060d Rebuild broken index files with mmap_disabled=yes too..
Timo Sirainen <tss@iki.fi>
parents: 2822
diff changeset
648 ret = mail_index_mmap(index, map);
43bab10e060d Rebuild broken index files with mmap_disabled=yes too..
Timo Sirainen <tss@iki.fi>
parents: 2822
diff changeset
649 else
43bab10e060d Rebuild broken index files with mmap_disabled=yes too..
Timo Sirainen <tss@iki.fi>
parents: 2822
diff changeset
650 ret = mail_index_read_map_with_retry(index, map);
43bab10e060d Rebuild broken index files with mmap_disabled=yes too..
Timo Sirainen <tss@iki.fi>
parents: 2822
diff changeset
651 if (ret <= 0) {
43bab10e060d Rebuild broken index files with mmap_disabled=yes too..
Timo Sirainen <tss@iki.fi>
parents: 2822
diff changeset
652 mail_index_unmap_forced(index, map);
43bab10e060d Rebuild broken index files with mmap_disabled=yes too..
Timo Sirainen <tss@iki.fi>
parents: 2822
diff changeset
653 return ret;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
654 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
655
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
656 ret = mail_index_check_header(index, map);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
657 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
658 mail_index_unmap_forced(index, map);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
659 return 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
660 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
661 if (ret == 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
662 index->fsck = TRUE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
663
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
664 map->log_file_seq = map->hdr->log_file_seq;
2819
bea9c88c8763 Use separate sync offsets for internal/external transactions. Pending external
Timo Sirainen <tss@iki.fi>
parents: 2761
diff changeset
665 map->log_file_int_offset = map->hdr->log_file_int_offset;
bea9c88c8763 Use separate sync offsets for internal/external transactions. Pending external
Timo Sirainen <tss@iki.fi>
parents: 2761
diff changeset
666 map->log_file_ext_offset = map->hdr->log_file_ext_offset;
2296
e504e7d19bf7 crashfix
Timo Sirainen <tss@iki.fi>
parents: 2274
diff changeset
667 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
668
1919
4aeb7357951a locking fixes, mmap_disable=yes fixes
Timo Sirainen <tss@iki.fi>
parents: 1917
diff changeset
669 index->hdr = map->hdr;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
670 index->map = map;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
671 return 1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
672 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
673
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
674 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
675 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
676 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
677 struct mail_index_map *mem_map;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
678 struct mail_index_header *hdr;
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
679 struct mail_index_ext *extensions;
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
680 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
681 size_t size, copy_size;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
682 unsigned int i, count;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
683
2660
b1f91349d216 mail_index_map_to_memory() didn't resize record if mapping was already in
Timo Sirainen <tss@iki.fi>
parents: 2650
diff changeset
684 if (MAIL_INDEX_MAP_IS_IN_MEMORY(map) &&
b1f91349d216 mail_index_map_to_memory() didn't resize record if mapping was already in
Timo Sirainen <tss@iki.fi>
parents: 2650
diff changeset
685 map->hdr->record_size == new_record_size) {
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
686 map->refcount++;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
687 return map;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
688 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
689
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
690 size = map->records_count * new_record_size;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
691
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
692 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
693 mem_map->refcount = 1;
2708
f1e9f3ec8135 Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents: 2683
diff changeset
694 mem_map->buffer = buffer_create_dynamic(default_pool, 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
695 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
696 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
697 else {
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
698 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
699 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
700 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
701 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
702 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
703 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
704 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
705 }
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
706 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
707
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
708 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
709 mem_map->records_count = map->records_count;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
710
2708
f1e9f3ec8135 Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents: 2683
diff changeset
711 mem_map->hdr_copy_buf =
f1e9f3ec8135 Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents: 2683
diff changeset
712 buffer_create_dynamic(default_pool, map->hdr->header_size);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
713 buffer_append(mem_map->hdr_copy_buf, map->hdr, map->hdr->header_size);
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
714
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
715 hdr = buffer_get_modifyable_data(mem_map->hdr_copy_buf, NULL);
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
716 hdr->record_size = new_record_size;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
717 mem_map->hdr = hdr;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
718
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
719 /* copy extensions */
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
720 if (map->ext_id_map != NULL) {
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
721 count = map->ext_id_map->used / sizeof(uint32_t);
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
722 mail_index_map_init_extbufs(mem_map, count + 2);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
723
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
724 buffer_append_buf(mem_map->extensions, map->extensions,
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
725 0, (size_t)-1);
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
726 buffer_append_buf(mem_map->ext_id_map, map->ext_id_map,
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
727 0, (size_t)-1);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
728
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
729 /* fix the name pointers to use our own pool */
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
730 extensions = buffer_get_modifyable_data(mem_map->extensions,
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
731 NULL);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
732 for (i = 0; i < count; i++) {
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
733 extensions[i].name = p_strdup(mem_map->extension_pool,
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
734 extensions[i].name);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
735 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
736 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
737
2715
b81a60004612 Copying mapping to memory didn't copy some fields which could have caused
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
738 mem_map->log_file_seq = mem_map->hdr->log_file_seq;
2819
bea9c88c8763 Use separate sync offsets for internal/external transactions. Pending external
Timo Sirainen <tss@iki.fi>
parents: 2761
diff changeset
739 mem_map->log_file_int_offset = mem_map->hdr->log_file_int_offset;
bea9c88c8763 Use separate sync offsets for internal/external transactions. Pending external
Timo Sirainen <tss@iki.fi>
parents: 2761
diff changeset
740 mem_map->log_file_ext_offset = mem_map->hdr->log_file_ext_offset;
2715
b81a60004612 Copying mapping to memory didn't copy some fields which could have caused
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
741 mem_map->base_header_size = mem_map->hdr->base_header_size;
b81a60004612 Copying mapping to memory didn't copy some fields which could have caused
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
742
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
743 return mem_map;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
744 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
745
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
746 int mail_index_map_get_ext_idx(struct mail_index_map *map,
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
747 uint32_t ext_id, uint32_t *idx_r)
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
748 {
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
749 const uint32_t *id_map;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
750
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
751 if (map->ext_id_map == NULL ||
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
752 map->ext_id_map->used / sizeof(*id_map) <= ext_id)
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
753 return 0;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
754
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
755 id_map = map->ext_id_map->data;
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
756 *idx_r = id_map[ext_id];
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
757 return *idx_r != (uint32_t)-1;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
758 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
759
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
760 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
761 {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
762 int i;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
763
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
764 for (i = 0; i < 3; i++) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
765 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
766 if (index->fd == -1 && errno == EACCES) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
767 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
768 index->readonly = TRUE;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
769 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
770 if (index->fd != -1 || errno != ESTALE)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
771 break;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
772
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
773 /* 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
774 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
775 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
776 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
777 from server.. */
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
778 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
779 if (index->fd == -1) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
780 if (errno != ENOENT)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
781 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
782
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
783 /* have to create it */
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
784 return 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
785 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
786 return 1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
787 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
788
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
789 static int
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
790 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
791 {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
792 unsigned int lock_id;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
793 int ret;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
794
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
795 if (lock_id_r != NULL)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
796 *lock_id_r = 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
797
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
798 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
799 if (ret <= 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
800 return ret;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
801
2409
9183098d7fdf Fixed fd leaks
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
802 if (mail_index_lock_shared(index, FALSE, &lock_id) < 0) {
9183098d7fdf Fixed fd leaks
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
803 (void)close(index->fd);
9183098d7fdf Fixed fd leaks
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
804 index->fd = -1;
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
805 return -1;
2409
9183098d7fdf Fixed fd leaks
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
806 }
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
807 ret = mail_index_map(index, FALSE);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
808 if (ret == 0) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
809 /* it's corrupted - recreate it */
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
810 mail_index_unlock(index, lock_id);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
811 if (lock_id_r != NULL)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
812 *lock_id_r = 0;
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 (void)close(index->fd);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
815 index->fd = -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
816 } else {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
817 if (lock_id_r != NULL)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
818 *lock_id_r = lock_id;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
819 else
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
820 mail_index_unlock(index, lock_id);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
821 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
822 return ret;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
823 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
824
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
825 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
826 const struct mail_index_header *hdr)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
827 {
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
828 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
829
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
830 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
831
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
832 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
833 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
834 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
835 return mail_index_set_syscall_error(index, "msync()");
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
836 } 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
837 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
838 mail_index_set_syscall_error(index, "pwrite_full()");
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
839 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
840 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
841
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
842 buffer_write(index->map->hdr_copy_buf, 0, hdr, hdr_size);
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
843 i_assert(index->hdr == index->map->hdr_copy_buf->data);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
844 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
845
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
846 return 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
847 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
848
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
849 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
850 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
851 const char *path;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
852 int fd;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
853
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
854 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
855 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
856 if (fd == -1)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
857 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
858
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
859 if (index->gid != (gid_t)-1 &&
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
860 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
861 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
862 return -1;
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
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
865 return fd;
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
1942
2b114aa7eeec handle losing index file
Timo Sirainen <tss@iki.fi>
parents: 1939
diff changeset
868 static int mail_index_create(struct mail_index *index,
2b114aa7eeec handle losing index file
Timo Sirainen <tss@iki.fi>
parents: 1939
diff changeset
869 struct mail_index_header *hdr)
1915
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 const char *path;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
872 uint32_t seq;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
873 uoff_t offset;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
874 int ret;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
875
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
876 /* log file lock protects index creation */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
877 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
878 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
879
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
880 ret = mail_index_try_open(index, NULL);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
881 if (ret != 0) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
882 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
883 return ret < 0 ? -1 : 0;
1915
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
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
886 /* create it fully in index.tmp first */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
887 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
888 if (index->fd == -1)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
889 ret = -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
890 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
891 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
892 ret = -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
893 } else {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
894 ret = mail_index_map(index, FALSE);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
895 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
896
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
897 if (ret == 0) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
898 /* 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
899 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
900 mail_index_set_error(index,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
901 "Newly created index file is corrupted: %s", path);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
902 ret = -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
903 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
904
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
905 if (ret < 0) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
906 if (unlink(path) < 0 && errno != ENOENT) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
907 mail_index_file_set_syscall_error(index, path,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
908 "unlink()");
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
909 }
2170
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
910 } else {
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
911 /* make it visible to others */
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
912 if (rename(path, index->filepath) < 0) {
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
913 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
914 path, index->filepath);
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
915 ret = -1;
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
916 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
917 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
918
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
919 mail_transaction_log_sync_unlock(index->log);
2170
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
920 return ret;
1915
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
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
923 static void mail_index_header_init(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
924 {
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
925 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
926
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
927 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
928
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
929 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
930 hdr->minor_version = MAIL_INDEX_MINOR_VERSION;
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
931 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
932 hdr->header_size = sizeof(*hdr);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
933 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
934 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
935
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
936 #ifndef WORDS_BIGENDIAN
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
937 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
938 #endif
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
939 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
940 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
941
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
942 hdr->indexid = now;
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
943
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
944 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
945 }
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
946
2200
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
947 /* returns -1 = error, 0 = won't create, 1 = ok */
1942
2b114aa7eeec handle losing index file
Timo Sirainen <tss@iki.fi>
parents: 1939
diff changeset
948 static int mail_index_open_files(struct mail_index *index,
2b114aa7eeec handle losing index file
Timo Sirainen <tss@iki.fi>
parents: 1939
diff changeset
949 enum mail_index_open_flags flags)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
950 {
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
951 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
952 unsigned int lock_id = 0;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
953 int ret;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
954
1935
ec4d5ff99f6e Don't modify index file when creating new transaction log.
Timo Sirainen <tss@iki.fi>
parents: 1930
diff changeset
955 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
956 if (ret > 0)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
957 hdr = *index->hdr;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
958 else if (ret == 0) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
959 /* doesn't exist, or corrupted */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
960 if ((flags & MAIL_INDEX_OPEN_FLAG_CREATE) == 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
961 return 0;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
962 mail_index_header_init(&hdr);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
963 index->hdr = &hdr;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
964 } else if (ret < 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
965 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
966
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
967 index->indexid = hdr.indexid;
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->log = mail_transaction_log_open_or_create(index);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
970 if (index->log == NULL)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
971 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
972
2200
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
973 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
974 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
975 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
976 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
977 }
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
978 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
979 return -1;
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
980 }
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
981
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
982 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
983 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
984 return -1;
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
985
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
986 }
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
987
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
988 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
989 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
990 return -1;
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
991
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
992 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
993 return 1;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
994 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
995
2723
12b503fbb8af Replaced fcntl_locks_disable with lock_method, so it's now possible to use
Timo Sirainen <tss@iki.fi>
parents: 2715
diff changeset
996 int mail_index_open(struct mail_index *index, enum mail_index_open_flags flags,
12b503fbb8af Replaced fcntl_locks_disable with lock_method, so it's now possible to use
Timo Sirainen <tss@iki.fi>
parents: 2715
diff changeset
997 enum mail_index_lock_method lock_method)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
998 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
999 int i = 0, ret;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1000
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1001 if (index->opened)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1002 return 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1003
1967
b6d900688c55 memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 1965
diff changeset
1004 index->filepath = i_strconcat(index->dir, "/", index->prefix, NULL);
b6d900688c55 memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 1965
diff changeset
1005
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1006 do {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1007 index->shared_lock_count = 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1008 index->excl_lock_count = 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1009 index->lock_type = F_UNLCK;
2021
19e638ade25c Locking fixes
Timo Sirainen <tss@iki.fi>
parents: 1984
diff changeset
1010 index->lock_id = 2;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1011
2723
12b503fbb8af Replaced fcntl_locks_disable with lock_method, so it's now possible to use
Timo Sirainen <tss@iki.fi>
parents: 2715
diff changeset
1012 index->readonly = FALSE;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1013 index->nodiskspace = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1014 index->index_lock_timeout = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1015 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
1016 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
1017 (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
1018 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
1019 (flags & MAIL_INDEX_OPEN_FLAG_MMAP_NO_WRITE) != 0;
2723
12b503fbb8af Replaced fcntl_locks_disable with lock_method, so it's now possible to use
Timo Sirainen <tss@iki.fi>
parents: 2715
diff changeset
1020 index->lock_method = lock_method;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1021
1942
2b114aa7eeec handle losing index file
Timo Sirainen <tss@iki.fi>
parents: 1939
diff changeset
1022 ret = mail_index_open_files(index, flags);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1023 if (ret <= 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1024 break;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1025
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1026 index->opened = TRUE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1027 if (index->fsck) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1028 index->fsck = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1029 ret = mail_index_fsck(index);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1030 if (ret == 0) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1031 /* completely broken, reopen */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1032 if (i++ < 3)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1033 continue;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1034 /* too many tries */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1035 ret = -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1036 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1037 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1038 break;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1039 } while (1);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1040
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1041 if (ret <= 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1042 mail_index_close(index);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1043
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1044 return ret;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1045 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1046
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1047 void mail_index_close(struct mail_index *index)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1048 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1049 if (index->log != NULL) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1050 mail_transaction_log_close(index->log);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1051 index->log = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1052 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1053
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
1054 if (index->map != NULL) {
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
1055 mail_index_unmap(index, index->map);
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
1056 index->map = NULL;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
1057 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1058
2200
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1059 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
1060 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
1061 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
1062 }
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1063
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1064 if (index->fd != -1) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1065 if (close(index->fd) < 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1066 mail_index_set_syscall_error(index, "close()");
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1067 index->fd = -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1068 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1069
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1070 i_free(index->copy_lock_path);
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
1071 index->copy_lock_path = NULL;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1072 i_free(index->filepath);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1073 index->filepath = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1074
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1075 index->indexid = 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1076 index->opened = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1077 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1078
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1079 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
1080 {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1081 struct mail_index_map *old_map;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1082 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
1083 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
1084
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1085 old_map = index->map;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1086 old_fd = index->fd;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1087
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1088 index->map = NULL;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1089 index->hdr = NULL;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1090
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1091 /* 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
1092 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
1093 old_lock_type = index->lock_type;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1094 old_lock_id = index->lock_id;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1095 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
1096
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1097 if (index->lock_type == F_RDLCK)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1098 index->lock_type = F_UNLCK;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1099 index->lock_id += 2;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1100 index->shared_lock_count = 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1101
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1102 if (fd != -1) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1103 index->fd = fd;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1104 ret = 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1105 } else {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1106 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
1107 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
1108 if (ret > 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1109 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
1110 else if (ret == 0) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1111 /* index file is lost */
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1112 ret = -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1113 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1114 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1115
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1116 if (ret == 0) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1117 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
1118 ret = -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1119 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1120
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1121 if (lock_id != 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1122 mail_index_unlock(index, lock_id);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1123
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1124 if (ret == 0) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1125 mail_index_unmap(index, old_map);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1126 if (close(old_fd) < 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1127 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
1128 } else {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1129 if (index->map != NULL)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1130 mail_index_unmap(index, index->map);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1131 if (index->fd != -1) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1132 if (close(index->fd) < 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1133 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
1134 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1135
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1136 index->map = old_map;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1137 index->hdr = index->map->hdr;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1138 index->fd = old_fd;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1139 index->lock_type = old_lock_type;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1140 index->lock_id = old_lock_id;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1141 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
1142 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1143 return ret;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1144 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1145
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1146 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
1147 {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1148 struct stat st1, st2;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1149
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1150 if (fstat(index->fd, &st1) < 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1151 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
1152 if (stat(index->filepath, &st2) < 0) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1153 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
1154 if (errno != ENOENT)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1155 return -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1156
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1157 /* lost it? recreate */
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1158 (void)mail_index_mark_corrupted(index);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1159 return -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1160 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1161
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1162 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
1163 !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
1164 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
1165 return -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1166 return 1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1167 } else {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1168 return 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1169 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1170 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1171
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1172 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
1173 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1174 return index->cache;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1175 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1176
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1177 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
1178 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1179 va_list va;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1180
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1181 i_free(index->error);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1182
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1183 if (fmt == NULL)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1184 index->error = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1185 else {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1186 va_start(va, fmt);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1187 index->error = i_strdup_vprintf(fmt, va);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1188 va_end(va);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1189
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1190 i_error("%s", index->error);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1191 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1192
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1193 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1194 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1195
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
1196 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
1197 {
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
1198 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
1199 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
1200
1945
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
1201 void mail_index_mark_corrupted(struct mail_index *index)
1943
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1202 {
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1203 struct mail_index_header hdr;
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1204
1945
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
1205 mail_index_set_inconsistent(index);
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
1206
1943
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1207 if (index->readonly)
1945
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
1208 return;
1943
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1209
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1210 hdr = *index->hdr;
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1211 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
1212 if (mail_index_write_base_header(index, &hdr) == 0) {
1945
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
1213 if (fsync(index->fd) < 0)
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
1214 mail_index_set_syscall_error(index, "fsync()");
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
1215 }
1943
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1216 }
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1217
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1218 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
1219 const char *function)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1220 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1221 i_assert(function != NULL);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1222
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1223 if (ENOSPACE(errno)) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1224 index->nodiskspace = TRUE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1225 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1226 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1227
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1228 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
1229 function, index->filepath);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1230 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1231
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1232 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
1233 const char *filepath,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1234 const char *function)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1235 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1236 i_assert(filepath != NULL);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1237 i_assert(function != NULL);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1238
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1239 if (ENOSPACE(errno)) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1240 index->nodiskspace = TRUE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1241 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1242 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1243
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1244 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
1245 function, filepath);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1246 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1247
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1248 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
1249 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1250 if (index->nodiskspace)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1251 return MAIL_INDEX_ERROR_DISKSPACE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1252 if (index->error != NULL)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1253 return MAIL_INDEX_ERROR_INTERNAL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1254
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1255 return MAIL_INDEX_ERROR_NONE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1256 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1257
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1258 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
1259 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1260 return index->error;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1261 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1262
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1263 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
1264 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1265 if (index->error != NULL) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1266 i_free(index->error);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1267 index->error = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1268 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1269
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1270 index->nodiskspace = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1271 index->index_lock_timeout = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1272 }
2407
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1273
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1274 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
1275 {
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1276 unsigned char buf[4];
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1277
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1278 i_assert(offset < 0x40000000);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1279 i_assert((offset & 3) == 0);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1280
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1281 offset >>= 2;
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1282 buf[0] = 0x80 | ((offset & 0x0fe00000) >> 21);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1283 buf[1] = 0x80 | ((offset & 0x001fc000) >> 14);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1284 buf[2] = 0x80 | ((offset & 0x00003f80) >> 7);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1285 buf[3] = 0x80 | (offset & 0x0000007f);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1286 return *((uint32_t *) buf);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1287 }
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1288
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1289 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
1290 {
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1291 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
1292
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1293 if ((offset & 0x80808080) != 0x80808080)
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1294 return 0;
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1295
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1296 return (((uint32_t)buf[3] & 0x7f) << 2) |
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1297 (((uint32_t)buf[2] & 0x7f) << 9) |
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1298 (((uint32_t)buf[1] & 0x7f) << 16) |
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1299 (((uint32_t)buf[0] & 0x7f) << 23);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1300 }