annotate src/lib-index/mail-index.c @ 4594:e92ae6d532f9 HEAD

Removed type parameter from ARRAY_CREATE since it's not needed anymore.
author Timo Sirainen <tss@iki.fi>
date Sun, 10 Sep 2006 15:32:58 +0300
parents bcc5d4dc5400
children bf4e98a0de3f
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"
3470
346a494c2feb Moved array declaration to array-decl.h and include it in lib.h. So array.h
Timo Sirainen <tss@iki.fi>
parents: 3445
diff changeset
4 #include "array.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "buffer.h"
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
6 #include "hash.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "mmap-util.h"
4071
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents: 4067
diff changeset
8 #include "nfs-workarounds.h"
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
9 #include "read-full.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "write-full.h"
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #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
12 #include "mail-index-sync-private.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #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
14 #include "mail-cache.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #include <stdio.h>
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 #include <stddef.h>
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 #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
19 #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
20
4453
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
21 unsigned int mail_index_module_id = 0;
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
22
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
23 static int mail_index_try_open_only(struct mail_index *index);
3243
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
24 static void mail_index_create_in_memory(struct mail_index *index,
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
25 const struct mail_index_header *hdr);
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
26
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 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
28 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 struct mail_index *index;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 index = i_new(struct mail_index, 1);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 index->dir = i_strdup(dir);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 index->prefix = i_strdup(prefix);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 index->fd = -1;
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
35
3294
4600e247da86 Raised initial pool sizes.
Timo Sirainen <tss@iki.fi>
parents: 3254
diff changeset
36 index->extension_pool = pool_alloconly_create("extension", 512);
4594
e92ae6d532f9 Removed type parameter from ARRAY_CREATE since it's not needed anymore.
Timo Sirainen <tss@iki.fi>
parents: 4495
diff changeset
37 ARRAY_CREATE(&index->extensions, index->extension_pool, 5);
e92ae6d532f9 Removed type parameter from ARRAY_CREATE since it's not needed anymore.
Timo Sirainen <tss@iki.fi>
parents: 4495
diff changeset
38 ARRAY_CREATE(&index->sync_lost_handlers, default_pool, 4);
e92ae6d532f9 Removed type parameter from ARRAY_CREATE since it's not needed anymore.
Timo Sirainen <tss@iki.fi>
parents: 4495
diff changeset
39 array_create(&index->mail_index_module_contexts, default_pool,
e92ae6d532f9 Removed type parameter from ARRAY_CREATE since it's not needed anymore.
Timo Sirainen <tss@iki.fi>
parents: 4495
diff changeset
40 sizeof(void *), I_MIN(5, mail_index_module_id));
4453
85fcdb478608 Beginnings of joining mail-storage API more closely to mail-index, so that
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4451
diff changeset
41
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 index->mode = 0600;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 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
44
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
45 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
46 mail_index_ext_register(index, "keywords", 128, 2, 1);
3086
66c44404f9a1 Keyword fixes.
Timo Sirainen <tss@iki.fi>
parents: 3016
diff changeset
47 index->keywords_pool = pool_alloconly_create("keywords", 512);
4594
e92ae6d532f9 Removed type parameter from ARRAY_CREATE since it's not needed anymore.
Timo Sirainen <tss@iki.fi>
parents: 4495
diff changeset
48 ARRAY_CREATE(&index->keywords, default_pool, 16);
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
49 index->keywords_hash =
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
50 hash_create(default_pool, index->keywords_pool, 0,
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
51 strcase_hash, (hash_cmp_callback_t *)strcasecmp);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 return index;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
55 void mail_index_free(struct mail_index **_index)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 {
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
57 struct mail_index *index = *_index;
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
58
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
59 *_index = NULL;
1967
b6d900688c55 memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 1965
diff changeset
60 mail_index_close(index);
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
61
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
62 hash_destroy(index->keywords_hash);
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
63 pool_unref(index->extension_pool);
3086
66c44404f9a1 Keyword fixes.
Timo Sirainen <tss@iki.fi>
parents: 3016
diff changeset
64 pool_unref(index->keywords_pool);
1967
b6d900688c55 memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 1965
diff changeset
65
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
66 array_free(&index->sync_lost_handlers);
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
67 array_free(&index->keywords);
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
68
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 i_free(index->error);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 i_free(index->dir);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 i_free(index->prefix);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 i_free(index);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74
2650
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
75 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
76 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
77 {
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
78 index->mode = mode & 0666;
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
79 index->gid = gid;
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
80 }
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
81
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
82 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
83 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
84 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
85 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
86 {
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
87 const struct mail_index_registered_ext *extensions;
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
88 struct mail_index_registered_ext rext;
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
89 unsigned int i, ext_count;
2115
f720b3f15333 Modifying extra_records should work now.
Timo Sirainen <tss@iki.fi>
parents: 2114
diff changeset
90
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
91 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
92
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
93 /* 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
94 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
95 if (strcmp(extensions[i].name, name) == 0)
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
96 return i;
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
97 }
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
98
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
99 memset(&rext, 0, sizeof(rext));
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
100 rext.name = p_strdup(index->extension_pool, name);
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
101 rext.index_idx = ext_count;
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
102 rext.hdr_size = default_hdr_size;
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
103 rext.record_size = default_record_size;
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
104 rext.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
105
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
106 array_append(&index->extensions, &rext, 1);
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
107 return ext_count;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
108 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
109
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
110 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
111 uint32_t ext_id,
4490
56d17f2e1d66 Added support for calling expunge handler for an extension even if the
Timo Sirainen <tss@iki.fi>
parents: 4453
diff changeset
112 mail_index_expunge_handler_t *cb,
56d17f2e1d66 Added support for calling expunge handler for an extension even if the
Timo Sirainen <tss@iki.fi>
parents: 4453
diff changeset
113 void *context, bool call_always)
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
114 {
3817
dc560ef2654b Moved expunge handlers to mail_index_registered_ext.
Timo Sirainen <tss@iki.fi>
parents: 3816
diff changeset
115 struct mail_index_registered_ext *rext;
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
116
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4396
diff changeset
117 rext = array_idx_modifiable(&index->extensions, ext_id);
3817
dc560ef2654b Moved expunge handlers to mail_index_registered_ext.
Timo Sirainen <tss@iki.fi>
parents: 3816
diff changeset
118 i_assert(rext->expunge_handler == NULL);
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
119
3817
dc560ef2654b Moved expunge handlers to mail_index_registered_ext.
Timo Sirainen <tss@iki.fi>
parents: 3816
diff changeset
120 rext->expunge_handler = cb;
4490
56d17f2e1d66 Added support for calling expunge handler for an extension even if the
Timo Sirainen <tss@iki.fi>
parents: 4453
diff changeset
121 rext->expunge_context = context;
56d17f2e1d66 Added support for calling expunge handler for an extension even if the
Timo Sirainen <tss@iki.fi>
parents: 4453
diff changeset
122 rext->expunge_handler_call_always = call_always;
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
123 }
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
124
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
125 void mail_index_unregister_expunge_handler(struct mail_index *index,
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
126 uint32_t ext_id)
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
127 {
3817
dc560ef2654b Moved expunge handlers to mail_index_registered_ext.
Timo Sirainen <tss@iki.fi>
parents: 3816
diff changeset
128 struct mail_index_registered_ext *rext;
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
129
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4396
diff changeset
130 rext = array_idx_modifiable(&index->extensions, ext_id);
3817
dc560ef2654b Moved expunge handlers to mail_index_registered_ext.
Timo Sirainen <tss@iki.fi>
parents: 3816
diff changeset
131 i_assert(rext->expunge_handler != NULL);
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
132
3817
dc560ef2654b Moved expunge handlers to mail_index_registered_ext.
Timo Sirainen <tss@iki.fi>
parents: 3816
diff changeset
133 rext->expunge_handler = NULL;
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
134 }
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
135
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
136 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
137 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
138 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
139 {
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
140 struct mail_index_registered_ext *rext;
2869
d2daf90c79f1 Cache invalidating needed to hook into view syncing as well.
Timo Sirainen <tss@iki.fi>
parents: 2857
diff changeset
141
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4396
diff changeset
142 rext = array_idx_modifiable(&index->extensions, ext_id);
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
143 i_assert(rext->sync_handler.callback == NULL);
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
144
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
145 rext->sync_handler.callback = cb;
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
146 rext->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
147 }
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
148
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
149 void mail_index_unregister_sync_handler(struct mail_index *index,
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
150 uint32_t ext_id)
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
151 {
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
152 struct mail_index_registered_ext *rext;
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
153
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4396
diff changeset
154 rext = array_idx_modifiable(&index->extensions, ext_id);
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
155 i_assert(rext->sync_handler.callback != NULL);
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
156
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
157 rext->sync_handler.callback = NULL;
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
158 rext->sync_handler.type = 0;
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
159 }
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
160
2934
c3ae75597952 Added "sync lost" handlers which are called with mmap_disable=yes when index
Timo Sirainen <tss@iki.fi>
parents: 2926
diff changeset
161 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
162 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
163 {
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
164 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
165 }
c3ae75597952 Added "sync lost" handlers which are called with mmap_disable=yes when index
Timo Sirainen <tss@iki.fi>
parents: 2926
diff changeset
166
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
167 void mail_index_unregister_sync_lost_handler(struct mail_index *index,
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
168 mail_index_sync_lost_handler_t *cb)
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
169 {
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
170 mail_index_sync_lost_handler_t *const *handlers;
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
171 unsigned int i, count;
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
172
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
173 handlers = array_get(&index->sync_lost_handlers, &count);
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
174 for (i = 0; i < count; i++) {
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
175 if (handlers[i] == cb) {
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
176 array_delete(&index->sync_lost_handlers, i, 1);
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
177 break;
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
178 }
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
179 }
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
180 }
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
181
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
182 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
183 unsigned int initial_count)
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
184 {
3294
4600e247da86 Raised initial pool sizes.
Timo Sirainen <tss@iki.fi>
parents: 3254
diff changeset
185 #define EXTENSION_NAME_APPROX_LEN 20
4495
bcc5d4dc5400 Small memory usage optimization.
Timo Sirainen <tss@iki.fi>
parents: 4490
diff changeset
186 #define EXT_GLOBAL_ALLOC_SIZE \
bcc5d4dc5400 Small memory usage optimization.
Timo Sirainen <tss@iki.fi>
parents: 4490
diff changeset
187 ((sizeof(map->extensions) + BUFFER_APPROX_SIZE) * 2)
bcc5d4dc5400 Small memory usage optimization.
Timo Sirainen <tss@iki.fi>
parents: 4490
diff changeset
188 #define EXT_PER_ALLOC_SIZE \
bcc5d4dc5400 Small memory usage optimization.
Timo Sirainen <tss@iki.fi>
parents: 4490
diff changeset
189 (EXTENSION_NAME_APPROX_LEN + \
bcc5d4dc5400 Small memory usage optimization.
Timo Sirainen <tss@iki.fi>
parents: 4490
diff changeset
190 sizeof(struct mail_index_ext) + sizeof(uint32_t))
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
191 size_t size;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
192
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
193 if (map->extension_pool == NULL) {
4495
bcc5d4dc5400 Small memory usage optimization.
Timo Sirainen <tss@iki.fi>
parents: 4490
diff changeset
194 size = EXT_GLOBAL_ALLOC_SIZE +
bcc5d4dc5400 Small memory usage optimization.
Timo Sirainen <tss@iki.fi>
parents: 4490
diff changeset
195 initial_count * EXT_PER_ALLOC_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
196 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
197 pool_alloconly_create("extensions",
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
198 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
199 } else {
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
200 p_clear(map->extension_pool);
4495
bcc5d4dc5400 Small memory usage optimization.
Timo Sirainen <tss@iki.fi>
parents: 4490
diff changeset
201
bcc5d4dc5400 Small memory usage optimization.
Timo Sirainen <tss@iki.fi>
parents: 4490
diff changeset
202 /* try to use the existing pool's size for initial_count so
bcc5d4dc5400 Small memory usage optimization.
Timo Sirainen <tss@iki.fi>
parents: 4490
diff changeset
203 we don't grow it unneededly */
bcc5d4dc5400 Small memory usage optimization.
Timo Sirainen <tss@iki.fi>
parents: 4490
diff changeset
204 size = p_get_max_easy_alloc_size(map->extension_pool);
bcc5d4dc5400 Small memory usage optimization.
Timo Sirainen <tss@iki.fi>
parents: 4490
diff changeset
205 if (size > EXT_GLOBAL_ALLOC_SIZE + EXT_PER_ALLOC_SIZE) {
bcc5d4dc5400 Small memory usage optimization.
Timo Sirainen <tss@iki.fi>
parents: 4490
diff changeset
206 initial_count = (size - EXT_GLOBAL_ALLOC_SIZE) /
bcc5d4dc5400 Small memory usage optimization.
Timo Sirainen <tss@iki.fi>
parents: 4490
diff changeset
207 EXT_PER_ALLOC_SIZE;
bcc5d4dc5400 Small memory usage optimization.
Timo Sirainen <tss@iki.fi>
parents: 4490
diff changeset
208 }
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
209 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
210
4594
e92ae6d532f9 Removed type parameter from ARRAY_CREATE since it's not needed anymore.
Timo Sirainen <tss@iki.fi>
parents: 4495
diff changeset
211 ARRAY_CREATE(&map->extensions, map->extension_pool, initial_count);
e92ae6d532f9 Removed type parameter from ARRAY_CREATE since it's not needed anymore.
Timo Sirainen <tss@iki.fi>
parents: 4495
diff changeset
212 ARRAY_CREATE(&map->ext_id_map, map->extension_pool, initial_count);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
213 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
214
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
215 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
216 {
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
217 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
218 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
219
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
220 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
221 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
222
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
223 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
224 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
225 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
226 return i;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
227 }
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
228 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
229 }
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
230
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
231 uint32_t
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
232 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
233 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
234 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
235 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
236 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
237 {
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
238 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
239 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
240
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
241 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
242 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
243 idx = 0;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
244 } else {
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
245 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
246 }
3147
6c7d463eaf1e Don't allow duplicate extension names in index header.
Timo Sirainen <tss@iki.fi>
parents: 3129
diff changeset
247 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
248
3445
74475a126e2f Renamed array_modifyable_*() functions. I could never remember how they were
Timo Sirainen <tss@iki.fi>
parents: 3369
diff changeset
249 ext = array_append_space(&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
250 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
251 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
252 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
253 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
254 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
255 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
256 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
257
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
258 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
259 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
260
3818
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
261 /* Update index ext_id -> map ext_id mapping. Fill non-used
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
262 ext_ids with (uint32_t)-1 */
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
263 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
264 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
265 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
266 return idx;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
267 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
268
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3833
diff changeset
269 static bool size_check(size_t *size_left, size_t size)
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
270 {
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
271 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
272 return FALSE;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
273 *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
274 return TRUE;
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
275 }
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
276
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
277 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
278 {
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
279 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
280 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
281 }
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
282
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
283 static int mail_index_parse_extensions(struct mail_index *index,
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
284 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
285 {
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
286 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
287 unsigned int i, old_count;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
288 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
289 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
290 size_t size_left;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
291
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
292 /* 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
293 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
294 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
295 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
296 /* 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
297 return 1;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
298 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
299
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
300 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
301 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
302
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
303 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
304 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
305 array_append(&map->ext_id_map, &ext_id, 1);
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
306
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
307 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
308 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
309
3818
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
310 /* Extension header contains:
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
311 - struct mail_index_ext_header
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
312 - name (not 0-terminated)
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
313 - 64bit alignment padding
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
314 - extension header contents
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
315 - 64bit alignment padding
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
316 */
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
317 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
318 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
319 !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
320 !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
321 !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
322 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
323 "Header extension goes outside header",
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
324 index->filepath);
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
325 return -1;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
326 }
3147
6c7d463eaf1e Don't allow duplicate extension names in index header.
Timo Sirainen <tss@iki.fi>
parents: 3129
diff changeset
327
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
328 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
329 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
330 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
331
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
332 t_push();
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
333 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
334 ext_hdr->name_size);
3147
6c7d463eaf1e Don't allow duplicate extension names in index header.
Timo Sirainen <tss@iki.fi>
parents: 3129
diff changeset
335
6c7d463eaf1e Don't allow duplicate extension names in index header.
Timo Sirainen <tss@iki.fi>
parents: 3129
diff changeset
336 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
337 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
338 "Duplicate header extension %s",
6c7d463eaf1e Don't allow duplicate extension names in index header.
Timo Sirainen <tss@iki.fi>
parents: 3129
diff changeset
339 index->filepath, name);
6c7d463eaf1e Don't allow duplicate extension names in index header.
Timo Sirainen <tss@iki.fi>
parents: 3129
diff changeset
340 t_pop();
6c7d463eaf1e Don't allow duplicate extension names in index header.
Timo Sirainen <tss@iki.fi>
parents: 3129
diff changeset
341 return -1;
6c7d463eaf1e Don't allow duplicate extension names in index header.
Timo Sirainen <tss@iki.fi>
parents: 3129
diff changeset
342 }
6c7d463eaf1e Don't allow duplicate extension names in index header.
Timo Sirainen <tss@iki.fi>
parents: 3129
diff changeset
343
3497
872218271484 Check that record alignmentation is actually used correctly. If not,
Timo Sirainen <tss@iki.fi>
parents: 3470
diff changeset
344 if ((ext_hdr->record_offset % ext_hdr->record_align) != 0 ||
872218271484 Check that record alignmentation is actually used correctly. If not,
Timo Sirainen <tss@iki.fi>
parents: 3470
diff changeset
345 (map->hdr.record_size % ext_hdr->record_align) != 0) {
872218271484 Check that record alignmentation is actually used correctly. If not,
Timo Sirainen <tss@iki.fi>
parents: 3470
diff changeset
346 mail_index_set_error(index, "Corrupted index file %s: "
872218271484 Check that record alignmentation is actually used correctly. If not,
Timo Sirainen <tss@iki.fi>
parents: 3470
diff changeset
347 "Record field %s alignmentation %u not used",
872218271484 Check that record alignmentation is actually used correctly. If not,
Timo Sirainen <tss@iki.fi>
parents: 3470
diff changeset
348 index->filepath, name, ext_hdr->record_align);
872218271484 Check that record alignmentation is actually used correctly. If not,
Timo Sirainen <tss@iki.fi>
parents: 3470
diff changeset
349 t_pop();
872218271484 Check that record alignmentation is actually used correctly. If not,
Timo Sirainen <tss@iki.fi>
parents: 3470
diff changeset
350 return -1;
872218271484 Check that record alignmentation is actually used correctly. If not,
Timo Sirainen <tss@iki.fi>
parents: 3470
diff changeset
351 }
872218271484 Check that record alignmentation is actually used correctly. If not,
Timo Sirainen <tss@iki.fi>
parents: 3470
diff changeset
352
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
353 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
354 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
355 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
356 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
357 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
358 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
359 t_pop();
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
360
2683
d41c42a7bf1e Index extensions can now specify record alignment, and it's possible to
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
361 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
362 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
363 return 1;
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
364 }
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
365
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3833
diff changeset
366 bool mail_index_keyword_lookup(struct mail_index *index,
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3833
diff changeset
367 const char *keyword, bool autocreate,
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3833
diff changeset
368 unsigned int *idx_r)
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
369 {
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
370 char *keyword_dup;
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
371 void *value;
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
372
3818
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
373 /* keywords_hash keeps a name => index mapping of keywords.
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
374 Keywords are never removed from it, so the index values are valid
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
375 for the lifetime of the mail_index. */
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
376 if (hash_lookup_full(index->keywords_hash, keyword, NULL, &value)) {
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
377 *idx_r = POINTER_CAST_TO(value, unsigned int);
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
378 return TRUE;
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
379 }
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
380
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
381 if (!autocreate) {
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
382 *idx_r = (unsigned int)-1;
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
383 return FALSE;
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
384 }
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
385
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
386 keyword = keyword_dup = p_strdup(index->keywords_pool, keyword);
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
387 *idx_r = array_count(&index->keywords);
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
388
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
389 hash_insert(index->keywords_hash, keyword_dup, POINTER_CAST(*idx_r));
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
390 array_append(&index->keywords, &keyword, 1);
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
391 return TRUE;
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
392 }
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
393
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
394 int mail_index_map_parse_keywords(struct mail_index *index,
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
395 struct mail_index_map *map)
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
396 {
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
397 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
398 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
399 const struct mail_index_keyword_header_rec *kw_rec;
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
400 const char *name;
3818
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
401 unsigned int i, name_area_end_offset, old_count;
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
402 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
403
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
404 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
405 if (ext_id == (uint32_t)-1) {
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
406 if (array_is_created(&map->keyword_idx_map))
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
407 array_clear(&map->keyword_idx_map);
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
408 return 0;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
409 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
410
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
411 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
412
3818
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
413 /* Extension header contains:
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
414 - struct mail_index_keyword_header
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
415 - struct mail_index_keyword_header_rec * keywords_count
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
416 - const char names[] * keywords_count
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
417 */
4220
2af75b0379bb Added assert
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4072
diff changeset
418 i_assert(ext->hdr_offset < map->hdr.header_size);
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
419 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
420 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
421 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
422
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
423 old_count = !array_is_created(&map->keyword_idx_map) ? 0 :
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
424 array_count(&map->keyword_idx_map);
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
425
3818
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
426 /* Keywords can only be added into same mapping. Removing requires a
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
427 new mapping (recreating the index file) */
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
428 if (kw_hdr->keywords_count == old_count) {
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
429 /* nothing changed */
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
430 return 0;
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
431 }
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
432
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
433 /* make sure the header is valid */
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
434 if (kw_hdr->keywords_count < old_count) {
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
435 mail_index_set_error(index, "Corrupted index file %s: "
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
436 "Keywords removed unexpectedly",
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
437 index->filepath);
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
438 return -1;
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
439 }
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
440
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
441 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
442 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
443 "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
444 index->filepath);
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
445 return -1;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
446 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
447
3818
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
448 name_area_end_offset = (const char *)kw_hdr + ext->hdr_size - name;
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
449 for (i = 0; i < kw_hdr->keywords_count; i++) {
3818
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
450 if (kw_rec[i].name_offset > name_area_end_offset) {
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
451 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
452 "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
453 index->filepath);
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
454 return -1;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
455 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
456 }
3818
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
457 if (name[name_area_end_offset-1] != '\0') {
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
458 mail_index_set_error(index, "Corrupted index file %s: "
3550
6fbdd79b32a5 Error message update
Timo Sirainen <tss@iki.fi>
parents: 3497
diff changeset
459 "Keyword header doesn't end with NUL",
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
460 index->filepath);
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
461 return -1;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
462 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
463
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
464 /* create file -> index mapping */
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
465 if (!array_is_created(&map->keyword_idx_map)) {
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
466 ARRAY_CREATE(&map->keyword_idx_map, default_pool,
4594
e92ae6d532f9 Removed type parameter from ARRAY_CREATE since it's not needed anymore.
Timo Sirainen <tss@iki.fi>
parents: 4495
diff changeset
467 kw_hdr->keywords_count);
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
468 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
469
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
470 #ifdef DEBUG
3818
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
471 /* Check that existing headers are still the same. It's behind DEBUG
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
472 since it's pretty useless waste of CPU normally. */
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
473 for (i = 0; i < array_count(&map->keyword_idx_map); i++) {
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
474 const char *keyword = name + kw_rec[i].name_offset;
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
475 const unsigned int *old_idx;
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
476 unsigned int idx;
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
477
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
478 old_idx = array_idx(&map->keyword_idx_map, i);
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
479 if (!mail_index_keyword_lookup(index, keyword, FALSE, &idx) ||
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
480 idx != *old_idx) {
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
481 mail_index_set_error(index, "Corrupted index file %s: "
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
482 "Keywords changed unexpectedly",
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
483 index->filepath);
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
484 return -1;
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
485 }
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
486 }
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
487 #endif
3818
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
488 /* Register the newly seen keywords */
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
489 i = array_count(&map->keyword_idx_map);
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
490 for (; i < kw_hdr->keywords_count; i++) {
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
491 const char *keyword = name + kw_rec[i].name_offset;
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
492 unsigned int idx;
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
493
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
494 (void)mail_index_keyword_lookup(index, keyword, TRUE, &idx);
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
495 array_append(&map->keyword_idx_map, &idx, 1);
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
496 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
497 return 0;
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
498 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
499
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4396
diff changeset
500 const ARRAY_TYPE(keywords) *mail_index_get_keywords(struct mail_index *index)
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
501 {
3818
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
502 /* Make sure all the keywords are in index->keywords. It's quick to do
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
503 if nothing has changed. */
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
504 (void)mail_index_map_parse_keywords(index, index->map);
3818
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
505
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
506 return &index->keywords;
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
507 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
508
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
509 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
510 struct mail_index_map *map)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
511 {
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
512 const struct mail_index_header *hdr = &map->hdr;
3819
61f0e1fe9b55 Moved uoff_t and time_t compatibility checks to cache file, since they're
Timo Sirainen <tss@iki.fi>
parents: 3818
diff changeset
513 enum mail_index_header_compat_flags compat_flags = 0;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
514
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
515 #ifndef WORDS_BIGENDIAN
3819
61f0e1fe9b55 Moved uoff_t and time_t compatibility checks to cache file, since they're
Timo Sirainen <tss@iki.fi>
parents: 3818
diff changeset
516 compat_flags |= MAIL_INDEX_COMPAT_LITTLE_ENDIAN;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
517 #endif
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
518
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
519 if (hdr->major_version != MAIL_INDEX_MAJOR_VERSION) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
520 /* major version change - handle silently(?) */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
521 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
522 }
3819
61f0e1fe9b55 Moved uoff_t and time_t compatibility checks to cache file, since they're
Timo Sirainen <tss@iki.fi>
parents: 3818
diff changeset
523 if (hdr->compat_flags != compat_flags) {
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
524 /* architecture change - handle silently(?) */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
525 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
526 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
527
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
528 if ((map->hdr.flags & MAIL_INDEX_HDR_FLAG_CORRUPTED) != 0) {
2095
Timo Sirainen <tss@iki.fi>
parents: 2073
diff changeset
529 /* we've already complained about it */
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
530 return -1;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
531 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
532
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
533 /* 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
534 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
535 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
536 "uid_validity = 0, next_uid = %u",
596267d8e2e2 Some more UIDVALIDITY issues fixed.
Timo Sirainen <tss@iki.fi>
parents: 2050
diff changeset
537 index->filepath, hdr->next_uid);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
538 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
539 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
540
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
541 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
542 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
543 "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
544 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
545 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
546 return -1;
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
547 }
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
548
3353
286cc0cd888a Check broken flag counter values every time when updating them. Added
Timo Sirainen <tss@iki.fi>
parents: 3296
diff changeset
549 if ((hdr->flags & MAIL_INDEX_HDR_FLAG_FSCK) != 0)
286cc0cd888a Check broken flag counter values every time when updating them. Added
Timo Sirainen <tss@iki.fi>
parents: 3296
diff changeset
550 return 0;
286cc0cd888a Check broken flag counter values every time when updating them. Added
Timo Sirainen <tss@iki.fi>
parents: 3296
diff changeset
551
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
552 if (hdr->next_uid == 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
553 return 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
554
2038
df504dad3aec Recent flag fixes. Should work perfectly now with maildir.
Timo Sirainen <tss@iki.fi>
parents: 2021
diff changeset
555 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
556 hdr->seen_messages_count > hdr->messages_count ||
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
557 hdr->deleted_messages_count > hdr->messages_count)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
558 return 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
559 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
560 hdr->first_unseen_uid_lowwater > hdr->next_uid ||
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
561 hdr->first_deleted_uid_lowwater > hdr->next_uid)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
562 return 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
563
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
564 return mail_index_parse_extensions(index, map);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
565 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
566
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
567 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
568 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
569 {
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
570 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
571 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
572 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
573 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
574 } 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
575 i_assert(map->buffer == NULL);
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
576 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
577 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
578 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
579 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
580
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
581 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
582 memset(&map->hdr, 0, sizeof(map->hdr));
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
583 map->mmap_size = 0;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
584 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
585 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
586 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
587 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
588 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
589
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
590 void mail_index_unmap(struct mail_index *index, struct mail_index_map **_map)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
591 {
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
592 struct mail_index_map *map = *_map;
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
593
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
594 *_map = NULL;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
595 if (--map->refcount > 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
596 return;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
597
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
598 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
599 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
600 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
601 pool_unref(map->extension_pool);
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
602 if (array_is_created(&map->keyword_idx_map))
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
603 array_free(&map->keyword_idx_map);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
604 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
605 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
606 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
607
2922
fadf33c24902 With mmap_disabled=no the index header wasn't always updated causing various
Timo Sirainen <tss@iki.fi>
parents: 2921
diff changeset
608 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
609 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
610 {
fadf33c24902 With mmap_disabled=no the index header wasn't always updated causing various
Timo Sirainen <tss@iki.fi>
parents: 2921
diff changeset
611 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
612 /* 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
613 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
614 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
615 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
616 } else {
fadf33c24902 With mmap_disabled=no the index header wasn't always updated causing various
Timo Sirainen <tss@iki.fi>
parents: 2921
diff changeset
617 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
618 }
fadf33c24902 With mmap_disabled=no the index header wasn't always updated causing various
Timo Sirainen <tss@iki.fi>
parents: 2921
diff changeset
619 }
fadf33c24902 With mmap_disabled=no the index header wasn't always updated causing various
Timo Sirainen <tss@iki.fi>
parents: 2921
diff changeset
620
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
621 static int mail_index_mmap(struct mail_index *index, struct mail_index_map *map)
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
622 {
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
623 const struct mail_index_header *hdr;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
624 unsigned int records_count;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
625
2193
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
626 i_assert(!map->write_to_disk);
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
627
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
628 if (map->buffer != NULL) {
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
629 /* we had temporarily used a buffer, eg. for updating index */
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
630 buffer_free(map->buffer);
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
631 map->buffer = NULL;
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
632 }
2043
4548def7ac02 Don't try to re-map dirty memory mapping.
Timo Sirainen <tss@iki.fi>
parents: 2038
diff changeset
633
2761
f96a7b2d1c52 Removed mmap() memory area protections. They weren't always set correctly.
Timo Sirainen <tss@iki.fi>
parents: 2723
diff changeset
634 map->mmap_base = index->readonly ?
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
635 mmap_ro_file(index->fd, &map->mmap_size) :
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
636 mmap_rw_file(index->fd, &map->mmap_size);
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
637 if (map->mmap_base == MAP_FAILED) {
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
638 map->mmap_base = NULL;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
639 mail_index_set_syscall_error(index, "mmap()");
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
640 return -1;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
641 }
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
642
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
643 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
644 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
645 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
646 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
647 /* 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
648 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
649 }
280c933983a9 Handle major version changes silently even if the file isn't large enough to
Timo Sirainen <tss@iki.fi>
parents: 2821
diff changeset
650
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
651 if (map->mmap_size < MAIL_INDEX_HEADER_MIN_SIZE) {
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
652 mail_index_set_error(index, "Corrupted index file %s: "
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
653 "File too small (%"PRIuSIZE_T")",
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
654 index->filepath, map->mmap_size);
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
655 return 0;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
656 }
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
657
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
658 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
659 hdr->messages_count * hdr->record_size;
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
660
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
661 if (map->mmap_used_size > map->mmap_size) {
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
662 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
663 hdr->record_size;
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
664 mail_index_set_error(index, "Corrupted index file %s: "
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
665 "messages_count too large (%u > %u)",
2122
db5807f350ca crashfix on error
Timo Sirainen <tss@iki.fi>
parents: 2116
diff changeset
666 index->filepath, hdr->messages_count,
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
667 records_count);
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
668 return 0;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
669 }
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
670
2922
fadf33c24902 With mmap_disabled=no the index header wasn't always updated causing various
Timo Sirainen <tss@iki.fi>
parents: 2921
diff changeset
671 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
672
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
673 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
674 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
675 map->records_count = map->hdr.messages_count;
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
676 return 1;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
677 }
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
678
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 static int mail_index_read_header(struct mail_index *index,
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
680 void *buf, size_t buf_size, size_t *pos_r)
2885
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 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
683 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
684
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
685 memset(buf, 0, sizeof(struct mail_index_header));
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
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
687 /* try to read the whole header, but it's not necessarily an error to
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
688 read less since the older versions of the index format could be
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
689 smaller. Request reading up to buf_size, but accept if we only got
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
690 the header. */
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
691 pos = 0;
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
692 do {
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
693 ret = pread(index->fd, PTR_OFFSET(buf, pos),
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
694 buf_size - pos, pos);
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
695 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
696 pos += ret;
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
697 } while (ret > 0 && pos < sizeof(struct mail_index_header));
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
698
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
699 *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
700 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
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
4072
7e6acdd8d18d If we reach the NFS_ESTALE_RETRY_COUNT, give an ESTALE error message as
Timo Sirainen <tss@iki.fi>
parents: 4071
diff changeset
703 static int
7e6acdd8d18d If we reach the NFS_ESTALE_RETRY_COUNT, give an ESTALE error message as
Timo Sirainen <tss@iki.fi>
parents: 4071
diff changeset
704 mail_index_read_map(struct mail_index *index, struct mail_index_map *map,
7e6acdd8d18d If we reach the NFS_ESTALE_RETRY_COUNT, give an ESTALE error message as
Timo Sirainen <tss@iki.fi>
parents: 4071
diff changeset
705 bool *retry_r, bool try_retry)
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
706 {
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
707 const struct mail_index_header *hdr;
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
708 unsigned char buf[512];
1939
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
709 void *data = NULL;
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
710 ssize_t ret;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
711 size_t pos, records_size;
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
712
2043
4548def7ac02 Don't try to re-map dirty memory mapping.
Timo Sirainen <tss@iki.fi>
parents: 2038
diff changeset
713 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
714
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
715 *retry_r = FALSE;
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
716 ret = mail_index_read_header(index, buf, sizeof(buf), &pos);
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
717 hdr = (const struct mail_index_header *)buf;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
718
2825
645b8442b519 one more major version change fix
Timo Sirainen <tss@iki.fi>
parents: 2824
diff changeset
719 if (pos > (ssize_t)offsetof(struct mail_index_header, major_version) &&
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
720 hdr->major_version != MAIL_INDEX_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
721 /* 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
722 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
723 }
280c933983a9 Handle major version changes silently even if the file isn't large enough to
Timo Sirainen <tss@iki.fi>
parents: 2821
diff changeset
724
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
725 if (ret >= 0 && pos >= MAIL_INDEX_HEADER_MIN_SIZE &&
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
726 (ret > 0 || pos >= hdr->base_header_size)) {
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
727 if (hdr->base_header_size < MAIL_INDEX_HEADER_MIN_SIZE ||
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
728 hdr->header_size < hdr->base_header_size) {
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
729 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
730 "Corrupted header sizes (base %u, full %u)",
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
731 index->filepath, hdr->base_header_size,
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
732 hdr->header_size);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
733 return 0;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
734 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
735
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
736 if (pos > hdr->header_size)
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
737 pos = hdr->header_size;
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
738
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
739 /* place the base header into memory. */
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
740 buffer_reset(map->hdr_copy_buf);
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
741 buffer_append(map->hdr_copy_buf, buf, pos);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
742
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
743 if (pos != hdr->header_size) {
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
744 /* @UNSAFE: read the rest of the header into memory */
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
745 data = buffer_append_space_unsafe(map->hdr_copy_buf,
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
746 hdr->header_size -
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
747 pos);
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
748 ret = pread_full(index->fd, data,
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
749 hdr->header_size - pos, pos);
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
750 }
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
751 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
752
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
753 if (ret > 0) {
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
754 /* header read, read the records now. */
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
755 records_size = hdr->messages_count * hdr->record_size;
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
756
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
757 if (map->buffer == NULL) {
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
758 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
759 records_size);
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
760 }
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
761
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
762 /* @UNSAFE */
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
763 buffer_set_used_size(map->buffer, 0);
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
764 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
765
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
766 ret = pread_full(index->fd, data, records_size,
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
767 hdr->header_size);
1939
4698c121bae3 changes
Timo Sirainen <tss@iki.fi>
parents: 1935
diff changeset
768 }
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
769
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
770 if (ret < 0) {
4072
7e6acdd8d18d If we reach the NFS_ESTALE_RETRY_COUNT, give an ESTALE error message as
Timo Sirainen <tss@iki.fi>
parents: 4071
diff changeset
771 if (errno == ESTALE && try_retry) {
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
772 /* a new index file was renamed over this one. */
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
773 *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
774 return 0;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
775 }
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
776 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
777 return -1;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
778 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
779 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
780 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
781 "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
782 index->filepath);
2824
431f677bc0b9 More rebuilding fixes with mmap_disable=yes
Timo Sirainen <tss@iki.fi>
parents: 2823
diff changeset
783 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
784 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
785
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
786 map->records = data;
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
787 map->records_count = hdr->messages_count;
1930
Timo Sirainen <tss@iki.fi>
parents: 1925
diff changeset
788
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
789 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
790 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
791
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
792 index->sync_log_file_seq = hdr->log_file_seq;
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
793 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
794 return 1;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
795 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
796
4237
20e6d554d3fe mmap_disable: When syncing in-memory index from transaction log, we didn't
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4225
diff changeset
797 bool mail_index_is_ext_synced(struct mail_transaction_log_view *log_view,
20e6d554d3fe mmap_disable: When syncing in-memory index from transaction log, we didn't
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4225
diff changeset
798 struct mail_index_map *map)
20e6d554d3fe mmap_disable: When syncing in-memory index from transaction log, we didn't
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4225
diff changeset
799 {
20e6d554d3fe mmap_disable: When syncing in-memory index from transaction log, we didn't
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4225
diff changeset
800 uint32_t prev_seq;
20e6d554d3fe mmap_disable: When syncing in-memory index from transaction log, we didn't
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4225
diff changeset
801 uoff_t prev_offset;
20e6d554d3fe mmap_disable: When syncing in-memory index from transaction log, we didn't
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4225
diff changeset
802
20e6d554d3fe mmap_disable: When syncing in-memory index from transaction log, we didn't
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4225
diff changeset
803 mail_transaction_log_view_get_prev_pos(log_view, &prev_seq,
20e6d554d3fe mmap_disable: When syncing in-memory index from transaction log, we didn't
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4225
diff changeset
804 &prev_offset);
20e6d554d3fe mmap_disable: When syncing in-memory index from transaction log, we didn't
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4225
diff changeset
805 return prev_seq < map->hdr.log_file_seq ||
20e6d554d3fe mmap_disable: When syncing in-memory index from transaction log, we didn't
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4225
diff changeset
806 (prev_seq == map->hdr.log_file_seq &&
20e6d554d3fe mmap_disable: When syncing in-memory index from transaction log, we didn't
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4225
diff changeset
807 prev_offset < map->hdr.log_file_ext_offset);
20e6d554d3fe mmap_disable: When syncing in-memory index from transaction log, we didn't
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4225
diff changeset
808 }
20e6d554d3fe mmap_disable: When syncing in-memory index from transaction log, we didn't
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4225
diff changeset
809
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
810 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
811 struct mail_index_map **map,
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3833
diff changeset
812 bool sync_to_index)
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
813 {
2913
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
814 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
815 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
816 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
817 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
818 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
819 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
820 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
821 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
822 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
823 size_t pos;
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3833
diff changeset
824 int ret;
4278
19a0864deb4e If syncing from transaction log fails, fallback to re-reading the index file
Timo Sirainen <tss@iki.fi>
parents: 4237
diff changeset
825 bool skipped, check_ext_offsets, broken;
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
826
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
827 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
828 /* 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
829 synced */
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
830 ret = mail_index_read_header(index, &hdr, sizeof(hdr), &pos);
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
831 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
832 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
833 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
834 }
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
835 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
836 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
837
2913
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
838 if (map_hdr->log_file_seq == hdr.log_file_seq &&
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
839 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
840 /* 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
841 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
842 }
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
843
2913
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
844 if (map_hdr->log_file_seq > hdr.log_file_seq ||
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
845 (map_hdr->log_file_seq == hdr.log_file_seq &&
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
846 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
847 /* 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
848 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
849 }
2913
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
850 if (map_hdr->log_file_ext_offset !=
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
851 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
852 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
853 /* 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
854 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
855 }
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
856 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
857 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
858 } else {
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
859 /* 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
860 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
861 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
862 }
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
863
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
864 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
865 if (mail_transaction_log_view_set(log_view,
2913
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
866 map_hdr->log_file_seq,
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
867 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
868 max_seq, max_offset,
3832
76f4be7ae499 Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents: 3831
diff changeset
869 MAIL_TRANSACTION_TYPE_MASK) <= 0) {
76f4be7ae499 Handle missing/broken transaction logs better. Handle broken sync position
Timo Sirainen <tss@iki.fi>
parents: 3831
diff changeset
870 /* can't use it. sync by re-reading index. */
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
871 mail_transaction_log_view_close(&log_view);
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
872 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
873 }
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
874
2913
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
875 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
876
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
877 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
878 mail_index_sync_map_init(&sync_map_ctx, view,
4283
22b54c007b91 We were updating index->map also when syncing views.
Timo Sirainen <tss@iki.fi>
parents: 4278
diff changeset
879 MAIL_INDEX_SYNC_HANDLER_HEAD);
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
880
4278
19a0864deb4e If syncing from transaction log fails, fallback to re-reading the index file
Timo Sirainen <tss@iki.fi>
parents: 4237
diff changeset
881 check_ext_offsets = TRUE; broken = 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
882 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
883 &skipped)) > 0) {
4237
20e6d554d3fe mmap_disable: When syncing in-memory index from transaction log, we didn't
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4225
diff changeset
884 if ((thdr->type & MAIL_TRANSACTION_EXTERNAL) != 0 &&
20e6d554d3fe mmap_disable: When syncing in-memory index from transaction log, we didn't
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4225
diff changeset
885 check_ext_offsets) {
20e6d554d3fe mmap_disable: When syncing in-memory index from transaction log, we didn't
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4225
diff changeset
886 if (mail_index_is_ext_synced(log_view, index->map))
20e6d554d3fe mmap_disable: When syncing in-memory index from transaction log, we didn't
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4225
diff changeset
887 continue;
20e6d554d3fe mmap_disable: When syncing in-memory index from transaction log, we didn't
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4225
diff changeset
888 check_ext_offsets = FALSE;
20e6d554d3fe mmap_disable: When syncing in-memory index from transaction log, we didn't
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4225
diff changeset
889 }
20e6d554d3fe mmap_disable: When syncing in-memory index from transaction log, we didn't
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4225
diff changeset
890
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
891 if (mail_index_sync_record(&sync_map_ctx, thdr, tdata) < 0) {
4278
19a0864deb4e If syncing from transaction log fails, fallback to re-reading the index file
Timo Sirainen <tss@iki.fi>
parents: 4237
diff changeset
892 ret = 0;
19a0864deb4e If syncing from transaction log fails, fallback to re-reading the index file
Timo Sirainen <tss@iki.fi>
parents: 4237
diff changeset
893 broken = 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
894 break;
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
895 }
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
896 }
4278
19a0864deb4e If syncing from transaction log fails, fallback to re-reading the index file
Timo Sirainen <tss@iki.fi>
parents: 4237
diff changeset
897 if (ret == 0 && !broken)
19a0864deb4e If syncing from transaction log fails, fallback to re-reading the index file
Timo Sirainen <tss@iki.fi>
parents: 4237
diff changeset
898 ret = 1;
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
899
2939
00b78082cd50 mmap_disable=yes: when we're syncing index by reading transaction log,
Timo Sirainen <tss@iki.fi>
parents: 2938
diff changeset
900 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
901 &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
902 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
903 (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
904
d137899ea853 We could have gone past the transaction log view's boundaries if log was
Timo Sirainen <tss@iki.fi>
parents: 3147
diff changeset
905 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
906 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
907 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
908
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
909 mail_index_sync_map_deinit(&sync_map_ctx);
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
910 mail_index_view_close(&view);
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
911 mail_transaction_log_view_close(&log_view);
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
912
2913
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
913 *map = index->map;
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
914 index->map = NULL;
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
915
4278
19a0864deb4e If syncing from transaction log fails, fallback to re-reading the index file
Timo Sirainen <tss@iki.fi>
parents: 4237
diff changeset
916 if (sync_to_index && ret > 0) {
3369
b4a462cc8737 Fix to mmap_disable=yes syncing
Timo Sirainen <tss@iki.fi>
parents: 3353
diff changeset
917 /* make sure we did everything right. note that although the
b4a462cc8737 Fix to mmap_disable=yes syncing
Timo Sirainen <tss@iki.fi>
parents: 3353
diff changeset
918 message counts should be equal, the flag counters may not */
2956
cd257e96a370 Added assert
Timo Sirainen <tss@iki.fi>
parents: 2940
diff changeset
919 i_assert(hdr.messages_count == (*map)->hdr.messages_count);
3369
b4a462cc8737 Fix to mmap_disable=yes syncing
Timo Sirainen <tss@iki.fi>
parents: 3353
diff changeset
920 i_assert(hdr.log_file_seq == (*map)->hdr.log_file_seq);
b4a462cc8737 Fix to mmap_disable=yes syncing
Timo Sirainen <tss@iki.fi>
parents: 3353
diff changeset
921 i_assert(hdr.log_file_int_offset == (*map)->hdr.log_file_int_offset);
b4a462cc8737 Fix to mmap_disable=yes syncing
Timo Sirainen <tss@iki.fi>
parents: 3353
diff changeset
922 i_assert(hdr.log_file_ext_offset == (*map)->hdr.log_file_ext_offset);
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
923 }
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
924
4278
19a0864deb4e If syncing from transaction log fails, fallback to re-reading the index file
Timo Sirainen <tss@iki.fi>
parents: 4237
diff changeset
925 return ret;
2885
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
926 }
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
927
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
928 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
929 struct mail_index_map **map,
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3833
diff changeset
930 bool 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
931 {
2934
c3ae75597952 Added "sync lost" handlers which are called with mmap_disable=yes when index
Timo Sirainen <tss@iki.fi>
parents: 2926
diff changeset
932 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
933 unsigned int i, count;
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3833
diff changeset
934 int ret;
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3833
diff changeset
935 bool retry;
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
936
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
937 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
938 /* 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
939 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
940 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
941 }
bc8ff03715b2 mmap_disable=yes: if mail_index_map() is called while syncing make sure we
Timo Sirainen <tss@iki.fi>
parents: 2937
diff changeset
942
3177
95d2d8d5958b Some error handling path crashfixes.
Timo Sirainen <tss@iki.fi>
parents: 3173
diff changeset
943 if ((*map)->hdr.indexid != 0 && index->log != NULL) {
95d2d8d5958b Some error handling path crashfixes.
Timo Sirainen <tss@iki.fi>
parents: 3173
diff changeset
944 /* 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
945 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
946 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
947 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
948 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
949 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
950 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
951 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
952
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
953 /* 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
954 }
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
955
2934
c3ae75597952 Added "sync lost" handlers which are called with mmap_disable=yes when index
Timo Sirainen <tss@iki.fi>
parents: 2926
diff changeset
956 /* 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
957 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
958 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
959 (*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
960
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
961 for (i = 0;; i++) {
4072
7e6acdd8d18d If we reach the NFS_ESTALE_RETRY_COUNT, give an ESTALE error message as
Timo Sirainen <tss@iki.fi>
parents: 4071
diff changeset
962 ret = mail_index_read_map(index, *map, &retry,
7e6acdd8d18d If we reach the NFS_ESTALE_RETRY_COUNT, give an ESTALE error message as
Timo Sirainen <tss@iki.fi>
parents: 4071
diff changeset
963 i < MAIL_INDEX_ESTALE_RETRY_COUNT);
7e6acdd8d18d If we reach the NFS_ESTALE_RETRY_COUNT, give an ESTALE error message as
Timo Sirainen <tss@iki.fi>
parents: 4071
diff changeset
964 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
965 return ret;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
966
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
967 /* ESTALE - reopen index file */
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
968 if (close(index->fd) < 0)
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
969 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
970 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
971
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
972 ret = mail_index_try_open_only(index);
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
973 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
974 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
975 /* 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
976 errno = ENOENT;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
977 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
978 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
979 return -1;
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
980 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
981 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
982
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
983 /* 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
984 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
985 return -1;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
986 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
987
2553
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
988 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
989 {
1946
dbec6c9dbffa syncing fix
Timo Sirainen <tss@iki.fi>
parents: 1945
diff changeset
990 const struct mail_index_header *hdr;
2553
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
991 size_t used_size;
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
992
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
993 if (MAIL_INDEX_MAP_IS_IN_MEMORY(map))
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
994 return 0;
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
995
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
996 hdr = map->mmap_base;
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
997
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
998 /* always check corrupted-flag to avoid errors later */
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
999 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
1000 return -1;
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
1001
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
1002 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
1003 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
1004 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
1005 mail_index_map_copy_hdr(map, hdr);
2553
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
1006 return 1;
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
1007 }
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
1008 return 0;
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
1009 }
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
1010
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3833
diff changeset
1011 int mail_index_map(struct mail_index *index, bool force)
2553
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
1012 {
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1013 struct mail_index_map *map;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1014 int ret;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1015
3179
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
1016 i_assert(!index->mapping);
2913
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
1017 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
1018 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
1019
3243
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1020 if (MAIL_INDEX_IS_IN_MEMORY(index)) {
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1021 if (index->map == NULL)
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1022 mail_index_create_in_memory(index, NULL);
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1023 return 1;
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1024 }
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1025
3179
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
1026 index->mapping = TRUE;
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
1027
2553
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
1028 if (!force && index->map != NULL) {
2937
43deb226d769 Added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 2936
diff changeset
1029 i_assert(index->hdr != NULL);
2553
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
1030 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
1031 if (ret != 0) {
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
1032 index->mapping = FALSE;
2553
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
1033 return ret;
3179
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
1034 }
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
1035
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
1036 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
1037 /* 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
1038 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
1039 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
1040 }
2553
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
1041 }
1fed92b6cc01 Avoid re-mmaping if not needed.
Timo Sirainen <tss@iki.fi>
parents: 2542
diff changeset
1042
2542
c3608081d0e4 When updating index mappings, don't let it affect existing views mappings.
Timo Sirainen <tss@iki.fi>
parents: 2409
diff changeset
1043 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
1044 /* 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
1045 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
1046 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
1047 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
1048 } else {
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
1049 /* 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
1050 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
1051 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
1052 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
1053 }
2542
c3608081d0e4 When updating index mappings, don't let it affect existing views mappings.
Timo Sirainen <tss@iki.fi>
parents: 2409
diff changeset
1054 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
1055 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
1056 } else {
1880f191278a Avoid re-reading index file with mmap_disabled=yes. Instead sync it by
Timo Sirainen <tss@iki.fi>
parents: 2884
diff changeset
1057 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
1058 }
c3608081d0e4 When updating index mappings, don't let it affect existing views mappings.
Timo Sirainen <tss@iki.fi>
parents: 2409
diff changeset
1059
2050
ee1095ccfd23 Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents: 2043
diff changeset
1060 if (map == NULL) {
ee1095ccfd23 Index header changes now go through transaction log. Removed the kludgy
Timo Sirainen <tss@iki.fi>
parents: 2043
diff changeset
1061 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
1062 map->refcount = 1;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
1063 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
1064 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
1065 } 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
1066 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
1067 } else if (map->mmap_base != NULL) {
2193
1019b7694a11 assertfix
Timo Sirainen <tss@iki.fi>
parents: 2170
diff changeset
1068 i_assert(map->buffer == NULL);
1946
dbec6c9dbffa syncing fix
Timo Sirainen <tss@iki.fi>
parents: 1945
diff changeset
1069 if (munmap(map->mmap_base, map->mmap_size) < 0)
dbec6c9dbffa syncing fix
Timo Sirainen <tss@iki.fi>
parents: 1945
diff changeset
1070 mail_index_set_syscall_error(index, "munmap()");
dbec6c9dbffa syncing fix
Timo Sirainen <tss@iki.fi>
parents: 1945
diff changeset
1071 map->mmap_base = NULL;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1072 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1073
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1074 index->hdr = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1075 index->map = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1076
2823
43bab10e060d Rebuild broken index files with mmap_disabled=yes too..
Timo Sirainen <tss@iki.fi>
parents: 2822
diff changeset
1077 if (!index->mmap_disable)
43bab10e060d Rebuild broken index files with mmap_disabled=yes too..
Timo Sirainen <tss@iki.fi>
parents: 2822
diff changeset
1078 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
1079 else
2913
cd293e5e6a71 mmap_disable=yes fixes.
Timo Sirainen <tss@iki.fi>
parents: 2911
diff changeset
1080 ret = mail_index_read_map_with_retry(index, &map, force);
2937
43deb226d769 Added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 2936
diff changeset
1081 i_assert(index->map == NULL);
43deb226d769 Added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 2936
diff changeset
1082
3179
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
1083 if (ret > 0) {
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
1084 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
1085 if (ret < 0)
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
1086 ret = 0;
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
1087 else if (ret == 0) {
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
1088 index->fsck = TRUE;
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
1089 ret = 1;
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
1090 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1091 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1092
3179
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
1093 if (ret <= 0) {
3831
1a4d3c25feb8 Minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3824
diff changeset
1094 mail_index_map_clear(index, map);
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
1095 mail_index_unmap(index, &map);
3179
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
1096 index->mapping = FALSE;
c620532e7bc8 Assert if mail_index_map() is called recursively.
Timo Sirainen <tss@iki.fi>
parents: 3177
diff changeset
1097 return ret;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1098 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1099
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
1100 index->hdr = &map->hdr;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1101 index->map = map;
2937
43deb226d769 Added more asserts.
Timo Sirainen <tss@iki.fi>
parents: 2936
diff changeset
1102 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
1103 index->mapping = FALSE;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1104 return 1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1105 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1106
3296
c2b8904dc21b mmap_disable=yes: Transaction log might have been rotated before everything
Timo Sirainen <tss@iki.fi>
parents: 3294
diff changeset
1107 int mail_index_get_latest_header(struct mail_index *index,
c2b8904dc21b mmap_disable=yes: Transaction log might have been rotated before everything
Timo Sirainen <tss@iki.fi>
parents: 3294
diff changeset
1108 struct mail_index_header *hdr_r)
c2b8904dc21b mmap_disable=yes: Transaction log might have been rotated before everything
Timo Sirainen <tss@iki.fi>
parents: 3294
diff changeset
1109 {
c2b8904dc21b mmap_disable=yes: Transaction log might have been rotated before everything
Timo Sirainen <tss@iki.fi>
parents: 3294
diff changeset
1110 size_t pos;
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1111 unsigned int i;
3296
c2b8904dc21b mmap_disable=yes: Transaction log might have been rotated before everything
Timo Sirainen <tss@iki.fi>
parents: 3294
diff changeset
1112 int ret;
c2b8904dc21b mmap_disable=yes: Transaction log might have been rotated before everything
Timo Sirainen <tss@iki.fi>
parents: 3294
diff changeset
1113
c2b8904dc21b mmap_disable=yes: Transaction log might have been rotated before everything
Timo Sirainen <tss@iki.fi>
parents: 3294
diff changeset
1114 if (!index->mmap_disable) {
c2b8904dc21b mmap_disable=yes: Transaction log might have been rotated before everything
Timo Sirainen <tss@iki.fi>
parents: 3294
diff changeset
1115 ret = mail_index_map(index, FALSE);
c2b8904dc21b mmap_disable=yes: Transaction log might have been rotated before everything
Timo Sirainen <tss@iki.fi>
parents: 3294
diff changeset
1116 if (ret > 0)
c2b8904dc21b mmap_disable=yes: Transaction log might have been rotated before everything
Timo Sirainen <tss@iki.fi>
parents: 3294
diff changeset
1117 *hdr_r = *index->hdr;
c2b8904dc21b mmap_disable=yes: Transaction log might have been rotated before everything
Timo Sirainen <tss@iki.fi>
parents: 3294
diff changeset
1118 else
c2b8904dc21b mmap_disable=yes: Transaction log might have been rotated before everything
Timo Sirainen <tss@iki.fi>
parents: 3294
diff changeset
1119 memset(hdr_r, 0, sizeof(*hdr_r));
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1120 return ret;
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1121 }
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1122
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1123 for (i = 0;; i++) {
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1124 ret = mail_index_read_header(index, hdr_r, sizeof(*hdr_r),
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1125 &pos);
4072
7e6acdd8d18d If we reach the NFS_ESTALE_RETRY_COUNT, give an ESTALE error message as
Timo Sirainen <tss@iki.fi>
parents: 4071
diff changeset
1126 if (ret <= 0 || errno != ESTALE ||
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1127 i == MAIL_INDEX_ESTALE_RETRY_COUNT)
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1128 break;
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1129
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1130 /* ESTALE - reopen index file */
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1131 if (close(index->fd) < 0)
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1132 mail_index_set_syscall_error(index, "close()");
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1133 index->fd = -1;
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1134
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1135 ret = mail_index_try_open_only(index);
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1136 if (ret <= 0) {
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1137 if (ret == 0) {
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1138 /* the file was lost */
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1139 errno = ENOENT;
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1140 mail_index_set_syscall_error(index, "open()");
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1141 }
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1142 return -1;
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1143 }
3296
c2b8904dc21b mmap_disable=yes: Transaction log might have been rotated before everything
Timo Sirainen <tss@iki.fi>
parents: 3294
diff changeset
1144 }
4072
7e6acdd8d18d If we reach the NFS_ESTALE_RETRY_COUNT, give an ESTALE error message as
Timo Sirainen <tss@iki.fi>
parents: 4071
diff changeset
1145
7e6acdd8d18d If we reach the NFS_ESTALE_RETRY_COUNT, give an ESTALE error message as
Timo Sirainen <tss@iki.fi>
parents: 4071
diff changeset
1146 if (ret < 0)
7e6acdd8d18d If we reach the NFS_ESTALE_RETRY_COUNT, give an ESTALE error message as
Timo Sirainen <tss@iki.fi>
parents: 4071
diff changeset
1147 mail_index_set_syscall_error(index, "pread_full()");
3296
c2b8904dc21b mmap_disable=yes: Transaction log might have been rotated before everything
Timo Sirainen <tss@iki.fi>
parents: 3294
diff changeset
1148 return ret;
c2b8904dc21b mmap_disable=yes: Transaction log might have been rotated before everything
Timo Sirainen <tss@iki.fi>
parents: 3294
diff changeset
1149 }
c2b8904dc21b mmap_disable=yes: Transaction log might have been rotated before everything
Timo Sirainen <tss@iki.fi>
parents: 3294
diff changeset
1150
2114
4aedcb4c51cb Added support for per-index sized mail_index_record.
Timo Sirainen <tss@iki.fi>
parents: 2095
diff changeset
1151 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
1152 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
1153 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1154 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
1155 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
1156 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
1157 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
1158 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
1159 unsigned int i, count;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1160
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
1161 size = map->records_count * new_record_size;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1162
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1163 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
1164 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
1165 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
1166 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
1167 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
1168 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
1169 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
1170 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
1171 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
1172 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
1173 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
1174 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
1175 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
1176 }
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
1177 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1178
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4396
diff changeset
1179 mem_map->records = buffer_get_modifiable_data(mem_map->buffer, NULL);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1180 mem_map->records_count = map->records_count;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1181
2708
f1e9f3ec8135 Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents: 2683
diff changeset
1182 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
1183 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
1184 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
1185 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
1186 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
1187 &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
1188 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
1189 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
1190 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
1191 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
1192
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4396
diff changeset
1193 hdr = buffer_get_modifiable_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
1194 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
1195 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
1196 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
1197 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
1198 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
1199
4312
2cb75f2e25c6 Keep track of write_atomic and write_seq_first/last while copying memory
Timo Sirainen <tss@iki.fi>
parents: 4283
diff changeset
1200 /* if we're syncing transaction log into memory and later use the
2cb75f2e25c6 Keep track of write_atomic and write_seq_first/last while copying memory
Timo Sirainen <tss@iki.fi>
parents: 4283
diff changeset
1201 mapping for updating the index, we need to remember what has
2cb75f2e25c6 Keep track of write_atomic and write_seq_first/last while copying memory
Timo Sirainen <tss@iki.fi>
parents: 4283
diff changeset
1202 changed */
2cb75f2e25c6 Keep track of write_atomic and write_seq_first/last while copying memory
Timo Sirainen <tss@iki.fi>
parents: 4283
diff changeset
1203 mem_map->write_atomic = map->write_atomic;
2cb75f2e25c6 Keep track of write_atomic and write_seq_first/last while copying memory
Timo Sirainen <tss@iki.fi>
parents: 4283
diff changeset
1204 if (map->write_to_disk) {
2cb75f2e25c6 Keep track of write_atomic and write_seq_first/last while copying memory
Timo Sirainen <tss@iki.fi>
parents: 4283
diff changeset
1205 mem_map->write_seq_first = map->write_seq_first;
2cb75f2e25c6 Keep track of write_atomic and write_seq_first/last while copying memory
Timo Sirainen <tss@iki.fi>
parents: 4283
diff changeset
1206 mem_map->write_seq_last = map->write_seq_last;
2cb75f2e25c6 Keep track of write_atomic and write_seq_first/last while copying memory
Timo Sirainen <tss@iki.fi>
parents: 4283
diff changeset
1207 }
2cb75f2e25c6 Keep track of write_atomic and write_seq_first/last while copying memory
Timo Sirainen <tss@iki.fi>
parents: 4283
diff changeset
1208
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
1209 /* copy extensions */
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
1210 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
1211 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
1212 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
1213
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
1214 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
1215 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
1216
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
1217 /* fix the name pointers to use our own pool */
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4396
diff changeset
1218 extensions = array_get_modifiable(&mem_map->extensions, &count);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
1219 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
1220 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
1221 extensions[i].name);
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
1222 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
1223 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
1224
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1225 return mem_map;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1226 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1227
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
1228 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
1229 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
1230 {
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
1231 const uint32_t *id;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
1232
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
1233 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
1234 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
1235 return 0;
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
1236
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
1237 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
1238 *idx_r = *id;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
1239 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
1240 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
1241
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1242 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
1243 {
3243
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1244 i_assert(!MAIL_INDEX_IS_IN_MEMORY(index));
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1245
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1246 /* Note that our caller must close index->fd by itself.
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1247 mail_index_reopen() for example wants to revert back to old
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1248 index file if opening the new one fails. */
4071
cd3d26cf124a Renamed safe-open.* to nfs-workarounds.*, safe_open() to nfs_safe_open() and
Timo Sirainen <tss@iki.fi>
parents: 4067
diff changeset
1249 index->fd = nfs_safe_open(index->filepath, O_RDWR);
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1250 index->readonly = FALSE;
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1251
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1252 if (index->fd == -1 && errno == EACCES) {
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1253 index->fd = open(index->filepath, O_RDONLY);
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1254 index->readonly = TRUE;
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1255 }
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1256
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1257 if (index->fd == -1) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1258 if (errno != ENOENT)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1259 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
1260
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1261 /* have to create it */
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1262 return 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1263 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1264 return 1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1265 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1266
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1267 static int
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1268 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
1269 {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1270 unsigned int lock_id;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1271 int ret;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1272
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1273 i_assert(index->fd == -1);
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1274
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1275 if (lock_id_r != NULL)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1276 *lock_id_r = 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1277
3243
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1278 if (MAIL_INDEX_IS_IN_MEMORY(index))
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1279 return 0;
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1280
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1281 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
1282 if (ret <= 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1283 return ret;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1284
2409
9183098d7fdf Fixed fd leaks
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
1285 if (mail_index_lock_shared(index, FALSE, &lock_id) < 0) {
9183098d7fdf Fixed fd leaks
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
1286 (void)close(index->fd);
9183098d7fdf Fixed fd leaks
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
1287 index->fd = -1;
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1288 return -1;
2409
9183098d7fdf Fixed fd leaks
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
1289 }
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1290 ret = mail_index_map(index, FALSE);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1291 if (ret == 0) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1292 /* it's corrupted - recreate it */
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1293 mail_index_unlock(index, lock_id);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1294 if (lock_id_r != NULL)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1295 *lock_id_r = 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1296
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1297 (void)close(index->fd);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1298 index->fd = -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1299 } else {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1300 if (lock_id_r != NULL)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1301 *lock_id_r = lock_id;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1302 else
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1303 mail_index_unlock(index, lock_id);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1304 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1305 return ret;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1306 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1307
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
1308 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
1309 const struct mail_index_header *hdr)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1310 {
2240
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
1311 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
1312
51719889ffcf Record size is allowed to change between index files. This will allow adding
Timo Sirainen <tss@iki.fi>
parents: 2209
diff changeset
1313 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
1314
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
1315 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
1316 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
1317 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
1318 return mail_index_set_syscall_error(index, "msync()");
3222
e38e04c7c67c mail_index_write_base_header() didn't update the header in memory with
Timo Sirainen <tss@iki.fi>
parents: 3191
diff changeset
1319 index->map->hdr = *hdr;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1320 } else {
3243
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1321 if (!MAIL_INDEX_IS_IN_MEMORY(index)) {
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1322 if (pwrite_full(index->fd, hdr, hdr_size, 0) < 0) {
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1323 mail_index_set_syscall_error(index,
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1324 "pwrite_full()");
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1325 return -1;
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1326 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1327 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1328
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
1329 index->map->hdr = *hdr;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
1330 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
1331 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1332
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1333 return 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1334 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1335
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1336 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
1337 {
2879
aa93c7216722 dovecot-shared file was supposed to show permissions/gid for files created
Timo Sirainen <tss@iki.fi>
parents: 2877
diff changeset
1338 mode_t old_mask;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1339 const char *path;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1340 int fd;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1341
3243
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1342 i_assert(!MAIL_INDEX_IS_IN_MEMORY(index));
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1343
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1344 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
1345 old_mask = umask(0);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1346 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
1347 umask(old_mask);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1348 if (fd == -1)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1349 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
1350
2879
aa93c7216722 dovecot-shared file was supposed to show permissions/gid for files created
Timo Sirainen <tss@iki.fi>
parents: 2877
diff changeset
1351 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
1352 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
1353 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1354 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1355
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1356 return fd;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1357 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1358
1942
2b114aa7eeec handle losing index file
Timo Sirainen <tss@iki.fi>
parents: 1939
diff changeset
1359 static int mail_index_create(struct mail_index *index,
2b114aa7eeec handle losing index file
Timo Sirainen <tss@iki.fi>
parents: 1939
diff changeset
1360 struct mail_index_header *hdr)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1361 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1362 const char *path;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1363 uint32_t seq;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1364 uoff_t offset;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1365 int ret;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1366
3243
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1367 i_assert(!MAIL_INDEX_IS_IN_MEMORY(index));
2895
51be21fc2c9d Avoid re-reading index file with mmap_disable=yes.
Timo Sirainen <tss@iki.fi>
parents: 2885
diff changeset
1368 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
1369
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1370 /* log file lock protects index creation */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1371 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
1372 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1373
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
1374 ret = mail_index_try_open(index, NULL);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1375 if (ret != 0) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1376 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
1377 return ret < 0 ? -1 : 0;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1378 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1379
3582
bfa542369fdc When creating a new index file, mark its log offsets so that the possibly
Timo Sirainen <tss@iki.fi>
parents: 3556
diff changeset
1380 /* mark the existing log file as synced */
bfa542369fdc When creating a new index file, mark its log offsets so that the possibly
Timo Sirainen <tss@iki.fi>
parents: 3556
diff changeset
1381 hdr->log_file_seq = seq;
bfa542369fdc When creating a new index file, mark its log offsets so that the possibly
Timo Sirainen <tss@iki.fi>
parents: 3556
diff changeset
1382 hdr->log_file_int_offset = offset;
bfa542369fdc When creating a new index file, mark its log offsets so that the possibly
Timo Sirainen <tss@iki.fi>
parents: 3556
diff changeset
1383 hdr->log_file_ext_offset = offset;
bfa542369fdc When creating a new index file, mark its log offsets so that the possibly
Timo Sirainen <tss@iki.fi>
parents: 3556
diff changeset
1384
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1385 /* create it fully in index.tmp first */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1386 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
1387 if (index->fd == -1)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1388 ret = -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1389 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
1390 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
1391 ret = -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1392 } else {
2895
51be21fc2c9d Avoid re-reading index file with mmap_disable=yes.
Timo Sirainen <tss@iki.fi>
parents: 2885
diff changeset
1393 index->lock_type = F_WRLCK;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1394 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
1395 index->lock_type = F_UNLCK;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1396 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1397
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1398 if (ret == 0) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1399 /* 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
1400 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
1401 mail_index_set_error(index,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1402 "Newly created index file is corrupted: %s", path);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1403 ret = -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1404 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1405
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1406 if (ret < 0) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1407 if (unlink(path) < 0 && errno != ENOENT) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1408 mail_index_file_set_syscall_error(index, path,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1409 "unlink()");
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1410 }
2170
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
1411 } else {
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
1412 /* make it visible to others */
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
1413 if (rename(path, index->filepath) < 0) {
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
1414 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
1415 path, index->filepath);
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
1416 ret = -1;
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
1417 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1418 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1419
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1420 mail_transaction_log_sync_unlock(index->log);
2170
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
1421 return ret;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1422 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1423
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
1424 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
1425 {
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
1426 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
1427
3105
f58ff8ec50c4 Added asserts
Timo Sirainen <tss@iki.fi>
parents: 3086
diff changeset
1428 i_assert((sizeof(*hdr) % sizeof(uint64_t)) == 0);
f58ff8ec50c4 Added asserts
Timo Sirainen <tss@iki.fi>
parents: 3086
diff changeset
1429
2073
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
1430 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
1431
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
1432 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
1433 hdr->minor_version = MAIL_INDEX_MINOR_VERSION;
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
1434 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
1435 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
1436 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
1437
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
1438 #ifndef WORDS_BIGENDIAN
3819
61f0e1fe9b55 Moved uoff_t and time_t compatibility checks to cache file, since they're
Timo Sirainen <tss@iki.fi>
parents: 3818
diff changeset
1439 hdr->compat_flags |= MAIL_INDEX_COMPAT_LITTLE_ENDIAN;
2073
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
1440 #endif
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
1441
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
1442 hdr->indexid = now;
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
1443
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
1444 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
1445 }
a58c51c8f37b Don't complain about transaction log indexid changes when rebuilding index.
Timo Sirainen <tss@iki.fi>
parents: 2063
diff changeset
1446
3243
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1447 static void mail_index_create_in_memory(struct mail_index *index,
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1448 const struct mail_index_header *hdr)
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1449 {
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1450 struct mail_index_header tmp_hdr;
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1451 struct mail_index_map tmp_map;
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1452
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1453 if (hdr == NULL) {
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1454 mail_index_header_init(&tmp_hdr);
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1455 hdr = &tmp_hdr;
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1456 }
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1457
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1458 memset(&tmp_map, 0, sizeof(tmp_map));
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1459 tmp_map.hdr = *hdr;
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1460 tmp_map.hdr_base = hdr;
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1461
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1462 /* a bit kludgy way to do this, but it initializes everything
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1463 nicely and correctly */
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1464 index->map = mail_index_map_clone(&tmp_map, hdr->record_size);
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1465 index->hdr = &index->map->hdr;
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1466 }
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1467
2200
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1468 /* returns -1 = error, 0 = won't create, 1 = ok */
1942
2b114aa7eeec handle losing index file
Timo Sirainen <tss@iki.fi>
parents: 1939
diff changeset
1469 static int mail_index_open_files(struct mail_index *index,
2b114aa7eeec handle losing index file
Timo Sirainen <tss@iki.fi>
parents: 1939
diff changeset
1470 enum mail_index_open_flags flags)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1471 {
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
1472 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
1473 unsigned int lock_id = 0;
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3833
diff changeset
1474 int ret;
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3833
diff changeset
1475 bool created = FALSE;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1476
1935
ec4d5ff99f6e Don't modify index file when creating new transaction log.
Timo Sirainen <tss@iki.fi>
parents: 1930
diff changeset
1477 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
1478 if (ret > 0)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1479 hdr = *index->hdr;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1480 else if (ret == 0) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1481 /* doesn't exist, or corrupted */
3912
fc0b638330a4 Added mbox_min_index_size setting.
Timo Sirainen <tss@iki.fi>
parents: 3911
diff changeset
1482 if ((flags & MAIL_INDEX_OPEN_FLAG_CREATE) == 0 &&
fc0b638330a4 Added mbox_min_index_size setting.
Timo Sirainen <tss@iki.fi>
parents: 3911
diff changeset
1483 !MAIL_INDEX_IS_IN_MEMORY(index))
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1484 return 0;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
1485 mail_index_header_init(&hdr);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1486 index->hdr = &hdr;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1487 } else if (ret < 0)
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 index->indexid = hdr.indexid;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1491
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1492 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
1493 if (index->log == NULL)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1494 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
1495
2200
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1496 if (index->fd == -1) {
3556
6170e2e5992a Index creation was racy.
Timo Sirainen <tss@iki.fi>
parents: 3555
diff changeset
1497 if (index->indexid != hdr.indexid) {
6170e2e5992a Index creation was racy.
Timo Sirainen <tss@iki.fi>
parents: 3555
diff changeset
1498 /* looks like someone else created the transaction log
6170e2e5992a Index creation was racy.
Timo Sirainen <tss@iki.fi>
parents: 3555
diff changeset
1499 before we had the chance. use its indexid so we
6170e2e5992a Index creation was racy.
Timo Sirainen <tss@iki.fi>
parents: 3555
diff changeset
1500 don't try to create conflicting ones. */
6170e2e5992a Index creation was racy.
Timo Sirainen <tss@iki.fi>
parents: 3555
diff changeset
1501 hdr.indexid = index->indexid;
6170e2e5992a Index creation was racy.
Timo Sirainen <tss@iki.fi>
parents: 3555
diff changeset
1502 }
6170e2e5992a Index creation was racy.
Timo Sirainen <tss@iki.fi>
parents: 3555
diff changeset
1503
2200
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1504 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
1505 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
1506 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
1507 }
3243
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1508 if (!MAIL_INDEX_IS_IN_MEMORY(index)) {
3833
318c70c1d4ec Beginnings of fallbacking to in-memory indexes when write fails with "out of
Timo Sirainen <tss@iki.fi>
parents: 3832
diff changeset
1509 if (mail_index_create(index, &hdr) < 0) {
318c70c1d4ec Beginnings of fallbacking to in-memory indexes when write fails with "out of
Timo Sirainen <tss@iki.fi>
parents: 3832
diff changeset
1510 /* fallback to in-memory index */
318c70c1d4ec Beginnings of fallbacking to in-memory indexes when write fails with "out of
Timo Sirainen <tss@iki.fi>
parents: 3832
diff changeset
1511 mail_index_move_to_memory(index);
318c70c1d4ec Beginnings of fallbacking to in-memory indexes when write fails with "out of
Timo Sirainen <tss@iki.fi>
parents: 3832
diff changeset
1512 mail_index_create_in_memory(index, &hdr);
318c70c1d4ec Beginnings of fallbacking to in-memory indexes when write fails with "out of
Timo Sirainen <tss@iki.fi>
parents: 3832
diff changeset
1513 }
3243
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1514 } else {
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1515 mail_index_create_in_memory(index, &hdr);
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1516 }
3129
1ea614abead3 Don't complain about cache indexid changing when recreating index.
Timo Sirainen <tss@iki.fi>
parents: 3105
diff changeset
1517 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
1518 }
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1519
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1520 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
1521 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
1522 return -1;
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1523
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1524 }
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1525
3129
1ea614abead3 Don't complain about cache indexid changing when recreating index.
Timo Sirainen <tss@iki.fi>
parents: 3105
diff changeset
1526 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
1527 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
1528
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1529 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
1530 return 1;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1531 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1532
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
1533 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
1534 enum mail_index_lock_method lock_method)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1535 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1536 int i = 0, ret;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1537
2926
c035583b4839 Make sure index is reopened if it's marked corrupted.
Timo Sirainen <tss@iki.fi>
parents: 2922
diff changeset
1538 if (index->opened) {
c035583b4839 Make sure index is reopened if it's marked corrupted.
Timo Sirainen <tss@iki.fi>
parents: 2922
diff changeset
1539 if (index->hdr != NULL &&
c035583b4839 Make sure index is reopened if it's marked corrupted.
Timo Sirainen <tss@iki.fi>
parents: 2922
diff changeset
1540 (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
1541 /* corrupted, reopen files */
c035583b4839 Make sure index is reopened if it's marked corrupted.
Timo Sirainen <tss@iki.fi>
parents: 2922
diff changeset
1542 mail_index_close(index);
c035583b4839 Make sure index is reopened if it's marked corrupted.
Timo Sirainen <tss@iki.fi>
parents: 2922
diff changeset
1543 } else {
4067
96ae9c096bde mail_index_open(): If index is already open, return 1 instead of 0 so the
Timo Sirainen <tss@iki.fi>
parents: 4053
diff changeset
1544 return 1;
2926
c035583b4839 Make sure index is reopened if it's marked corrupted.
Timo Sirainen <tss@iki.fi>
parents: 2922
diff changeset
1545 }
c035583b4839 Make sure index is reopened if it's marked corrupted.
Timo Sirainen <tss@iki.fi>
parents: 2922
diff changeset
1546 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1547
3243
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1548 index->filepath = MAIL_INDEX_IS_IN_MEMORY(index) ?
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1549 i_strdup("(in-memory index)") :
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1550 i_strconcat(index->dir, "/", index->prefix, NULL);
1967
b6d900688c55 memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 1965
diff changeset
1551
3824
3e756ea0474b Comment updates, small cleanups and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 3819
diff changeset
1552 for (;;) {
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1553 index->shared_lock_count = 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1554 index->excl_lock_count = 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1555 index->lock_type = F_UNLCK;
2021
19e638ade25c Locking fixes
Timo Sirainen <tss@iki.fi>
parents: 1984
diff changeset
1556 index->lock_id = 2;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1557
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
1558 index->readonly = FALSE;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1559 index->nodiskspace = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1560 index->index_lock_timeout = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1561 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
1562 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
1563 (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
1564 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
1565 (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
1566 index->lock_method = lock_method;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1567
2895
51be21fc2c9d Avoid re-reading index file with mmap_disable=yes.
Timo Sirainen <tss@iki.fi>
parents: 2885
diff changeset
1568 /* 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
1569 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
1570 if (lock_method == MAIL_INDEX_LOCK_DOTLOCK &&
0e1481357fbb Changed assert() to friendly human readable message.
Timo Sirainen <tss@iki.fi>
parents: 2939
diff changeset
1571 !index->mmap_disable) {
0e1481357fbb Changed assert() to friendly human readable message.
Timo Sirainen <tss@iki.fi>
parents: 2939
diff changeset
1572 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
1573 "combination isn't supported. "
0e1481357fbb Changed assert() to friendly human readable message.
Timo Sirainen <tss@iki.fi>
parents: 2939
diff changeset
1574 "You don't _really_ want it anyway.");
0e1481357fbb Changed assert() to friendly human readable message.
Timo Sirainen <tss@iki.fi>
parents: 2939
diff changeset
1575 }
2895
51be21fc2c9d Avoid re-reading index file with mmap_disable=yes.
Timo Sirainen <tss@iki.fi>
parents: 2885
diff changeset
1576
1942
2b114aa7eeec handle losing index file
Timo Sirainen <tss@iki.fi>
parents: 1939
diff changeset
1577 ret = mail_index_open_files(index, flags);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1578 if (ret <= 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1579 break;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1580
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1581 index->opened = TRUE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1582 if (index->fsck) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1583 index->fsck = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1584 ret = mail_index_fsck(index);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1585 if (ret == 0) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1586 /* completely broken, reopen */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1587 if (i++ < 3)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1588 continue;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1589 /* too many tries */
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1590 ret = -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1591 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1592 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1593 break;
3824
3e756ea0474b Comment updates, small cleanups and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 3819
diff changeset
1594 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1595
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1596 if (ret <= 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1597 mail_index_close(index);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1598
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1599 return ret;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1600 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1601
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1602 void mail_index_close(struct mail_index *index)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1603 {
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
1604 if (index->log != NULL)
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
1605 mail_transaction_log_close(&index->log);
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
1606 if (index->map != NULL)
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
1607 mail_index_unmap(index, &index->map);
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
1608 if (index->cache != NULL)
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
1609 mail_cache_free(&index->cache);
2200
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
1610
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1611 if (index->fd != -1) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1612 if (close(index->fd) < 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1613 mail_index_set_syscall_error(index, "close()");
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1614 index->fd = -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1615 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1616
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
1617 i_free_and_null(index->copy_lock_path);
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
1618 i_free_and_null(index->filepath);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1619
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1620 index->indexid = 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1621 index->opened = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1622 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1623
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1624 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
1625 {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1626 struct mail_index_map *old_map;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1627 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
1628 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
1629
3243
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1630 i_assert(!MAIL_INDEX_IS_IN_MEMORY(index));
4026
20c335412d7d Added some locking related asserts, comments and when replacing index file, open it
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4023
diff changeset
1631 i_assert(index->copy_lock_path == NULL || index->excl_lock_count == 0);
3243
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1632
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1633 old_map = index->map;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1634 old_fd = index->fd;
2895
51be21fc2c9d Avoid re-reading index file with mmap_disable=yes.
Timo Sirainen <tss@iki.fi>
parents: 2885
diff changeset
1635 old_map->refcount++;
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1636
3551
65dc45982df9 Removed fcntl() text from some locking error messages, because if
Timo Sirainen <tss@iki.fi>
parents: 3550
diff changeset
1637 /* new file, new locks. the old fd can keep its locks, they don't
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1638 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
1639 old_lock_type = index->lock_type;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1640 old_lock_id = index->lock_id;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1641 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
1642
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1643 if (index->lock_type == F_RDLCK)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1644 index->lock_type = F_UNLCK;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1645 index->lock_id += 2;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1646 index->shared_lock_count = 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1647
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1648 if (fd != -1) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1649 index->fd = fd;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1650 ret = 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1651 } else {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1652 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
1653 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
1654 if (ret > 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1655 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
1656 else if (ret == 0) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1657 /* index file is lost */
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1658 ret = -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1659 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1660 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1661
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1662 if (ret == 0) {
2895
51be21fc2c9d Avoid re-reading index file with mmap_disable=yes.
Timo Sirainen <tss@iki.fi>
parents: 2885
diff changeset
1663 /* 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
1664 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
1665 by reading transaction log. */
51be21fc2c9d Avoid re-reading index file with mmap_disable=yes.
Timo Sirainen <tss@iki.fi>
parents: 2885
diff changeset
1666 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
1667 ret = -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1668 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1669
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1670 if (lock_id != 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1671 mail_index_unlock(index, lock_id);
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1672
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1673 if (ret == 0) {
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
1674 mail_index_unmap(index, &old_map);
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1675 if (close(old_fd) < 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1676 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
1677 } else {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1678 if (index->map != NULL)
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
1679 mail_index_unmap(index, &index->map);
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1680 if (index->fd != -1) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1681 if (close(index->fd) < 0)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1682 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
1683 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1684
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1685 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
1686 index->hdr = &index->map->hdr;
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1687 index->fd = old_fd;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1688 index->lock_type = old_lock_type;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1689 index->lock_id = old_lock_id;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1690 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
1691 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1692 return ret;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1693 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1694
2936
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1695 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
1696 {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1697 struct stat st1, st2;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1698
4026
20c335412d7d Added some locking related asserts, comments and when replacing index file, open it
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4023
diff changeset
1699 i_assert(index->copy_lock_path == NULL);
20c335412d7d Added some locking related asserts, comments and when replacing index file, open it
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4023
diff changeset
1700
3243
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1701 if (MAIL_INDEX_IS_IN_MEMORY(index))
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1702 return 0;
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1703
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1704 if (fstat(index->fd, &st1) < 0) {
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1705 if (errno == ESTALE) {
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1706 /* deleted, reopen */
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1707 if (mail_index_reopen(index, -1) < 0)
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1708 return -1;
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1709 return 1;
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1710 }
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1711 return mail_index_set_syscall_error(index, "fstat()");
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
1712 }
4225
abdef9d86a94 Added nfs_safe_stat() to transparently work around ESTALE with stat().
Timo Sirainen <timo.sirainen@movial.fi>
parents: 4220
diff changeset
1713 if (nfs_safe_stat(index->filepath, &st2) < 0) {
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1714 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
1715 if (errno != ENOENT)
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1716 return -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1717
4396
208194b3742a Handle transaction log deletions silently. Handle whole index directory
Timo Sirainen <tss@iki.fi>
parents: 4394
diff changeset
1718 /* lost it? recreate later */
208194b3742a Handle transaction log deletions silently. Handle whole index directory
Timo Sirainen <tss@iki.fi>
parents: 4394
diff changeset
1719 mail_index_mark_corrupted(index);
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1720 return -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1721 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1722
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1723 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
1724 !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
1725 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
1726 return -1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1727 return 1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1728 } else {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1729 return 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1730 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1731 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
1732
2936
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1733 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
1734 {
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1735 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
1736 int ret;
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1737
3243
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1738 if (MAIL_INDEX_IS_IN_MEMORY(index))
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1739 return 0;
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1740
2936
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1741 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
1742 /* 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
1743 have changed. */
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1744 return 0;
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1745 }
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1746
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1747 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
1748 /* 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
1749 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
1750 }
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1751
3555
afe8ab9072f0 When refreshing transaction log while trying to find new log file, don't
Timo Sirainen <tss@iki.fi>
parents: 3551
diff changeset
1752 i_assert(!index->mapping);
afe8ab9072f0 When refreshing transaction log while trying to find new log file, don't
Timo Sirainen <tss@iki.fi>
parents: 3551
diff changeset
1753
2936
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1754 /* 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
1755 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
1756 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
1757 return -1;
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1758
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1759 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
1760 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
1761 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
1762 }
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
1763
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1764 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
1765 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1766 return index->cache;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1767 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1768
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1769 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
1770 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1771 va_list va;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1772
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1773 i_free(index->error);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1774
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1775 if (fmt == NULL)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1776 index->error = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1777 else {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1778 va_start(va, fmt);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1779 index->error = i_strdup_vprintf(fmt, va);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1780 va_end(va);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1781
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1782 i_error("%s", index->error);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1783 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1784
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1785 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1786 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1787
1917
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
1788 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
1789 {
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
1790 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
1791 }
68938dccbc45 Forced locking to be right with mprotect()ing index file. Support for
Timo Sirainen <tss@iki.fi>
parents: 1915
diff changeset
1792
3833
318c70c1d4ec Beginnings of fallbacking to in-memory indexes when write fails with "out of
Timo Sirainen <tss@iki.fi>
parents: 3832
diff changeset
1793 int mail_index_move_to_memory(struct mail_index *index)
318c70c1d4ec Beginnings of fallbacking to in-memory indexes when write fails with "out of
Timo Sirainen <tss@iki.fi>
parents: 3832
diff changeset
1794 {
3911
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1795 struct mail_index_map *map;
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1796 int ret = 0;
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1797
4394
0462137fa4ce mail_index_move_to_memory(): Don't break if the index is already in memory.
Timo Sirainen <tss@iki.fi>
parents: 4312
diff changeset
1798 if (MAIL_INDEX_IS_IN_MEMORY(index))
0462137fa4ce mail_index_move_to_memory(): Don't break if the index is already in memory.
Timo Sirainen <tss@iki.fi>
parents: 4312
diff changeset
1799 return 0;
0462137fa4ce mail_index_move_to_memory(): Don't break if the index is already in memory.
Timo Sirainen <tss@iki.fi>
parents: 4312
diff changeset
1800
3911
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1801 /* set the index as being into memory */
3833
318c70c1d4ec Beginnings of fallbacking to in-memory indexes when write fails with "out of
Timo Sirainen <tss@iki.fi>
parents: 3832
diff changeset
1802 i_free_and_null(index->dir);
3911
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1803
3912
fc0b638330a4 Added mbox_min_index_size setting.
Timo Sirainen <tss@iki.fi>
parents: 3911
diff changeset
1804 if (index->map == NULL) {
fc0b638330a4 Added mbox_min_index_size setting.
Timo Sirainen <tss@iki.fi>
parents: 3911
diff changeset
1805 /* mbox file was never even opened. just mark it as being in
fc0b638330a4 Added mbox_min_index_size setting.
Timo Sirainen <tss@iki.fi>
parents: 3911
diff changeset
1806 memory and let the caller re-open the index. */
fc0b638330a4 Added mbox_min_index_size setting.
Timo Sirainen <tss@iki.fi>
parents: 3911
diff changeset
1807 i_assert(index->fd == -1);
fc0b638330a4 Added mbox_min_index_size setting.
Timo Sirainen <tss@iki.fi>
parents: 3911
diff changeset
1808 return -1;
fc0b638330a4 Added mbox_min_index_size setting.
Timo Sirainen <tss@iki.fi>
parents: 3911
diff changeset
1809 }
fc0b638330a4 Added mbox_min_index_size setting.
Timo Sirainen <tss@iki.fi>
parents: 3911
diff changeset
1810
3911
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1811 /* move index map to memory */
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1812 map = mail_index_map_clone(index->map, index->map->hdr.record_size);
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1813 mail_index_unmap(index, &index->map);
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1814 index->map = map;
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1815 index->hdr = &map->hdr;
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1816
4053
94b3363165c8 If transaction log opening fails, don't crash when trying to move it to
Timo Sirainen <tss@iki.fi>
parents: 4026
diff changeset
1817 if (index->log != NULL) {
94b3363165c8 If transaction log opening fails, don't crash when trying to move it to
Timo Sirainen <tss@iki.fi>
parents: 4026
diff changeset
1818 /* move transaction log to memory */
94b3363165c8 If transaction log opening fails, don't crash when trying to move it to
Timo Sirainen <tss@iki.fi>
parents: 4026
diff changeset
1819 if (mail_transaction_log_move_to_memory(index->log) < 0)
94b3363165c8 If transaction log opening fails, don't crash when trying to move it to
Timo Sirainen <tss@iki.fi>
parents: 4026
diff changeset
1820 ret = -1;
94b3363165c8 If transaction log opening fails, don't crash when trying to move it to
Timo Sirainen <tss@iki.fi>
parents: 4026
diff changeset
1821 }
3911
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1822
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1823 /* close the index file. */
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1824 if (close(index->fd) < 0)
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1825 mail_index_set_syscall_error(index, "close()");
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1826 index->fd = -1;
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1827
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
1828 return ret;
3833
318c70c1d4ec Beginnings of fallbacking to in-memory indexes when write fails with "out of
Timo Sirainen <tss@iki.fi>
parents: 3832
diff changeset
1829 }
318c70c1d4ec Beginnings of fallbacking to in-memory indexes when write fails with "out of
Timo Sirainen <tss@iki.fi>
parents: 3832
diff changeset
1830
1945
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
1831 void mail_index_mark_corrupted(struct mail_index *index)
1943
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1832 {
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1833 struct mail_index_header hdr;
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1834
1945
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
1835 mail_index_set_inconsistent(index);
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
1836
1943
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1837 if (index->readonly)
1945
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
1838 return;
1943
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1839
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1840 hdr = *index->hdr;
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1841 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
1842 if (mail_index_write_base_header(index, &hdr) == 0) {
3243
40b4ba3c55b8 In-memory indexes work again. Just pass dir as NULL to mail_index_alloc().
Timo Sirainen <tss@iki.fi>
parents: 3231
diff changeset
1843 if (!MAIL_INDEX_IS_IN_MEMORY(index) && fsync(index->fd) < 0)
1945
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
1844 mail_index_set_syscall_error(index, "fsync()");
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
1845 }
1943
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1846 }
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
1847
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1848 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
1849 const char *function)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1850 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1851 i_assert(function != NULL);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1852
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1853 if (ENOSPACE(errno)) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1854 index->nodiskspace = TRUE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1855 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1856 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1857
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1858 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
1859 function, index->filepath);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1860 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1861
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1862 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
1863 const char *filepath,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1864 const char *function)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1865 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1866 i_assert(filepath != NULL);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1867 i_assert(function != NULL);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1868
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1869 if (ENOSPACE(errno)) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1870 index->nodiskspace = TRUE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1871 return -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1872 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1873
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1874 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
1875 function, filepath);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1876 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1877
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1878 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
1879 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1880 if (index->nodiskspace)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1881 return MAIL_INDEX_ERROR_DISKSPACE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1882 if (index->error != NULL)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1883 return MAIL_INDEX_ERROR_INTERNAL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1884
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1885 return MAIL_INDEX_ERROR_NONE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1886 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1887
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1888 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
1889 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1890 return index->error;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1891 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1892
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1893 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
1894 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1895 if (index->error != NULL) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1896 i_free(index->error);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1897 index->error = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1898 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1899
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1900 index->nodiskspace = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1901 index->index_lock_timeout = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1902 }
2407
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1903
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1904 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
1905 {
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1906 unsigned char buf[4];
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1907
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1908 i_assert(offset < 0x40000000);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1909 i_assert((offset & 3) == 0);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1910
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1911 offset >>= 2;
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1912 buf[0] = 0x80 | ((offset & 0x0fe00000) >> 21);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1913 buf[1] = 0x80 | ((offset & 0x001fc000) >> 14);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1914 buf[2] = 0x80 | ((offset & 0x00003f80) >> 7);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1915 buf[3] = 0x80 | (offset & 0x0000007f);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1916 return *((uint32_t *) buf);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1917 }
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1918
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1919 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
1920 {
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1921 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
1922
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1923 if ((offset & 0x80808080) != 0x80808080)
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1924 return 0;
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1925
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1926 return (((uint32_t)buf[3] & 0x7f) << 2) |
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1927 (((uint32_t)buf[2] & 0x7f) << 9) |
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1928 (((uint32_t)buf[1] & 0x7f) << 16) |
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1929 (((uint32_t)buf[0] & 0x7f) << 23);
fed6d07bd8ee Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents: 2296
diff changeset
1930 }