annotate src/lib-index/mail-index.c @ 3191:0df3f5d71958 HEAD

Changed many buffers to arrays. Cleans up the code a lot.
author Timo Sirainen <tss@iki.fi>
date Sat, 12 Mar 2005 20:16:29 +0200
parents c620532e7bc8
children e38e04c7c67c
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"
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
9 #include "mail-index-sync-private.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "mail-transaction-log.h"
2200
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
11 #include "mail-cache.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include <stdio.h>
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include <stddef.h>
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #include <time.h>
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
16 #include <sys/stat.h>
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
17
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
18 static int mail_index_try_open_only(struct mail_index *index);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
19
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 struct mail_index *mail_index_alloc(const char *dir, const char *prefix)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 struct mail_index *index;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 index = i_new(struct mail_index, 1);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 index->dir = i_strdup(dir);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 index->prefix = i_strdup(prefix);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 index->fd = -1;
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
28
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
29 index->extension_pool = pool_alloconly_create("extension", 256);
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
30 ARRAY_CREATE(&index->extensions, index->extension_pool,
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
31 struct mail_index_ext, 5);
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
32
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
33 ARRAY_CREATE(&index->expunge_handlers, default_pool,
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
34 mail_index_expunge_handler_t *, 4);
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
35 ARRAY_CREATE(&index->sync_handlers, default_pool,
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
36 struct mail_index_sync_handler, 4);
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
37 ARRAY_CREATE(&index->sync_lost_handlers, default_pool,
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
38 mail_index_sync_lost_handler_t *, 4);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 index->mode = 0600;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 index->gid = (gid_t)-1;
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
42
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
43 index->keywords_ext_id =
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
44 mail_index_ext_register(index, "keywords", 128, 2, 1);
3086
66c44404f9a1 Keyword fixes.
Timo Sirainen <tss@iki.fi>
parents: 3016
diff changeset
45 index->keywords_pool = pool_alloconly_create("keywords", 512);
66c44404f9a1 Keyword fixes.
Timo Sirainen <tss@iki.fi>
parents: 3016
diff changeset
46 index->keywords_buf = buffer_create_dynamic(default_pool, 64);
66c44404f9a1 Keyword fixes.
Timo Sirainen <tss@iki.fi>
parents: 3016
diff changeset
47 buffer_append_zero(index->keywords_buf, sizeof(const char *));
66c44404f9a1 Keyword fixes.
Timo Sirainen <tss@iki.fi>
parents: 3016
diff changeset
48 index->keywords = index->keywords_buf->data;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 return 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
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 void mail_index_free(struct mail_index *index)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 {
1967
b6d900688c55 memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 1965
diff changeset
54 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
55 pool_unref(index->extension_pool);
3086
66c44404f9a1 Keyword fixes.
Timo Sirainen <tss@iki.fi>
parents: 3016
diff changeset
56 pool_unref(index->keywords_pool);
1967
b6d900688c55 memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 1965
diff changeset
57
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
58 array_free(&index->sync_handlers);
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
59 array_free(&index->sync_lost_handlers);
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
60 array_free(&index->expunge_handlers);
3086
66c44404f9a1 Keyword fixes.
Timo Sirainen <tss@iki.fi>
parents: 3016
diff changeset
61 buffer_free(index->keywords_buf);
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
62
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 i_free(index->error);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 i_free(index->dir);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 i_free(index->prefix);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 i_free(index);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68
2650
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
69 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
70 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
71 {
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
72 index->mode = mode & 0666;
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
73 index->gid = gid;
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
74 }
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
75
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 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
77 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
78 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
79 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
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 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
82 struct mail_index_ext ext;
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
83 unsigned int i, ext_count;
2115
f720b3f15333 Modifying extra_records should work now.
Timo Sirainen <tss@iki.fi>
parents: 2114
diff changeset
84
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
85 extensions = array_get(&index->extensions, &ext_count);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
86
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
87 i_assert(array_count(&index->sync_handlers) == ext_count);
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
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
89 /* 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
90 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
91 if (strcmp(extensions[i].name, name) == 0)
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
92 return i;
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
93 }
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
94
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
95 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
96 ext.name = p_strdup(index->extension_pool, name);
2921
a5eda271256f Wrong extension sync_handler might have been called if index extensions
Timo Sirainen <tss@iki.fi>
parents: 2913
diff changeset
97 ext.index_idx = ext_count;
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
98 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
99 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
100 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
101
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
102 array_append(&index->extensions, &ext, 1);
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
103 (void)array_modifyable_append(&index->sync_handlers);
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
104 return ext_count;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
105 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
106
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
107 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
108 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
109 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
110 {
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
111 array_idx_set(&index->expunge_handlers, ext_id, &cb);
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
112 }
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
113
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
114 void mail_index_register_sync_handler(struct mail_index *index, uint32_t ext_id,
2869
d2daf90c79f1 Cache invalidating needed to hook into view syncing as well.
Timo Sirainen <tss@iki.fi>
parents: 2857
diff changeset
115 mail_index_sync_handler_t *cb,
d2daf90c79f1 Cache invalidating needed to hook into view syncing as well.
Timo Sirainen <tss@iki.fi>
parents: 2857
diff changeset
116 enum mail_index_sync_handler_type type)
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
117 {
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
118 struct mail_index_sync_handler *h;
2869
d2daf90c79f1 Cache invalidating needed to hook into view syncing as well.
Timo Sirainen <tss@iki.fi>
parents: 2857
diff changeset
119
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
120 h = array_modifyable_idx(&index->sync_handlers, ext_id);
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
121 h->callback = cb;
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
122 h->type = type;
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
123 }
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
124
2934
c3ae75597952 Added "sync lost" handlers which are called with mmap_disable=yes when index
Timo Sirainen <tss@iki.fi>
parents: 2926
diff changeset
125 void mail_index_register_sync_lost_handler(struct mail_index *index,
c3ae75597952 Added "sync lost" handlers which are called with mmap_disable=yes when index
Timo Sirainen <tss@iki.fi>
parents: 2926
diff changeset
126 mail_index_sync_lost_handler_t *cb)
c3ae75597952 Added "sync lost" handlers which are called with mmap_disable=yes when index
Timo Sirainen <tss@iki.fi>
parents: 2926
diff changeset
127 {
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
128 array_append(&index->sync_lost_handlers, &cb, 1);
2934
c3ae75597952 Added "sync lost" handlers which are called with mmap_disable=yes when index
Timo Sirainen <tss@iki.fi>
parents: 2926
diff changeset
129 }
c3ae75597952 Added "sync lost" handlers which are called with mmap_disable=yes when index
Timo Sirainen <tss@iki.fi>
parents: 2926
diff changeset
130
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
131 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
132 unsigned int initial_count)
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
133 {
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
134 size_t size;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
135
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
136 if (map->extension_pool == NULL) {
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
137 size = initial_count * sizeof(struct mail_index_ext) +
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
138 initial_count * sizeof(uint32_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
139 (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
140 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
141 pool_alloconly_create("extensions",
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
142 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
143 } else {
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
144 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
145 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
146
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
147 ARRAY_CREATE(&map->extensions, map->extension_pool,
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
148 struct mail_index_ext, initial_count);
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
149 ARRAY_CREATE(&map->ext_id_map, map->extension_pool,
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
150 uint32_t, initial_count);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
151 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
152
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
153 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
154 {
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
155 const struct mail_index_ext *extensions;
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
156 unsigned int i, size;
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
157
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
158 if (!array_is_created(&map->extensions))
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
159 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
160
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
161 extensions = array_get(&map->extensions, &size);
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
162 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
163 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
164 return i;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
165 }
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
166 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
167 }
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
168
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
169 uint32_t
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
170 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
171 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
172 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
173 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
174 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
175 {
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
176 struct mail_index_ext *ext;
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
177 uint32_t idx, empty_idx = (uint32_t)-1;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
178
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
179 if (!array_is_created(&map->extensions)) {
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
180 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
181 idx = 0;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
182 } else {
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
183 idx = array_count(&map->extensions);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
184 }
3147
6c7d463eaf1e Don't allow duplicate extension names in index header.
Timo Sirainen <tss@iki.fi>
parents: 3129
diff changeset
185 i_assert(mail_index_map_lookup_ext(map, name) == (uint32_t)-1);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
186
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
187 ext = array_modifyable_append(&map->extensions);
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
188 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
189
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
190 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
191 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
192 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
193 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
194 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
195 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
196 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
197
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
198 ext->index_idx = mail_index_ext_register(index, name, hdr_size,
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
199 record_size, record_align);
2921
a5eda271256f Wrong extension sync_handler might have been called if index extensions
Timo Sirainen <tss@iki.fi>
parents: 2913
diff changeset
200
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
201 while (array_count(&map->ext_id_map) < ext->index_idx)
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
202 array_append(&map->ext_id_map, &empty_idx, 1);
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
203 array_idx_set(&map->ext_id_map, ext->index_idx, &idx);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
204 return idx;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
205 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
206
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
207 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
208 {
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
209 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
210 return FALSE;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
211 *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
212 return TRUE;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
213 }
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
214
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
215 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
216 {
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
217 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
218 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
219 }
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
220
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
221 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
222 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
223 {
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
224 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
225 unsigned int i, old_count;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
226 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
227 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
228 size_t size_left;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
229
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
230 /* 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
231 doesn't happen to be 64bit aligned we'll skip some bytes */
2884
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
232 offset = MAIL_INDEX_HEADER_SIZE_ALIGN(map->hdr.base_header_size);
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
233 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
234 /* 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
235 return 1;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
236 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
237
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
238 old_count = array_count(&index->extensions);
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
239 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
240
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
241 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
242 for (i = 0; i < old_count; i++)
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
243 array_append(&map->ext_id_map, &ext_id, 1);
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
244
2884
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
245 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
246 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
247
2884
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
248 size_left = map->hdr.header_size - offset;
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
249 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
250 !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
251 !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
252 !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
253 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
254 "Header extension goes outside header",
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
255 index->filepath);
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
256 return -1;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
257 }
3147
6c7d463eaf1e Don't allow duplicate extension names in index header.
Timo Sirainen <tss@iki.fi>
parents: 3129
diff changeset
258
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
259 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
260 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
261 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
262
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
263 t_push();
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
264 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
265 ext_hdr->name_size);
3147
6c7d463eaf1e Don't allow duplicate extension names in index header.
Timo Sirainen <tss@iki.fi>
parents: 3129
diff changeset
266
6c7d463eaf1e Don't allow duplicate extension names in index header.
Timo Sirainen <tss@iki.fi>
parents: 3129
diff changeset
267 if (mail_index_map_lookup_ext(map, name) != (uint32_t)-1) {
6c7d463eaf1e Don't allow duplicate extension names in index header.
Timo Sirainen <tss@iki.fi>
parents: 3129
diff changeset
268 mail_index_set_error(index, "Corrupted index file %s: "
6c7d463eaf1e Don't allow duplicate extension names in index header.
Timo Sirainen <tss@iki.fi>
parents: 3129
diff changeset
269 "Duplicate header extension %s",
6c7d463eaf1e Don't allow duplicate extension names in index header.
Timo Sirainen <tss@iki.fi>
parents: 3129
diff changeset
270 index->filepath, name);
6c7d463eaf1e Don't allow duplicate extension names in index header.
Timo Sirainen <tss@iki.fi>
parents: 3129
diff changeset
271 t_pop();
6c7d463eaf1e Don't allow duplicate extension names in index header.
Timo Sirainen <tss@iki.fi>
parents: 3129
diff changeset
272 return -1;
6c7d463eaf1e Don't allow duplicate extension names in index header.
Timo Sirainen <tss@iki.fi>
parents: 3129
diff changeset
273 }
6c7d463eaf1e Don't allow duplicate extension names in index header.
Timo Sirainen <tss@iki.fi>
parents: 3129
diff changeset
274
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
275 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
276 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
277 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
278 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
279 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
280 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
281 t_pop();
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
282
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
283 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
284 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
285 return 1;
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
286 }
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
287
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
288 int mail_index_map_read_keywords(struct mail_index *index,
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
289 struct mail_index_map *map)
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
290 {
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
291 const struct mail_index_ext *ext;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
292 const struct mail_index_keyword_header *kw_hdr;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
293 const struct mail_index_keyword_header_rec *kw_rec;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
294 const char *name, **keywords_list;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
295 unsigned int i, name_len;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
296 uint32_t ext_id;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
297
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
298 ext_id = mail_index_map_lookup_ext(map, "keywords");
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
299 if (ext_id == (uint32_t)-1) {
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
300 map->keywords = NULL;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
301 map->keywords_count = 0;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
302 return 0;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
303 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
304
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
305 ext = array_idx(&map->extensions, ext_id);
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
306
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
307 kw_hdr = CONST_PTR_OFFSET(map->hdr_base, ext->hdr_offset);
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
308 kw_rec = (const void *)(kw_hdr + 1);
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
309 name = (const char *)(kw_rec + kw_hdr->keywords_count);
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
310
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
311 if ((size_t)(name - (const char *)kw_hdr) > ext->hdr_size) {
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
312 mail_index_set_error(index, "Corrupted index file %s: "
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
313 "keywords_count larger than header size",
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
314 index->filepath);
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
315 return -1;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
316 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
317
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
318 /* make sure the header is valid */
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
319 name_len = (const char *)kw_hdr + ext->hdr_size - name;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
320 for (i = 0; i < kw_hdr->keywords_count; i++) {
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
321 if (kw_rec[i].name_offset > name_len) {
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
322 mail_index_set_error(index, "Corrupted index file %s: "
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
323 "name_offset points outside allocated header",
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
324 index->filepath);
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
325 return -1;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
326 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
327 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
328 if (name[name_len-1] != '\0') {
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
329 mail_index_set_error(index, "Corrupted index file %s: "
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
330 "header doesn't end with NUL",
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
331 index->filepath);
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
332 return -1;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
333 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
334
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
335 if (map->keywords_pool == NULL)
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
336 map->keywords_pool = pool_alloconly_create("keywords", 1024);
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
337
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
338 /* Save keywords in memory. Only new keywords should come into the
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
339 mapping, so keep the existing keyword strings in memory to allow
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
340 mail_index_lookup_keywords() to safely return direct pointers
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
341 into them. */
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
342 if (kw_hdr->keywords_count < map->keywords_count) {
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
343 mail_index_set_error(index, "Corrupted index file %s: "
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
344 "Keywords removed unexpectedly",
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
345 index->filepath);
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
346 return -1;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
347 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
348 if (kw_hdr->keywords_count == map->keywords_count) {
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
349 /* nothing changed */
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
350 return 0;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
351 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
352
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
353 /* @UNSAFE */
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
354 keywords_list = p_new(map->keywords_pool,
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
355 const char *, kw_hdr->keywords_count + 1);
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
356 for (i = 0; i < map->keywords_count; i++)
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
357 keywords_list[i] = map->keywords[i];
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
358 for (; i < kw_hdr->keywords_count; i++) {
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
359 keywords_list[i] = p_strdup(map->keywords_pool,
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
360 name + kw_rec[i].name_offset);
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
361 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
362 map->keywords = keywords_list;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
363 map->keywords_count = kw_hdr->keywords_count;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
364 return 0;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
365 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
366
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
367 const char *const *mail_index_get_keywords(struct mail_index *index)
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
368 {
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
369 (void)mail_index_map_read_keywords(index, index->map);
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
370 return index->map->keywords;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
371 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
372
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
373 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
374 struct mail_index_map *map)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375 {
2884
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
376 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
377 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
378
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
379 memset(compat_data, 0, sizeof(compat_data));
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
380 #ifndef WORDS_BIGENDIAN
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381 compat_data[0] = MAIL_INDEX_COMPAT_LITTLE_ENDIAN;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
382 #endif
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
383 compat_data[1] = sizeof(uoff_t);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384 compat_data[2] = sizeof(time_t);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386 if (hdr->major_version != MAIL_INDEX_MAJOR_VERSION) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
387 /* major version change - handle silently(?) */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
388 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
389 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
390 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
391 /* architecture change - handle silently(?) */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
393 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394
2884
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
395 if ((map->hdr.flags & MAIL_INDEX_HDR_FLAG_CORRUPTED) != 0) {
2095
Timo Sirainen <tss@iki.fi>
parents: 2073
diff changeset
396 /* we've already complained about it */
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
397 return -1;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
398 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
400 /* 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
401 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
402 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
403 "uid_validity = 0, next_uid = %u",
596267d8e2e2 Some more UIDVALIDITY issues fixed.
Timo Sirainen <tss@iki.fi>
parents: 2050
diff changeset
404 index->filepath, hdr->next_uid);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
405 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
406 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
407
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
408 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
409 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
410 "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
411 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
412 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
413 return -1;
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
414 }
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
415
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
416 if (hdr->next_uid == 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
417 return 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
418
2038
df504dad3aec Recent flag fixes. Should work perfectly now with maildir.
Timo Sirainen <tss@iki.fi>
parents: 2021
diff changeset
419 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
420 hdr->seen_messages_count > hdr->messages_count ||
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421 hdr->deleted_messages_count > hdr->messages_count)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422 return 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423 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
424 hdr->first_unseen_uid_lowwater > hdr->next_uid ||
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
425 hdr->first_deleted_uid_lowwater > hdr->next_uid)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426 return 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
428 return mail_index_read_extensions(index, map);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
429 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
430
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
431 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
432 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
433 {
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
434 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
435 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
436 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
437 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
438 } 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
439 i_assert(map->buffer == NULL);
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
440 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
441 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
442 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
443 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
444
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
445 if (map->refcount > 0) {
2884
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
446 memset(&map->hdr, 0, sizeof(map->hdr));
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
447 map->mmap_size = 0;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
448 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
449 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
450 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
451 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
452 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
453
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
454 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
455 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
456 if (--map->refcount > 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
457 return;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
458
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
459 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
460 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
461 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
462 pool_unref(map->extension_pool);
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
463 if (map->keywords_pool != NULL)
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
464 pool_unref(map->keywords_pool);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
465 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
466 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
467 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
468
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
469 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
470 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
471 {
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
472 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
473 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
474 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
475
2922
fadf33c24902 With mmap_disabled=no the index header wasn't always updated causing various
Timo Sirainen <tss@iki.fi>
parents: 2921
diff changeset
476 static void mail_index_map_copy_hdr(struct mail_index_map *map,
fadf33c24902 With mmap_disabled=no the index header wasn't always updated causing various
Timo Sirainen <tss@iki.fi>
parents: 2921
diff changeset
477 const struct mail_index_header *hdr)
fadf33c24902 With mmap_disabled=no the index header wasn't always updated causing various
Timo Sirainen <tss@iki.fi>
parents: 2921
diff changeset
478 {
fadf33c24902 With mmap_disabled=no the index header wasn't always updated causing various
Timo Sirainen <tss@iki.fi>
parents: 2921
diff changeset
479 if (hdr->base_header_size < sizeof(map->hdr)) {
fadf33c24902 With mmap_disabled=no the index header wasn't always updated causing various
Timo Sirainen <tss@iki.fi>
parents: 2921
diff changeset
480 /* header smaller than ours, make a copy so our newer headers
fadf33c24902 With mmap_disabled=no the index header wasn't always updated causing various
Timo Sirainen <tss@iki.fi>
parents: 2921
diff changeset
481 won't have garbage in them */
fadf33c24902 With mmap_disabled=no the index header wasn't always updated causing various
Timo Sirainen <tss@iki.fi>
parents: 2921
diff changeset
482 memset(&map->hdr, 0, sizeof(map->hdr));
fadf33c24902 With mmap_disabled=no the index header wasn't always updated causing various
Timo Sirainen <tss@iki.fi>
parents: 2921
diff changeset
483 memcpy(&map->hdr, hdr, hdr->base_header_size);
fadf33c24902 With mmap_disabled=no the index header wasn't always updated causing various
Timo Sirainen <tss@iki.fi>
parents: 2921
diff changeset
484 } else {
fadf33c24902 With mmap_disabled=no the index header wasn't always updated causing various
Timo Sirainen <tss@iki.fi>
parents: 2921
diff changeset
485 map->hdr = *hdr;
fadf33c24902 With mmap_disabled=no the index header wasn't always updated causing various
Timo Sirainen <tss@iki.fi>
parents: 2921
diff changeset
486 }
fadf33c24902 With mmap_disabled=no the index header wasn't always updated causing various
Timo Sirainen <tss@iki.fi>
parents: 2921
diff changeset
487 }
fadf33c24902 With mmap_disabled=no the index header wasn't always updated causing various
Timo Sirainen <tss@iki.fi>
parents: 2921
diff changeset
488
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
489 static int mail_index_mmap(struct mail_index *index, struct mail_index_map *map)
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
490 {
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
491 const struct mail_index_header *hdr;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
492 unsigned int records_count;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
493
2193
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
494 i_assert(!map->write_to_disk);
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
495
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
496 if (map->buffer != NULL) {
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
497 /* we had temporarily used a buffer, eg. for updating index */
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
498 buffer_free(map->buffer);
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
499 map->buffer = NULL;
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
500 }
2043
4548def7ac02 Don't try to re-map dirty memory mapping.
Timo Sirainen <tss@iki.fi>
parents: 2038
diff changeset
501
2761
f96a7b2d1c52 Removed mmap() memory area protections. They weren't always set correctly.
Timo Sirainen <tss@iki.fi>
parents: 2723
diff changeset
502 map->mmap_base = index->readonly ?
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
503 mmap_ro_file(index->fd, &map->mmap_size) :
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
504 mmap_rw_file(index->fd, &map->mmap_size);
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
505 if (map->mmap_base == MAP_FAILED) {
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
506 map->mmap_base = NULL;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
507 mail_index_set_syscall_error(index, "mmap()");
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
508 return -1;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
509 }
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
510
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
511 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
512 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
513 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
514 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
515 /* 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
516 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
517 }
280c933983a9 Handle major version changes silently even if the file isn't large enough to
Timo Sirainen <tss@iki.fi>
parents: 2821
diff changeset
518
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
519 if (map->mmap_size < MAIL_INDEX_HEADER_MIN_SIZE) {
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
520 mail_index_set_error(index, "Corrupted index file %s: "
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
521 "File too small (%"PRIuSIZE_T")",
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
522 index->filepath, map->mmap_size);
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
523 return 0;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
524 }
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
525
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
526 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
527 hdr->messages_count * hdr->record_size;
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
528
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
529 if (map->mmap_used_size > map->mmap_size) {
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
530 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
531 hdr->record_size;
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
532 mail_index_set_error(index, "Corrupted index file %s: "
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
533 "messages_count too large (%u > %u)",
2122
db5807f350ca crashfix on error
Timo Sirainen <tss@iki.fi>
parents: 2116
diff changeset
534 index->filepath, hdr->messages_count,
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
535 records_count);
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
536 return 0;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
537 }
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
538
2922
fadf33c24902 With mmap_disabled=no the index header wasn't always updated causing various
Timo Sirainen <tss@iki.fi>
parents: 2921
diff changeset
539 mail_index_map_copy_hdr(map, hdr);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
540
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
541 map->hdr_base = map->mmap_base;
2884
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
542 map->records = PTR_OFFSET(map->mmap_base, map->hdr.header_size);
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
543 map->records_count = map->hdr.messages_count;
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
544 return 1;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
545 }
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
546
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
547 static int mail_index_read_header(struct mail_index *index,
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
548 struct mail_index_header *hdr, size_t *pos_r)
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
549 {
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
550 size_t pos;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
551 int ret;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
552
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
553 memset(hdr, 0, sizeof(*hdr));
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
554
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
555 ret = 1;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
556 for (pos = 0; ret > 0 && pos < sizeof(*hdr); ) {
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
557 ret = pread(index->fd, PTR_OFFSET(hdr, pos),
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
558 sizeof(*hdr) - pos, pos);
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
559 if (ret > 0)
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
560 pos += ret;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
561 }
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
562 *pos_r = pos;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
563 return ret;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
564 }
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
565
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
566 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
567 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
568 {
2884
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
569 struct mail_index_header hdr;
1939
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
570 void *data = NULL;
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
571 ssize_t ret;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
572 size_t pos, records_size;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
573
2043
4548def7ac02 Don't try to re-map dirty memory mapping.
Timo Sirainen <tss@iki.fi>
parents: 2038
diff changeset
574 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
575
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
576 *retry_r = FALSE;
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
577 ret = mail_index_read_header(index, &hdr, &pos);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
578
2825
645b8442b519 one more major version change fix
Timo Sirainen <tss@iki.fi>
parents: 2824
diff changeset
579 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
580 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
581 /* 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
582 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
583 }
280c933983a9 Handle major version changes silently even if the file isn't large enough to
Timo Sirainen <tss@iki.fi>
parents: 2821
diff changeset
584
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
585 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
586 (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
587 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
588 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
589 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
590 "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
591 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
592 hdr.header_size);
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
593 return 0;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
594 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
595
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
596 buffer_reset(map->hdr_copy_buf);
2884
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
597 buffer_append(map->hdr_copy_buf, &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
598
2884
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
599 /* @UNSAFE */
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
600 data = buffer_append_space_unsafe(map->hdr_copy_buf,
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
601 hdr.header_size -
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
602 hdr.base_header_size);
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
603 ret = pread_full(index->fd, data,
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
604 hdr.header_size - hdr.base_header_size,
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
605 hdr.base_header_size);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
606 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
607
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
608 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
609 records_size = hdr.messages_count * hdr.record_size;
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
610
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
611 if (map->buffer == NULL) {
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
612 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
613 records_size);
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
614 }
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
615
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
616 /* @UNSAFE */
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
617 buffer_set_used_size(map->buffer, 0);
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
618 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
619
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
620 ret = pread_full(index->fd, data, records_size,
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
621 hdr.header_size);
1939
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
622 }
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
623
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
624 if (ret < 0) {
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
625 if (errno == ESTALE) {
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
626 *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
627 return 0;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
628 }
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
629 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
630 return -1;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
631 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
632 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
633 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
634 "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
635 index->filepath);
2824
431f677bc0b9 More rebuilding fixes with mmap_disable=yes
Timo Sirainen <tss@iki.fi>
parents: 2823
diff changeset
636 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
637 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
638
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
639 map->records = data;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
640 map->records_count = hdr.messages_count;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
641
2922
fadf33c24902 With mmap_disabled=no the index header wasn't always updated causing various
Timo Sirainen <tss@iki.fi>
parents: 2921
diff changeset
642 mail_index_map_copy_hdr(map, &hdr);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
643 map->hdr_base = map->hdr_copy_buf->data;
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
644
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
645 index->sync_log_file_seq = hdr.log_file_seq;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
646 index->sync_log_file_offset = hdr.log_file_int_offset;
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
647 return 1;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
648 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
649
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
650 static int mail_index_sync_from_transactions(struct mail_index *index,
2913
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
651 struct mail_index_map **map,
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
652 int sync_to_index)
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
653 {
2913
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
654 const struct mail_index_header *map_hdr = &(*map)->hdr;
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
655 struct mail_index_view *view;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
656 struct mail_transaction_log_view *log_view;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
657 struct mail_index_sync_map_ctx sync_map_ctx;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
658 struct mail_index_header hdr;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
659 const struct mail_transaction_header *thdr;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
660 const void *tdata;
2939
00b78082cd50 mmap_disable=yes: when we're syncing index by reading transaction log,
Timo Sirainen <tss@iki.fi>
parents: 2938
diff changeset
661 uint32_t prev_seq, max_seq;
00b78082cd50 mmap_disable=yes: when we're syncing index by reading transaction log,
Timo Sirainen <tss@iki.fi>
parents: 2938
diff changeset
662 uoff_t prev_offset, max_offset;
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
663 size_t pos;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
664 int ret, skipped;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
665
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
666 if (sync_to_index) {
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
667 /* read the real log position where we are supposed to be
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
668 synced */
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
669 ret = mail_index_read_header(index, &hdr, &pos);
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
670 if (ret < 0 && errno != ESTALE) {
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
671 mail_index_set_syscall_error(index, "pread()");
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
672 return -1;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
673 }
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
674 if (pos < MAIL_INDEX_HEADER_MIN_SIZE)
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
675 return 0;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
676
2913
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
677 if (map_hdr->log_file_seq == hdr.log_file_seq &&
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
678 map_hdr->log_file_int_offset == hdr.log_file_int_offset) {
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
679 /* nothing to do */
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
680 return 1;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
681 }
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
682
2913
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
683 if (map_hdr->log_file_seq > hdr.log_file_seq ||
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
684 (map_hdr->log_file_seq == hdr.log_file_seq &&
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
685 map_hdr->log_file_int_offset > hdr.log_file_int_offset)) {
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
686 /* we went too far, have to re-read the file */
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
687 return 0;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
688 }
2913
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
689 if (map_hdr->log_file_ext_offset !=
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
690 map_hdr->log_file_int_offset ||
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
691 hdr.log_file_ext_offset != hdr.log_file_int_offset) {
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
692 /* too much trouble to get this right. */
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
693 return 0;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
694 }
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
695 max_seq = hdr.log_file_seq;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
696 max_offset = hdr.log_file_int_offset;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
697 } else {
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
698 /* sync everything there is */
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
699 max_seq = (uint32_t)-1;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
700 max_offset = (uoff_t)-1;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
701 }
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
702
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
703 log_view = mail_transaction_log_view_open(index->log);
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
704 if (mail_transaction_log_view_set(log_view,
2913
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
705 map_hdr->log_file_seq,
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
706 map_hdr->log_file_int_offset,
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
707 max_seq, max_offset,
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
708 MAIL_TRANSACTION_TYPE_MASK) < 0) {
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
709 mail_transaction_log_view_close(log_view);
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
710 return 0;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
711 }
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
712
2913
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
713 index->map = *map;
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
714
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
715 view = mail_index_view_open(index);
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
716 mail_index_sync_map_init(&sync_map_ctx, view,
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
717 MAIL_INDEX_SYNC_HANDLER_VIEW);
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
718
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
719 while ((ret = mail_transaction_log_view_next(log_view, &thdr, &tdata,
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
720 &skipped)) > 0) {
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
721 if (mail_index_sync_record(&sync_map_ctx, thdr, tdata) < 0) {
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
722 ret = -1;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
723 break;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
724 }
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
725 }
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
726
2939
00b78082cd50 mmap_disable=yes: when we're syncing index by reading transaction log,
Timo Sirainen <tss@iki.fi>
parents: 2938
diff changeset
727 mail_transaction_log_view_get_prev_pos(log_view, &prev_seq,
00b78082cd50 mmap_disable=yes: when we're syncing index by reading transaction log,
Timo Sirainen <tss@iki.fi>
parents: 2938
diff changeset
728 &prev_offset);
3173
d137899ea853 We could have gone past the transaction log view's boundaries if log was
Timo Sirainen <tss@iki.fi>
parents: 3147
diff changeset
729 i_assert(prev_seq <= max_seq &&
d137899ea853 We could have gone past the transaction log view's boundaries if log was
Timo Sirainen <tss@iki.fi>
parents: 3147
diff changeset
730 (prev_seq != max_seq || prev_offset <= max_offset));
d137899ea853 We could have gone past the transaction log view's boundaries if log was
Timo Sirainen <tss@iki.fi>
parents: 3147
diff changeset
731
d137899ea853 We could have gone past the transaction log view's boundaries if log was
Timo Sirainen <tss@iki.fi>
parents: 3147
diff changeset
732 index->map->hdr.log_file_seq = prev_seq;
2939
00b78082cd50 mmap_disable=yes: when we're syncing index by reading transaction log,
Timo Sirainen <tss@iki.fi>
parents: 2938
diff changeset
733 index->map->hdr.log_file_int_offset =
00b78082cd50 mmap_disable=yes: when we're syncing index by reading transaction log,
Timo Sirainen <tss@iki.fi>
parents: 2938
diff changeset
734 index->map->hdr.log_file_ext_offset = prev_offset;
00b78082cd50 mmap_disable=yes: when we're syncing index by reading transaction log,
Timo Sirainen <tss@iki.fi>
parents: 2938
diff changeset
735
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
736 mail_index_sync_map_deinit(&sync_map_ctx);
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
737 mail_index_view_close(view);
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
738 mail_transaction_log_view_close(log_view);
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
739
2913
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
740 *map = index->map;
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
741 index->map = NULL;
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
742
2896
305476a6f8ed When we actually read index file's header make sure it gets copied to memory
Timo Sirainen <tss@iki.fi>
parents: 2895
diff changeset
743 if (sync_to_index) {
305476a6f8ed When we actually read index file's header make sure it gets copied to memory
Timo Sirainen <tss@iki.fi>
parents: 2895
diff changeset
744 /* make sure log file offsets get copied. most of the other
305476a6f8ed When we actually read index file's header make sure it gets copied to memory
Timo Sirainen <tss@iki.fi>
parents: 2895
diff changeset
745 fields should stay the same. */
2956
cd257e96a370 Added assert
Timo Sirainen <tss@iki.fi>
parents: 2940
diff changeset
746 i_assert(hdr.messages_count == (*map)->hdr.messages_count);
2913
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
747 (*map)->hdr = hdr;
2896
305476a6f8ed When we actually read index file's header make sure it gets copied to memory
Timo Sirainen <tss@iki.fi>
parents: 2895
diff changeset
748 }
305476a6f8ed When we actually read index file's header make sure it gets copied to memory
Timo Sirainen <tss@iki.fi>
parents: 2895
diff changeset
749
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
750 return ret < 0 ? -1 : 1;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
751 }
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
752
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
753 static int mail_index_read_map_with_retry(struct mail_index *index,
2913
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
754 struct mail_index_map **map,
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
755 int sync_to_index)
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
756 {
2934
c3ae75597952 Added "sync lost" handlers which are called with mmap_disable=yes when index
Timo Sirainen <tss@iki.fi>
parents: 2926
diff changeset
757 mail_index_sync_lost_handler_t *const *handlers;
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
758 unsigned int i, count;
2934
c3ae75597952 Added "sync lost" handlers which are called with mmap_disable=yes when index
Timo Sirainen <tss@iki.fi>
parents: 2926
diff changeset
759 int 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
760
2938
bc8ff03715b2 mmap_disable=yes: if mail_index_map() is called while syncing make sure we
Timo Sirainen <tss@iki.fi>
parents: 2937
diff changeset
761 if (index->log_locked) {
bc8ff03715b2 mmap_disable=yes: if mail_index_map() is called while syncing make sure we
Timo Sirainen <tss@iki.fi>
parents: 2937
diff changeset
762 /* we're most likely syncing the index and we really don't
bc8ff03715b2 mmap_disable=yes: if mail_index_map() is called while syncing make sure we
Timo Sirainen <tss@iki.fi>
parents: 2937
diff changeset
763 want to read more than what was synced last time. */
bc8ff03715b2 mmap_disable=yes: if mail_index_map() is called while syncing make sure we
Timo Sirainen <tss@iki.fi>
parents: 2937
diff changeset
764 sync_to_index = TRUE;
bc8ff03715b2 mmap_disable=yes: if mail_index_map() is called while syncing make sure we
Timo Sirainen <tss@iki.fi>
parents: 2937
diff changeset
765 }
bc8ff03715b2 mmap_disable=yes: if mail_index_map() is called while syncing make sure we
Timo Sirainen <tss@iki.fi>
parents: 2937
diff changeset
766
3177
95d2d8d5958b Some error handling path crashfixes.
Timo Sirainen <tss@iki.fi>
parents: 3173
diff changeset
767 if ((*map)->hdr.indexid != 0 && index->log != NULL) {
95d2d8d5958b Some error handling path crashfixes.
Timo Sirainen <tss@iki.fi>
parents: 3173
diff changeset
768 /* we're not creating the index, or opening transaction log.
95d2d8d5958b Some error handling path crashfixes.
Timo Sirainen <tss@iki.fi>
parents: 3173
diff changeset
769 sync this as a view from transaction log. */
2935
0b72e95cd3ae Don't try to fsck when we're modifying index. It could have happened with
Timo Sirainen <tss@iki.fi>
parents: 2934
diff changeset
770 index->sync_update = TRUE;
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
771 ret = mail_index_sync_from_transactions(index, map,
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
772 sync_to_index);
2935
0b72e95cd3ae Don't try to fsck when we're modifying index. It could have happened with
Timo Sirainen <tss@iki.fi>
parents: 2934
diff changeset
773 index->sync_update = FALSE;
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
774 if (ret != 0)
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
775 return ret;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
776
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
777 /* transaction log lost/broken, fallback to re-reading it */
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
778 }
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
779
2934
c3ae75597952 Added "sync lost" handlers which are called with mmap_disable=yes when index
Timo Sirainen <tss@iki.fi>
parents: 2926
diff changeset
780 /* notify all "sync lost" handlers */
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
781 handlers = array_get(&index->sync_lost_handlers, &count);
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
782 for (i = 0; i < count; i++)
2934
c3ae75597952 Added "sync lost" handlers which are called with mmap_disable=yes when index
Timo Sirainen <tss@iki.fi>
parents: 2926
diff changeset
783 (*handlers[i])(index);
c3ae75597952 Added "sync lost" handlers which are called with mmap_disable=yes when index
Timo Sirainen <tss@iki.fi>
parents: 2926
diff changeset
784
1965
41f6a04154a3 INDEX_KEYWORDS_BYTE_COUNT was counted wrong so index files were larger than
Timo Sirainen <tss@iki.fi>
parents: 1946
diff changeset
785 for (i = 0; i < MAIL_INDEX_ESTALE_RETRY_COUNT; i++) {
2913
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
786 ret = mail_index_read_map(index, *map, &retry);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
787 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
788 return ret;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
789
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
790 /* 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
791 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
792 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
793 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
794
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
795 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
796 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
797 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
798 /* 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
799 errno = ENOENT;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
800 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
801 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
802 return -1;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
803 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
804 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
805
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
806 /* 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
807 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
808 return -1;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
809 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
810
2553
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
811 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
812 {
1946
dbec6c9dbffa syncing fix
Timo Sirainen <tss@iki.fi>
parents: 1945
diff changeset
813 const struct mail_index_header *hdr;
2553
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
814 size_t used_size;
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
815
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
816 if (MAIL_INDEX_MAP_IS_IN_MEMORY(map))
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
817 return 0;
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
818
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
819 hdr = map->mmap_base;
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
820
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
821 /* always check corrupted-flag to avoid errors later */
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
822 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
823 return -1;
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
824
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
825 used_size = hdr->header_size + hdr->messages_count * hdr->record_size;
2884
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
826 if (map->mmap_size >= used_size && map->hdr_base == hdr) {
2553
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
827 map->records_count = hdr->messages_count;
2922
fadf33c24902 With mmap_disabled=no the index header wasn't always updated causing various
Timo Sirainen <tss@iki.fi>
parents: 2921
diff changeset
828 mail_index_map_copy_hdr(map, hdr);
2553
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
829 return 1;
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
830 }
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
831 return 0;
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
832 }
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
833
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
834 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
835 {
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
836 struct mail_index_map *map;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
837 int ret;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
838
3179
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
839 i_assert(!index->mapping);
2913
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
840 i_assert(index->map == NULL || index->map->refcount > 0);
2895
51be21fc2c9d Avoid re-reading index file with mmap_disable=yes.
Timo Sirainen <tss@iki.fi>
parents: 2885
diff changeset
841 i_assert(index->lock_type != F_UNLCK);
51be21fc2c9d Avoid re-reading index file with mmap_disable=yes.
Timo Sirainen <tss@iki.fi>
parents: 2885
diff changeset
842
3179
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
843 index->mapping = TRUE;
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
844
2553
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
845 if (!force && index->map != NULL) {
2937
43deb226d769 Added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 2936
diff changeset
846 i_assert(index->hdr != NULL);
2553
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
847 ret = mail_index_map_try_existing(index->map);
3179
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
848 if (ret != 0) {
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
849 index->mapping = FALSE;
2553
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
850 return ret;
3179
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
851 }
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
852
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
853 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
854 /* we're syncing, don't break the mapping */
3179
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
855 index->mapping = FALSE;
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
856 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
857 }
2553
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
858 }
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
859
2542
c3608081d0e4 When updating index mappings, don't let it affect existing views mappings.
Timo Sirainen <tss@iki.fi>
parents: 2409
diff changeset
860 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
861 /* 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
862 pointers into it. leave them and create a new mapping. */
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
863 if (!index->mmap_disable) {
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
864 map = NULL;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
865 } else {
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
866 /* create a copy of the mapping instead so we don't
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
867 have to re-read it */
2911
f2c2b17d7659 Changed mail_index_map_to_memory() to mail_index_map_clone(). Even if the
Timo Sirainen <tss@iki.fi>
parents: 2902
diff changeset
868 map = mail_index_map_clone(index->map,
f2c2b17d7659 Changed mail_index_map_to_memory() to mail_index_map_clone(). Even if the
Timo Sirainen <tss@iki.fi>
parents: 2902
diff changeset
869 index->map->hdr.record_size);
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
870 }
2542
c3608081d0e4 When updating index mappings, don't let it affect existing views mappings.
Timo Sirainen <tss@iki.fi>
parents: 2409
diff changeset
871 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
872 index->map = NULL;
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
873 } else {
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
874 map = index->map;
2542
c3608081d0e4 When updating index mappings, don't let it affect existing views mappings.
Timo Sirainen <tss@iki.fi>
parents: 2409
diff changeset
875 }
c3608081d0e4 When updating index mappings, don't let it affect existing views mappings.
Timo Sirainen <tss@iki.fi>
parents: 2409
diff changeset
876
2050
ee1095ccfd23 Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents: 2043
diff changeset
877 if (map == NULL) {
ee1095ccfd23 Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents: 2043
diff changeset
878 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
879 map->refcount = 1;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
880 map->hdr_copy_buf =
2884
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
881 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
882 } else if (MAIL_INDEX_MAP_IS_IN_MEMORY(map)) {
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
883 i_assert(!map->write_to_disk);
2050
ee1095ccfd23 Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents: 2043
diff changeset
884 } else if (map->mmap_base != NULL) {
2193
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
885 i_assert(map->buffer == NULL);
1946
dbec6c9dbffa syncing fix
Timo Sirainen <tss@iki.fi>
parents: 1945
diff changeset
886 if (munmap(map->mmap_base, map->mmap_size) < 0)
dbec6c9dbffa syncing fix
Timo Sirainen <tss@iki.fi>
parents: 1945
diff changeset
887 mail_index_set_syscall_error(index, "munmap()");
dbec6c9dbffa syncing fix
Timo Sirainen <tss@iki.fi>
parents: 1945
diff changeset
888 map->mmap_base = NULL;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
889 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
890
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
891 index->hdr = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
892 index->map = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
893
2823
43bab10e060d Rebuild broken index files with mmap_disabled=yes too..
Timo Sirainen <tss@iki.fi>
parents: 2822
diff changeset
894 if (!index->mmap_disable)
43bab10e060d Rebuild broken index files with mmap_disabled=yes too..
Timo Sirainen <tss@iki.fi>
parents: 2822
diff changeset
895 ret = mail_index_mmap(index, map);
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
896 else
2913
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
897 ret = mail_index_read_map_with_retry(index, &map, force);
2937
43deb226d769 Added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 2936
diff changeset
898 i_assert(index->map == NULL);
43deb226d769 Added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 2936
diff changeset
899
3179
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
900 if (ret > 0) {
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
901 ret = mail_index_check_header(index, map);
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
902 if (ret < 0)
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
903 ret = 0;
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
904 else if (ret == 0) {
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
905 index->fsck = TRUE;
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
906 ret = 1;
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
907 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
908 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
909
3179
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
910 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
911 mail_index_unmap_forced(index, map);
3179
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
912 index->mapping = FALSE;
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
913 return ret;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
914 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
915
2884
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
916 index->hdr = &map->hdr;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
917 index->map = map;
2937
43deb226d769 Added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 2936
diff changeset
918 i_assert(map->hdr.messages_count == map->records_count);
3179
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
919 index->mapping = FALSE;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
920 return 1;
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
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
923 struct mail_index_map *
2911
f2c2b17d7659 Changed mail_index_map_to_memory() to mail_index_map_clone(). Even if the
Timo Sirainen <tss@iki.fi>
parents: 2902
diff changeset
924 mail_index_map_clone(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
925 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
926 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
927 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
928 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
929 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
930 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
931 unsigned int i, count;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
932
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
933 size = map->records_count * new_record_size;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
934
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
935 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
936 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
937 mem_map->buffer = buffer_create_dynamic(default_pool, size);
2884
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
938 if (map->hdr.record_size == new_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
939 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
940 else {
2884
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
941 copy_size = I_MIN(map->hdr.record_size, new_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
942 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
943 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
944 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
945 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
946 memcpy(dest, src, copy_size);
2884
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
947 src = PTR_OFFSET(src, map->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
948 }
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
949 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
950
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
951 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
952 mem_map->records_count = map->records_count;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
953
2708
f1e9f3ec8135 Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents: 2683
diff changeset
954 mem_map->hdr_copy_buf =
2884
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
955 buffer_create_dynamic(default_pool, map->hdr.header_size);
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
956 if (map->hdr.base_header_size < sizeof(*hdr))
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
957 buffer_append_zero(mem_map->hdr_copy_buf, sizeof(*hdr));
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
958 buffer_write(mem_map->hdr_copy_buf, 0,
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
959 &map->hdr, map->hdr.base_header_size);
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
960 buffer_append(mem_map->hdr_copy_buf,
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
961 CONST_PTR_OFFSET(map->hdr_base,
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
962 map->hdr.base_header_size),
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
963 map->hdr.header_size - map->hdr.base_header_size);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
964
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
965 hdr = buffer_get_modifyable_data(mem_map->hdr_copy_buf, NULL);
2884
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
966 if (hdr->base_header_size < sizeof(*hdr))
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
967 hdr->base_header_size = sizeof(*hdr);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
968 hdr->record_size = new_record_size;
2884
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
969 mem_map->hdr = *hdr;
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
970 mem_map->hdr_base = hdr;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
971
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
972 /* copy extensions */
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
973 if (array_is_created(&map->ext_id_map)) {
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
974 count = array_count(&map->ext_id_map);
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
975 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
976
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
977 array_append_array(&mem_map->extensions, &map->extensions);
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
978 array_append_array(&mem_map->ext_id_map, &map->ext_id_map);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
979
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
980 /* fix the name pointers to use our own pool */
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
981 extensions = array_get_modifyable(&mem_map->extensions, &count);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
982 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
983 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
984 extensions[i].name);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
985 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
986 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
987
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
988 return mem_map;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
989 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
990
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
991 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
992 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
993 {
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
994 const uint32_t *id;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
995
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
996 if (!array_is_created(&map->ext_id_map) ||
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
997 ext_id >= array_count(&map->ext_id_map))
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
998 return 0;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
999
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
1000 id = array_idx(&map->ext_id_map, ext_id);
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
1001 *idx_r = *id;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
1002 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
1003 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
1004
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1005 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
1006 {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1007 int i;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1008
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1009 for (i = 0; i < 3; i++) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1010 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
1011 if (index->fd == -1 && errno == EACCES) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1012 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
1013 index->readonly = TRUE;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1014 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1015 if (index->fd != -1 || errno != ESTALE)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1016 break;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1017
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1018 /* 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
1019 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
1020 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
1021 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
1022 from server.. */
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1023 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1024 if (index->fd == -1) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1025 if (errno != ENOENT)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1026 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
1027
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1028 /* have to create it */
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1029 return 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1030 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1031 return 1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1032 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1033
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1034 static int
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1035 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
1036 {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1037 unsigned int lock_id;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1038 int ret;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1039
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1040 if (lock_id_r != NULL)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1041 *lock_id_r = 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1042
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1043 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
1044 if (ret <= 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1045 return ret;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1046
2409
9183098d7fdf Fixed fd leaks
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
1047 if (mail_index_lock_shared(index, FALSE, &lock_id) < 0) {
9183098d7fdf Fixed fd leaks
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
1048 (void)close(index->fd);
9183098d7fdf Fixed fd leaks
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
1049 index->fd = -1;
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1050 return -1;
2409
9183098d7fdf Fixed fd leaks
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
1051 }
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1052 ret = mail_index_map(index, FALSE);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1053 if (ret == 0) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1054 /* it's corrupted - recreate it */
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1055 mail_index_unlock(index, lock_id);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1056 if (lock_id_r != NULL)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1057 *lock_id_r = 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1058
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1059 (void)close(index->fd);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1060 index->fd = -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1061 } else {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1062 if (lock_id_r != NULL)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1063 *lock_id_r = lock_id;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1064 else
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1065 mail_index_unlock(index, lock_id);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1066 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1067 return ret;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1068 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1069
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
1070 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
1071 const struct mail_index_header *hdr)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1072 {
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
1073 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
1074
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
1075 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
1076
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
1077 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
1078 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
1079 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
1080 return mail_index_set_syscall_error(index, "msync()");
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1081 } 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
1082 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
1083 mail_index_set_syscall_error(index, "pwrite_full()");
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1084 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1085 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1086
2902
1022caefca74 mail_index_write_base_header() doesn't crash anymore if index mapping is in
Timo Sirainen <tss@iki.fi>
parents: 2896
diff changeset
1087 index->map->hdr = *hdr;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
1088 buffer_write(index->map->hdr_copy_buf, 0, hdr, hdr_size);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1089 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1090
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1091 return 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1092 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1093
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1094 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
1095 {
2879
aa93c7216722 dovecot-shared file was supposed to show permissions/gid for files created
Timo Sirainen <tss@iki.fi>
parents: 2877
diff changeset
1096 mode_t old_mask;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1097 const char *path;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1098 int fd;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1099
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1100 path = *path_r = t_strconcat(index->filepath, ".tmp", NULL);
2879
aa93c7216722 dovecot-shared file was supposed to show permissions/gid for files created
Timo Sirainen <tss@iki.fi>
parents: 2877
diff changeset
1101 old_mask = umask(0);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1102 fd = open(path, O_RDWR|O_CREAT|O_TRUNC, index->mode);
2879
aa93c7216722 dovecot-shared file was supposed to show permissions/gid for files created
Timo Sirainen <tss@iki.fi>
parents: 2877
diff changeset
1103 umask(old_mask);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1104 if (fd == -1)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1105 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
1106
2879
aa93c7216722 dovecot-shared file was supposed to show permissions/gid for files created
Timo Sirainen <tss@iki.fi>
parents: 2877
diff changeset
1107 if (index->gid != (gid_t)-1 && fchown(fd, (uid_t)-1, index->gid) < 0) {
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1108 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
1109 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1110 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1111
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1112 return fd;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1113 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1114
1942
2b114aa7eeec handle losing index file
Timo Sirainen <tss@iki.fi>
parents: 1939
diff changeset
1115 static int mail_index_create(struct mail_index *index,
2b114aa7eeec handle losing index file
Timo Sirainen <tss@iki.fi>
parents: 1939
diff changeset
1116 struct mail_index_header *hdr)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1117 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1118 const char *path;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1119 uint32_t seq;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1120 uoff_t offset;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1121 int ret;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1122
2895
51be21fc2c9d Avoid re-reading index file with mmap_disable=yes.
Timo Sirainen <tss@iki.fi>
parents: 2885
diff changeset
1123 i_assert(index->lock_type == F_UNLCK);
51be21fc2c9d Avoid re-reading index file with mmap_disable=yes.
Timo Sirainen <tss@iki.fi>
parents: 2885
diff changeset
1124
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1125 /* log file lock protects index creation */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1126 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
1127 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1128
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
1129 ret = mail_index_try_open(index, NULL);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1130 if (ret != 0) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1131 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
1132 return ret < 0 ? -1 : 0;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1133 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1134
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1135 /* create it fully in index.tmp first */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1136 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
1137 if (index->fd == -1)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1138 ret = -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1139 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
1140 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
1141 ret = -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1142 } else {
2895
51be21fc2c9d Avoid re-reading index file with mmap_disable=yes.
Timo Sirainen <tss@iki.fi>
parents: 2885
diff changeset
1143 index->lock_type = F_WRLCK;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1144 ret = mail_index_map(index, FALSE);
2895
51be21fc2c9d Avoid re-reading index file with mmap_disable=yes.
Timo Sirainen <tss@iki.fi>
parents: 2885
diff changeset
1145 index->lock_type = F_UNLCK;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1146 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1147
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1148 if (ret == 0) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1149 /* 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
1150 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
1151 mail_index_set_error(index,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1152 "Newly created index file is corrupted: %s", path);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1153 ret = -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1154 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1155
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1156 if (ret < 0) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1157 if (unlink(path) < 0 && errno != ENOENT) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1158 mail_index_file_set_syscall_error(index, path,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1159 "unlink()");
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1160 }
2170
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
1161 } else {
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
1162 /* make it visible to others */
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
1163 if (rename(path, index->filepath) < 0) {
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
1164 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
1165 path, index->filepath);
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
1166 ret = -1;
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
1167 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1168 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1169
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1170 mail_transaction_log_sync_unlock(index->log);
2170
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
1171 return ret;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1172 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1173
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
1174 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
1175 {
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
1176 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
1177
3105
f58ff8ec50c4 Added asserts
Timo Sirainen <tss@iki.fi>
parents: 3086
diff changeset
1178 i_assert((sizeof(*hdr) % sizeof(uint64_t)) == 0);
f58ff8ec50c4 Added asserts
Timo Sirainen <tss@iki.fi>
parents: 3086
diff changeset
1179
2073
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
1180 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
1181
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
1182 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
1183 hdr->minor_version = MAIL_INDEX_MINOR_VERSION;
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
1184 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
1185 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
1186 hdr->record_size = sizeof(struct mail_index_record);
2073
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
1187
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
1188 #ifndef WORDS_BIGENDIAN
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
1189 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
1190 #endif
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
1191 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
1192 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
1193
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
1194 hdr->indexid = now;
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
1195
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
1196 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
1197 }
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
1198
2200
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1199 /* returns -1 = error, 0 = won't create, 1 = ok */
1942
2b114aa7eeec handle losing index file
Timo Sirainen <tss@iki.fi>
parents: 1939
diff changeset
1200 static int mail_index_open_files(struct mail_index *index,
2b114aa7eeec handle losing index file
Timo Sirainen <tss@iki.fi>
parents: 1939
diff changeset
1201 enum mail_index_open_flags flags)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1202 {
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
1203 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
1204 unsigned int lock_id = 0;
3129
1ea614abead3 Don't complain about cache indexid changing when recreating index.
Timo Sirainen <tss@iki.fi>
parents: 3105
diff changeset
1205 int ret, created = FALSE;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1206
1935
ec4d5ff99f6e Don't modify index file when creating new transaction log.
Timo Sirainen <tss@iki.fi>
parents: 1930
diff changeset
1207 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
1208 if (ret > 0)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1209 hdr = *index->hdr;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1210 else if (ret == 0) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1211 /* doesn't exist, or corrupted */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1212 if ((flags & MAIL_INDEX_OPEN_FLAG_CREATE) == 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1213 return 0;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
1214 mail_index_header_init(&hdr);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1215 index->hdr = &hdr;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1216 } else if (ret < 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1217 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1218
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1219 index->indexid = hdr.indexid;
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 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
1222 if (index->log == NULL)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1223 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
1224
2200
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1225 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
1226 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
1227 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
1228 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
1229 }
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1230 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
1231 return -1;
3129
1ea614abead3 Don't complain about cache indexid changing when recreating index.
Timo Sirainen <tss@iki.fi>
parents: 3105
diff changeset
1232 created = TRUE;
2200
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1233 }
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1234
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1235 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
1236 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
1237 return -1;
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1238
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1239 }
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1240
3129
1ea614abead3 Don't complain about cache indexid changing when recreating index.
Timo Sirainen <tss@iki.fi>
parents: 3105
diff changeset
1241 index->cache = created ? mail_cache_create(index) :
1ea614abead3 Don't complain about cache indexid changing when recreating index.
Timo Sirainen <tss@iki.fi>
parents: 3105
diff changeset
1242 mail_cache_open_or_create(index);
2200
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1243
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1244 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
1245 return 1;
1915
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
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
1248 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
1249 enum mail_index_lock_method lock_method)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1250 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1251 int i = 0, ret;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1252
2926
c035583b4839 Make sure index is reopened if it's marked corrupted.
Timo Sirainen <tss@iki.fi>
parents: 2922
diff changeset
1253 if (index->opened) {
c035583b4839 Make sure index is reopened if it's marked corrupted.
Timo Sirainen <tss@iki.fi>
parents: 2922
diff changeset
1254 if (index->hdr != NULL &&
c035583b4839 Make sure index is reopened if it's marked corrupted.
Timo Sirainen <tss@iki.fi>
parents: 2922
diff changeset
1255 (index->hdr->flags & MAIL_INDEX_HDR_FLAG_CORRUPTED) != 0) {
c035583b4839 Make sure index is reopened if it's marked corrupted.
Timo Sirainen <tss@iki.fi>
parents: 2922
diff changeset
1256 /* corrupted, reopen files */
c035583b4839 Make sure index is reopened if it's marked corrupted.
Timo Sirainen <tss@iki.fi>
parents: 2922
diff changeset
1257 mail_index_close(index);
c035583b4839 Make sure index is reopened if it's marked corrupted.
Timo Sirainen <tss@iki.fi>
parents: 2922
diff changeset
1258 } else {
c035583b4839 Make sure index is reopened if it's marked corrupted.
Timo Sirainen <tss@iki.fi>
parents: 2922
diff changeset
1259 return 0;
c035583b4839 Make sure index is reopened if it's marked corrupted.
Timo Sirainen <tss@iki.fi>
parents: 2922
diff changeset
1260 }
c035583b4839 Make sure index is reopened if it's marked corrupted.
Timo Sirainen <tss@iki.fi>
parents: 2922
diff changeset
1261 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1262
1967
b6d900688c55 memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 1965
diff changeset
1263 index->filepath = i_strconcat(index->dir, "/", index->prefix, NULL);
b6d900688c55 memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 1965
diff changeset
1264
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1265 do {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1266 index->shared_lock_count = 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1267 index->excl_lock_count = 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1268 index->lock_type = F_UNLCK;
2021
19e638ade25c Locking fixes
Timo Sirainen <tss@iki.fi>
parents: 1984
diff changeset
1269 index->lock_id = 2;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1270
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
1271 index->readonly = FALSE;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1272 index->nodiskspace = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1273 index->index_lock_timeout = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1274 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
1275 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
1276 (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
1277 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
1278 (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
1279 index->lock_method = lock_method;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1280
2895
51be21fc2c9d Avoid re-reading index file with mmap_disable=yes.
Timo Sirainen <tss@iki.fi>
parents: 2885
diff changeset
1281 /* don't even bother to handle dotlocking without mmap being
51be21fc2c9d Avoid re-reading index file with mmap_disable=yes.
Timo Sirainen <tss@iki.fi>
parents: 2885
diff changeset
1282 disabled. that combination simply doesn't make any sense */
2940
0e1481357fbb Changed assert() to friendly human readable message.
Timo Sirainen <tss@iki.fi>
parents: 2939
diff changeset
1283 if (lock_method == MAIL_INDEX_LOCK_DOTLOCK &&
0e1481357fbb Changed assert() to friendly human readable message.
Timo Sirainen <tss@iki.fi>
parents: 2939
diff changeset
1284 !index->mmap_disable) {
0e1481357fbb Changed assert() to friendly human readable message.
Timo Sirainen <tss@iki.fi>
parents: 2939
diff changeset
1285 i_fatal("lock_method=dotlock and mmap_disable=no "
0e1481357fbb Changed assert() to friendly human readable message.
Timo Sirainen <tss@iki.fi>
parents: 2939
diff changeset
1286 "combination isn't supported. "
0e1481357fbb Changed assert() to friendly human readable message.
Timo Sirainen <tss@iki.fi>
parents: 2939
diff changeset
1287 "You don't _really_ want it anyway.");
0e1481357fbb Changed assert() to friendly human readable message.
Timo Sirainen <tss@iki.fi>
parents: 2939
diff changeset
1288 }
2895
51be21fc2c9d Avoid re-reading index file with mmap_disable=yes.
Timo Sirainen <tss@iki.fi>
parents: 2885
diff changeset
1289
1942
2b114aa7eeec handle losing index file
Timo Sirainen <tss@iki.fi>
parents: 1939
diff changeset
1290 ret = mail_index_open_files(index, flags);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1291 if (ret <= 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1292 break;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1293
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1294 index->opened = TRUE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1295 if (index->fsck) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1296 index->fsck = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1297 ret = mail_index_fsck(index);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1298 if (ret == 0) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1299 /* completely broken, reopen */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1300 if (i++ < 3)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1301 continue;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1302 /* too many tries */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1303 ret = -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1304 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1305 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1306 break;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1307 } while (1);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1308
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1309 if (ret <= 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1310 mail_index_close(index);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1311
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1312 return ret;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1313 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1314
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1315 void mail_index_close(struct mail_index *index)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1316 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1317 if (index->log != NULL) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1318 mail_transaction_log_close(index->log);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1319 index->log = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1320 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1321
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
1322 if (index->map != NULL) {
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
1323 mail_index_unmap(index, index->map);
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
1324 index->map = NULL;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
1325 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1326
2200
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1327 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
1328 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
1329 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
1330 }
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1331
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1332 if (index->fd != -1) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1333 if (close(index->fd) < 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1334 mail_index_set_syscall_error(index, "close()");
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1335 index->fd = -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1336 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1337
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1338 i_free(index->copy_lock_path);
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
1339 index->copy_lock_path = NULL;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1340 i_free(index->filepath);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1341 index->filepath = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1342
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1343 index->indexid = 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1344 index->opened = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1345 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1346
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1347 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
1348 {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1349 struct mail_index_map *old_map;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1350 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
1351 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
1352
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1353 old_map = index->map;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1354 old_fd = index->fd;
2895
51be21fc2c9d Avoid re-reading index file with mmap_disable=yes.
Timo Sirainen <tss@iki.fi>
parents: 2885
diff changeset
1355 old_map->refcount++;
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1356
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1357 /* 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
1358 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
1359 old_lock_type = index->lock_type;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1360 old_lock_id = index->lock_id;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1361 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
1362
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1363 if (index->lock_type == F_RDLCK)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1364 index->lock_type = F_UNLCK;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1365 index->lock_id += 2;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1366 index->shared_lock_count = 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1367
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1368 if (fd != -1) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1369 index->fd = fd;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1370 ret = 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1371 } else {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1372 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
1373 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
1374 if (ret > 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1375 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
1376 else if (ret == 0) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1377 /* index file is lost */
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1378 ret = -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1379 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1380 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1381
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1382 if (ret == 0) {
2895
51be21fc2c9d Avoid re-reading index file with mmap_disable=yes.
Timo Sirainen <tss@iki.fi>
parents: 2885
diff changeset
1383 /* read the new mapping. note that with mmap_disable we want
51be21fc2c9d Avoid re-reading index file with mmap_disable=yes.
Timo Sirainen <tss@iki.fi>
parents: 2885
diff changeset
1384 to keep the old mapping in index->map so we can update it
51be21fc2c9d Avoid re-reading index file with mmap_disable=yes.
Timo Sirainen <tss@iki.fi>
parents: 2885
diff changeset
1385 by reading transaction log. */
51be21fc2c9d Avoid re-reading index file with mmap_disable=yes.
Timo Sirainen <tss@iki.fi>
parents: 2885
diff changeset
1386 if (mail_index_map(index, TRUE) <= 0)
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1387 ret = -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1388 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1389
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1390 if (lock_id != 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1391 mail_index_unlock(index, lock_id);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1392
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1393 if (ret == 0) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1394 mail_index_unmap(index, old_map);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1395 if (close(old_fd) < 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1396 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
1397 } else {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1398 if (index->map != NULL)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1399 mail_index_unmap(index, index->map);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1400 if (index->fd != -1) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1401 if (close(index->fd) < 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1402 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
1403 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1404
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1405 index->map = old_map;
2884
173a0296e81d Update view's header only after syncing the view. This and other changes fix
Timo Sirainen <tss@iki.fi>
parents: 2879
diff changeset
1406 index->hdr = &index->map->hdr;
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1407 index->fd = old_fd;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1408 index->lock_type = old_lock_type;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1409 index->lock_id = old_lock_id;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1410 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
1411 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1412 return ret;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1413 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1414
2936
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1415 int mail_index_reopen_if_needed(struct mail_index *index)
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1416 {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1417 struct stat st1, st2;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1418
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1419 if (fstat(index->fd, &st1) < 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1420 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
1421 if (stat(index->filepath, &st2) < 0) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1422 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
1423 if (errno != ENOENT)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1424 return -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1425
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1426 /* lost it? recreate */
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1427 (void)mail_index_mark_corrupted(index);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1428 return -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1429 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1430
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1431 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
1432 !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
1433 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
1434 return -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1435 return 1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1436 } else {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1437 return 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1438 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1439 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1440
2936
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1441 int mail_index_refresh(struct mail_index *index)
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1442 {
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1443 unsigned int lock_id;
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1444 int ret;
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1445
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1446 if (index->excl_lock_count > 0) {
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1447 /* we have index exclusively locked, nothing could
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1448 have changed. */
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1449 return 0;
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1450 }
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1451
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1452 if (!index->mmap_disable) {
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1453 /* reopening is all we need */
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1454 return mail_index_reopen_if_needed(index);
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1455 }
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1456
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1457 /* mail_index_map() simply reads latest changes from transaction log,
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1458 which makes us fully refreshed. */
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1459 if (mail_index_lock_shared(index, TRUE, &lock_id) < 0)
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1460 return -1;
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1461
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1462 ret = mail_index_map(index, FALSE);
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1463 mail_index_unlock(index, lock_id);
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1464 return ret <= 0 ? -1 : 0;
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1465 }
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1466
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1467 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
1468 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1469 return index->cache;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1470 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1471
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1472 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
1473 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1474 va_list va;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1475
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1476 i_free(index->error);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1477
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1478 if (fmt == NULL)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1479 index->error = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1480 else {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1481 va_start(va, fmt);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1482 index->error = i_strdup_vprintf(fmt, va);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1483 va_end(va);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1484
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1485 i_error("%s", index->error);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1486 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1487
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1488 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1489 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1490
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
1491 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
1492 {
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
1493 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
1494 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
1495
1945
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
1496 void mail_index_mark_corrupted(struct mail_index *index)
1943
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1497 {
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1498 struct mail_index_header hdr;
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1499
1945
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
1500 mail_index_set_inconsistent(index);
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
1501
1943
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1502 if (index->readonly)
1945
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
1503 return;
1943
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1504
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1505 hdr = *index->hdr;
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1506 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
1507 if (mail_index_write_base_header(index, &hdr) == 0) {
1945
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
1508 if (fsync(index->fd) < 0)
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
1509 mail_index_set_syscall_error(index, "fsync()");
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
1510 }
1943
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1511 }
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1512
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1513 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
1514 const char *function)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1515 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1516 i_assert(function != NULL);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1517
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1518 if (ENOSPACE(errno)) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1519 index->nodiskspace = TRUE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1520 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1521 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1522
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1523 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
1524 function, index->filepath);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1525 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1526
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1527 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
1528 const char *filepath,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1529 const char *function)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1530 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1531 i_assert(filepath != NULL);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1532 i_assert(function != NULL);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1533
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1534 if (ENOSPACE(errno)) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1535 index->nodiskspace = TRUE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1536 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1537 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1538
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1539 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
1540 function, filepath);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1541 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1542
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1543 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
1544 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1545 if (index->nodiskspace)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1546 return MAIL_INDEX_ERROR_DISKSPACE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1547 if (index->error != NULL)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1548 return MAIL_INDEX_ERROR_INTERNAL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1549
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1550 return MAIL_INDEX_ERROR_NONE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1551 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1552
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1553 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
1554 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1555 return index->error;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1556 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1557
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1558 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
1559 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1560 if (index->error != NULL) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1561 i_free(index->error);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1562 index->error = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1563 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1564
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1565 index->nodiskspace = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1566 index->index_lock_timeout = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1567 }
2407
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1568
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1569 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
1570 {
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1571 unsigned char buf[4];
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1572
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1573 i_assert(offset < 0x40000000);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1574 i_assert((offset & 3) == 0);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1575
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1576 offset >>= 2;
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1577 buf[0] = 0x80 | ((offset & 0x0fe00000) >> 21);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1578 buf[1] = 0x80 | ((offset & 0x001fc000) >> 14);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1579 buf[2] = 0x80 | ((offset & 0x00003f80) >> 7);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1580 buf[3] = 0x80 | (offset & 0x0000007f);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1581 return *((uint32_t *) buf);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1582 }
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1583
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1584 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
1585 {
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1586 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
1587
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1588 if ((offset & 0x80808080) != 0x80808080)
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1589 return 0;
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1590
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1591 return (((uint32_t)buf[3] & 0x7f) << 2) |
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1592 (((uint32_t)buf[2] & 0x7f) << 9) |
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1593 (((uint32_t)buf[1] & 0x7f) << 16) |
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1594 (((uint32_t)buf[0] & 0x7f) << 23);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1595 }