annotate src/lib-index/mail-index.c @ 22610:bf758ce6ee6d

lib-index: Add mail_index_base_optimization_settings
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Mon, 09 Oct 2017 15:24:45 +0300
parents b7e049f3aa16
children 65ada9976a7f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21389
diff changeset
1 /* Copyright (c) 2003-2017 Dovecot authors, see the included COPYING file */
1915
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"
5819
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5775
diff changeset
4 #include "ioloop.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
5 #include "array.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "buffer.h"
9535
bbe4c24faf21 Use eacces_get_error() in more places for handling EACCES errors.
Timo Sirainen <tss@iki.fi>
parents: 9421
diff changeset
7 #include "eacces-error.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
8 #include "hash.h"
6384
2c8b1d487728 Make sure the extension name doesn't contain control characters. It most
Timo Sirainen <tss@iki.fi>
parents: 6378
diff changeset
9 #include "str-sanitize.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #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
11 #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
12 #include "read-full.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include "write-full.h"
10656
9d3b5cbef222 Moved mail_index lookup cache from lib-storage to lib-index.
Timo Sirainen <tss@iki.fi>
parents: 10655
diff changeset
14 #include "mail-index-alloc-cache.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #include "mail-index-private.h"
5272
82b4a055e109 mmap_disable=yes crashes with recent changes.
Timo Sirainen <tss@iki.fi>
parents: 5247
diff changeset
16 #include "mail-index-view-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
17 #include "mail-index-sync-private.h"
7620
4b8c1c164d8f Initial CONDSTORE support.
Timo Sirainen <tss@iki.fi>
parents: 7361
diff changeset
18 #include "mail-index-modseq.h"
21205
5d905618c4b1 lib-index: Add mail_index_set_log_rotation()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21184
diff changeset
19 #include "mail-transaction-log-private.h"
21184
e87c575aaa1c lib-index: Do not crash if log is missing
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21176
diff changeset
20 #include "mail-transaction-log-view-private.h"
2200
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
21 #include "mail-cache.h"
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 #include <stdio.h>
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 #include <stddef.h>
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 #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
26 #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
27
5453
a0a1432bb4e8 Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5430
diff changeset
28 struct mail_index_module_register mail_index_module_register = { 0 };
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
29
17579
092137bd092b lib-index: Fixed error handling in mail_index_open()
Timo Sirainen <tss@iki.fi>
parents: 17578
diff changeset
30 static void mail_index_close_nonopened(struct mail_index *index);
092137bd092b lib-index: Fixed error handling in mail_index_open()
Timo Sirainen <tss@iki.fi>
parents: 17578
diff changeset
31
22609
b7e049f3aa16 lib-index: Replace mail_index_set_log_rotation() with mail_index_set_optimization_settings()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22483
diff changeset
32 static const struct mail_index_optimization_settings default_optimization_set = {
22610
bf758ce6ee6d lib-index: Add mail_index_base_optimization_settings
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22609
diff changeset
33 .index = {
bf758ce6ee6d lib-index: Add mail_index_base_optimization_settings
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22609
diff changeset
34 .rewrite_min_log_bytes = 8 * 1024,
bf758ce6ee6d lib-index: Add mail_index_base_optimization_settings
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22609
diff changeset
35 .rewrite_max_log_bytes = 128 * 1024,
bf758ce6ee6d lib-index: Add mail_index_base_optimization_settings
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22609
diff changeset
36 },
22609
b7e049f3aa16 lib-index: Replace mail_index_set_log_rotation() with mail_index_set_optimization_settings()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22483
diff changeset
37 .log = {
b7e049f3aa16 lib-index: Replace mail_index_set_log_rotation() with mail_index_set_optimization_settings()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22483
diff changeset
38 .min_size = 32 * 1024,
b7e049f3aa16 lib-index: Replace mail_index_set_log_rotation() with mail_index_set_optimization_settings()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22483
diff changeset
39 .max_size = 1024 * 1024,
b7e049f3aa16 lib-index: Replace mail_index_set_log_rotation() with mail_index_set_optimization_settings()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22483
diff changeset
40 .min_age_secs = 5 * 60,
b7e049f3aa16 lib-index: Replace mail_index_set_log_rotation() with mail_index_set_optimization_settings()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22483
diff changeset
41 .log2_max_age_secs = 3600 * 24 * 2,
b7e049f3aa16 lib-index: Replace mail_index_set_log_rotation() with mail_index_set_optimization_settings()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22483
diff changeset
42 },
b7e049f3aa16 lib-index: Replace mail_index_set_log_rotation() with mail_index_set_optimization_settings()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22483
diff changeset
43 };
b7e049f3aa16 lib-index: Replace mail_index_set_log_rotation() with mail_index_set_optimization_settings()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22483
diff changeset
44
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 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
46 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 struct mail_index *index;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 index = i_new(struct mail_index, 1);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 index->dir = i_strdup(dir);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 index->prefix = i_strdup(prefix);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 index->fd = -1;
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
53
5028
774c965ac79a Memory pool size changes
Timo Sirainen <tss@iki.fi>
parents: 5024
diff changeset
54 index->extension_pool =
774c965ac79a Memory pool size changes
Timo Sirainen <tss@iki.fi>
parents: 5024
diff changeset
55 pool_alloconly_create(MEMPOOL_GROWING"index extension", 1024);
4596
bf4e98a0de3f Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents: 4594
diff changeset
56 p_array_init(&index->extensions, index->extension_pool, 5);
bf4e98a0de3f Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents: 4594
diff changeset
57 i_array_init(&index->sync_lost_handlers, 4);
5453
a0a1432bb4e8 Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5430
diff changeset
58 i_array_init(&index->module_contexts,
a0a1432bb4e8 Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5430
diff changeset
59 I_MIN(5, mail_index_module_register.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
60
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 index->mode = 0600;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 index->gid = (gid_t)-1;
11623
c3ee4421e86a Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents: 10722
diff changeset
63 index->lock_method = FILE_LOCK_METHOD_FCNTL;
15904
d3cf06639864 Replaced all -1U and (unsigned int)-1 with UINT_MAX.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
64 index->max_lock_timeout_secs = UINT_MAX;
22609
b7e049f3aa16 lib-index: Replace mail_index_set_log_rotation() with mail_index_set_optimization_settings()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22483
diff changeset
65 index->optimization_set = default_optimization_set;
21205
5d905618c4b1 lib-index: Add mail_index_set_log_rotation()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21184
diff changeset
66
3016
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
67 index->keywords_ext_id =
8547
545cb188f7ab Replaced literal "keywords" strings with a macro.
Timo Sirainen <tss@iki.fi>
parents: 8146
diff changeset
68 mail_index_ext_register(index, MAIL_INDEX_EXT_KEYWORDS,
545cb188f7ab Replaced literal "keywords" strings with a macro.
Timo Sirainen <tss@iki.fi>
parents: 8146
diff changeset
69 128, 2, 1);
3086
66c44404f9a1 Keyword fixes.
Timo Sirainen <tss@iki.fi>
parents: 3016
diff changeset
70 index->keywords_pool = pool_alloconly_create("keywords", 512);
4596
bf4e98a0de3f Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents: 4594
diff changeset
71 i_array_init(&index->keywords, 16);
14918
8eae4e205c82 Hash table API is now (mostly) type safe.
Timo Sirainen <tss@iki.fi>
parents: 14917
diff changeset
72 hash_table_create(&index->keywords_hash, index->keywords_pool, 0,
8eae4e205c82 Hash table API is now (mostly) type safe.
Timo Sirainen <tss@iki.fi>
parents: 14917
diff changeset
73 strcase_hash, strcasecmp);
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
74 index->log = mail_transaction_log_alloc(index);
7620
4b8c1c164d8f Initial CONDSTORE support.
Timo Sirainen <tss@iki.fi>
parents: 7361
diff changeset
75 mail_index_modseq_init(index);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 return index;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
79 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
80 {
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
81 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
82
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
83 *_index = NULL;
10677
93fe3aa23bdb lib-index: Don't close index files if they're still being used by another mailbox.
Timo Sirainen <tss@iki.fi>
parents: 10674
diff changeset
84
93fe3aa23bdb lib-index: Don't close index files if they're still being used by another mailbox.
Timo Sirainen <tss@iki.fi>
parents: 10674
diff changeset
85 i_assert(index->open_count == 0);
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
86
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
87 mail_transaction_log_free(&index->log);
8573
f9166a09423a Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents: 8572
diff changeset
88 hash_table_destroy(&index->keywords_hash);
6428
7cad076906eb pool_unref() now takes ** pointer.
Timo Sirainen <tss@iki.fi>
parents: 6417
diff changeset
89 pool_unref(&index->extension_pool);
7cad076906eb pool_unref() now takes ** pointer.
Timo Sirainen <tss@iki.fi>
parents: 6417
diff changeset
90 pool_unref(&index->keywords_pool);
1967
b6d900688c55 memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 1965
diff changeset
91
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
92 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
93 array_free(&index->keywords);
5453
a0a1432bb4e8 Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5430
diff changeset
94 array_free(&index->module_contexts);
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
95
14079
2ab26bb55346 lib-index: Added mail_index_set_ext_init_data() for adding data to index on creation.
Timo Sirainen <tss@iki.fi>
parents: 13384
diff changeset
96 i_free(index->ext_hdr_init_data);
9537
b373de4973cd Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9535
diff changeset
97 i_free(index->gid_origin);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 i_free(index->error);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 i_free(index->dir);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 i_free(index->prefix);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 i_free(index);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103
11634
7f19062f58fd Renamed fsync_disable to mail_fsync=optimized|always|never.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
104 void mail_index_set_fsync_mode(struct mail_index *index,
7f19062f58fd Renamed fsync_disable to mail_fsync=optimized|always|never.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
105 enum fsync_mode mode,
15063
0efc12f3eb2a lib-index: Changed mail_index_set_fsync_mode() to use a separate enum for the mask.
Timo Sirainen <tss@iki.fi>
parents: 14923
diff changeset
106 enum mail_index_fsync_mask mask)
6736
3e189cbb7e7a fsync transaction commits only if the transaction contains change types
Timo Sirainen <tss@iki.fi>
parents: 6686
diff changeset
107 {
11634
7f19062f58fd Renamed fsync_disable to mail_fsync=optimized|always|never.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
108 index->fsync_mode = mode;
7f19062f58fd Renamed fsync_disable to mail_fsync=optimized|always|never.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
109 index->fsync_mask = mask;
6736
3e189cbb7e7a fsync transaction commits only if the transaction contains change types
Timo Sirainen <tss@iki.fi>
parents: 6686
diff changeset
110 }
3e189cbb7e7a fsync transaction commits only if the transaction contains change types
Timo Sirainen <tss@iki.fi>
parents: 6686
diff changeset
111
22459
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
112 bool mail_index_use_existing_permissions(struct mail_index *index)
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
113 {
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
114 struct stat st;
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
115
22483
2a7fb92d36eb lib-index: mail_index_use_existing_permissions() - Ignore with INDEX=MEMORY
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22482
diff changeset
116 if (MAIL_INDEX_IS_IN_MEMORY(index))
2a7fb92d36eb lib-index: mail_index_use_existing_permissions() - Ignore with INDEX=MEMORY
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22482
diff changeset
117 return FALSE;
2a7fb92d36eb lib-index: mail_index_use_existing_permissions() - Ignore with INDEX=MEMORY
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22482
diff changeset
118
22482
c5387cdc3964 lib-index: mail_index_use_existing_permissions() - Log error if stat() unexpectedly fails
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22459
diff changeset
119 if (stat(index->dir, &st) < 0) {
c5387cdc3964 lib-index: mail_index_use_existing_permissions() - Log error if stat() unexpectedly fails
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22459
diff changeset
120 if (errno != ENOENT)
c5387cdc3964 lib-index: mail_index_use_existing_permissions() - Log error if stat() unexpectedly fails
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22459
diff changeset
121 i_error("stat(%s) failed: %m", index->dir);
22459
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
122 return FALSE;
22482
c5387cdc3964 lib-index: mail_index_use_existing_permissions() - Log error if stat() unexpectedly fails
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22459
diff changeset
123 }
22459
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
124
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
125 index->mode = st.st_mode & 0666;
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
126 if (S_ISDIR(st.st_mode) && (st.st_mode & S_ISGID) != 0) {
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
127 /* directory's GID is used automatically for new files */
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
128 index->gid = (gid_t)-1;
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
129 } else if ((st.st_mode & 0070) >> 3 == (st.st_mode & 0007)) {
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
130 /* group has same permissions as world, so don't bother
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
131 changing it */
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
132 index->gid = (gid_t)-1;
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
133 } else if (getegid() == st.st_gid) {
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
134 /* using our own gid, no need to change it */
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
135 index->gid = (gid_t)-1;
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
136 } else {
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
137 index->gid = st.st_gid;
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
138 }
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
139
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
140 i_free(index->gid_origin);
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
141 if (index->gid != (gid_t)-1)
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
142 index->gid_origin = i_strdup("preserved existing GID");
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
143 return TRUE;
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
144 }
d802f801c8f9 lib-index: Add mail_index_use_existing_permissions()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22362
diff changeset
145
2650
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
146 void mail_index_set_permissions(struct mail_index *index,
9537
b373de4973cd Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9535
diff changeset
147 mode_t mode, gid_t gid, const char *gid_origin)
2650
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
148 {
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
149 index->mode = mode & 0666;
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
150 index->gid = gid;
9537
b373de4973cd Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9535
diff changeset
151
b373de4973cd Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9535
diff changeset
152 i_free(index->gid_origin);
b373de4973cd Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9535
diff changeset
153 index->gid_origin = i_strdup(gid_origin);
2650
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
154 }
9b78674428f5 Get index file mode and GID from dovecot-shared file.
Timo Sirainen <tss@iki.fi>
parents: 2618
diff changeset
155
11623
c3ee4421e86a Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents: 10722
diff changeset
156 void mail_index_set_lock_method(struct mail_index *index,
c3ee4421e86a Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents: 10722
diff changeset
157 enum file_lock_method lock_method,
c3ee4421e86a Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents: 10722
diff changeset
158 unsigned int max_timeout_secs)
c3ee4421e86a Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents: 10722
diff changeset
159 {
c3ee4421e86a Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents: 10722
diff changeset
160 index->lock_method = lock_method;
c3ee4421e86a Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents: 10722
diff changeset
161 index->max_lock_timeout_secs = max_timeout_secs;
c3ee4421e86a Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents: 10722
diff changeset
162 }
c3ee4421e86a Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents: 10722
diff changeset
163
22609
b7e049f3aa16 lib-index: Replace mail_index_set_log_rotation() with mail_index_set_optimization_settings()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22483
diff changeset
164 void mail_index_set_optimization_settings(struct mail_index *index,
b7e049f3aa16 lib-index: Replace mail_index_set_log_rotation() with mail_index_set_optimization_settings()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22483
diff changeset
165 const struct mail_index_optimization_settings *set)
21205
5d905618c4b1 lib-index: Add mail_index_set_log_rotation()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21184
diff changeset
166 {
22609
b7e049f3aa16 lib-index: Replace mail_index_set_log_rotation() with mail_index_set_optimization_settings()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22483
diff changeset
167 struct mail_index_optimization_settings *dest =
b7e049f3aa16 lib-index: Replace mail_index_set_log_rotation() with mail_index_set_optimization_settings()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22483
diff changeset
168 &index->optimization_set;
b7e049f3aa16 lib-index: Replace mail_index_set_log_rotation() with mail_index_set_optimization_settings()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22483
diff changeset
169
22610
bf758ce6ee6d lib-index: Add mail_index_base_optimization_settings
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22609
diff changeset
170 /* index */
bf758ce6ee6d lib-index: Add mail_index_base_optimization_settings
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22609
diff changeset
171 if (set->index.rewrite_min_log_bytes != 0)
bf758ce6ee6d lib-index: Add mail_index_base_optimization_settings
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22609
diff changeset
172 dest->index.rewrite_min_log_bytes = set->index.rewrite_min_log_bytes;
bf758ce6ee6d lib-index: Add mail_index_base_optimization_settings
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22609
diff changeset
173 if (set->index.rewrite_max_log_bytes != 0)
bf758ce6ee6d lib-index: Add mail_index_base_optimization_settings
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22609
diff changeset
174 dest->index.rewrite_max_log_bytes = set->index.rewrite_max_log_bytes;
bf758ce6ee6d lib-index: Add mail_index_base_optimization_settings
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22609
diff changeset
175
bf758ce6ee6d lib-index: Add mail_index_base_optimization_settings
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22609
diff changeset
176 /* log */
22609
b7e049f3aa16 lib-index: Replace mail_index_set_log_rotation() with mail_index_set_optimization_settings()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22483
diff changeset
177 if (set->log.min_size != 0)
b7e049f3aa16 lib-index: Replace mail_index_set_log_rotation() with mail_index_set_optimization_settings()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22483
diff changeset
178 dest->log.min_size = set->log.min_size;
b7e049f3aa16 lib-index: Replace mail_index_set_log_rotation() with mail_index_set_optimization_settings()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22483
diff changeset
179 if (set->log.max_size != 0)
b7e049f3aa16 lib-index: Replace mail_index_set_log_rotation() with mail_index_set_optimization_settings()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22483
diff changeset
180 dest->log.max_size = set->log.max_size;
b7e049f3aa16 lib-index: Replace mail_index_set_log_rotation() with mail_index_set_optimization_settings()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22483
diff changeset
181 if (set->log.min_age_secs != 0)
b7e049f3aa16 lib-index: Replace mail_index_set_log_rotation() with mail_index_set_optimization_settings()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22483
diff changeset
182 dest->log.min_age_secs = set->log.min_age_secs;
b7e049f3aa16 lib-index: Replace mail_index_set_log_rotation() with mail_index_set_optimization_settings()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22483
diff changeset
183 if (set->log.log2_max_age_secs != 0)
b7e049f3aa16 lib-index: Replace mail_index_set_log_rotation() with mail_index_set_optimization_settings()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22483
diff changeset
184 dest->log.log2_max_age_secs = set->log.log2_max_age_secs;
21205
5d905618c4b1 lib-index: Add mail_index_set_log_rotation()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21184
diff changeset
185 }
5d905618c4b1 lib-index: Add mail_index_set_log_rotation()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21184
diff changeset
186
14079
2ab26bb55346 lib-index: Added mail_index_set_ext_init_data() for adding data to index on creation.
Timo Sirainen <tss@iki.fi>
parents: 13384
diff changeset
187 void mail_index_set_ext_init_data(struct mail_index *index, uint32_t ext_id,
2ab26bb55346 lib-index: Added mail_index_set_ext_init_data() for adding data to index on creation.
Timo Sirainen <tss@iki.fi>
parents: 13384
diff changeset
188 const void *data, size_t size)
2ab26bb55346 lib-index: Added mail_index_set_ext_init_data() for adding data to index on creation.
Timo Sirainen <tss@iki.fi>
parents: 13384
diff changeset
189 {
2ab26bb55346 lib-index: Added mail_index_set_ext_init_data() for adding data to index on creation.
Timo Sirainen <tss@iki.fi>
parents: 13384
diff changeset
190 const struct mail_index_registered_ext *rext;
2ab26bb55346 lib-index: Added mail_index_set_ext_init_data() for adding data to index on creation.
Timo Sirainen <tss@iki.fi>
parents: 13384
diff changeset
191
2ab26bb55346 lib-index: Added mail_index_set_ext_init_data() for adding data to index on creation.
Timo Sirainen <tss@iki.fi>
parents: 13384
diff changeset
192 i_assert(index->ext_hdr_init_data == NULL ||
2ab26bb55346 lib-index: Added mail_index_set_ext_init_data() for adding data to index on creation.
Timo Sirainen <tss@iki.fi>
parents: 13384
diff changeset
193 index->ext_hdr_init_id == ext_id);
2ab26bb55346 lib-index: Added mail_index_set_ext_init_data() for adding data to index on creation.
Timo Sirainen <tss@iki.fi>
parents: 13384
diff changeset
194
2ab26bb55346 lib-index: Added mail_index_set_ext_init_data() for adding data to index on creation.
Timo Sirainen <tss@iki.fi>
parents: 13384
diff changeset
195 rext = array_idx(&index->extensions, ext_id);
2ab26bb55346 lib-index: Added mail_index_set_ext_init_data() for adding data to index on creation.
Timo Sirainen <tss@iki.fi>
parents: 13384
diff changeset
196 i_assert(rext->hdr_size == size);
2ab26bb55346 lib-index: Added mail_index_set_ext_init_data() for adding data to index on creation.
Timo Sirainen <tss@iki.fi>
parents: 13384
diff changeset
197
2ab26bb55346 lib-index: Added mail_index_set_ext_init_data() for adding data to index on creation.
Timo Sirainen <tss@iki.fi>
parents: 13384
diff changeset
198 index->ext_hdr_init_id = ext_id;
2ab26bb55346 lib-index: Added mail_index_set_ext_init_data() for adding data to index on creation.
Timo Sirainen <tss@iki.fi>
parents: 13384
diff changeset
199 i_free(index->ext_hdr_init_data);
2ab26bb55346 lib-index: Added mail_index_set_ext_init_data() for adding data to index on creation.
Timo Sirainen <tss@iki.fi>
parents: 13384
diff changeset
200 index->ext_hdr_init_data = i_malloc(size);
2ab26bb55346 lib-index: Added mail_index_set_ext_init_data() for adding data to index on creation.
Timo Sirainen <tss@iki.fi>
parents: 13384
diff changeset
201 memcpy(index->ext_hdr_init_data, data, size);
2ab26bb55346 lib-index: Added mail_index_set_ext_init_data() for adding data to index on creation.
Timo Sirainen <tss@iki.fi>
parents: 13384
diff changeset
202 }
2ab26bb55346 lib-index: Added mail_index_set_ext_init_data() for adding data to index on creation.
Timo Sirainen <tss@iki.fi>
parents: 13384
diff changeset
203
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2660
diff changeset
204 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
205 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
206 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
207 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
208 {
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
209 struct mail_index_registered_ext rext;
6679
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
210 uint32_t ext_id;
2115
f720b3f15333 Modifying extra_records should work now.
Timo Sirainen <tss@iki.fi>
parents: 2114
diff changeset
211
6871
f7ec019fd3f6 mail_index_ext_register(): Panic if parameters aren't correct.
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
212 if (*name == '\0' || strcmp(name, str_sanitize(name, -1)) != 0)
6384
2c8b1d487728 Make sure the extension name doesn't contain control characters. It most
Timo Sirainen <tss@iki.fi>
parents: 6378
diff changeset
213 i_panic("mail_index_ext_register(%s): Invalid name", name);
2c8b1d487728 Make sure the extension name doesn't contain control characters. It most
Timo Sirainen <tss@iki.fi>
parents: 6378
diff changeset
214
7361
11eb0bd76299 mail_index_ext_register(): Allow registering an extension without record or
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
215 if (default_record_size != 0 && default_record_align == 0) {
6871
f7ec019fd3f6 mail_index_ext_register(): Panic if parameters aren't correct.
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
216 i_panic("mail_index_ext_register(%s): "
7361
11eb0bd76299 mail_index_ext_register(): Allow registering an extension without record or
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
217 "Invalid record alignment", name);
6871
f7ec019fd3f6 mail_index_ext_register(): Panic if parameters aren't correct.
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
218 }
f7ec019fd3f6 mail_index_ext_register(): Panic if parameters aren't correct.
Timo Sirainen <tss@iki.fi>
parents: 6857
diff changeset
219
6679
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
220 if (mail_index_ext_lookup(index, name, &ext_id))
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
221 return ext_id;
2116
fbb4da13ee3b Fixes for extra_records
Timo Sirainen <tss@iki.fi>
parents: 2115
diff changeset
222
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21323
diff changeset
223 i_zero(&rext);
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
224 rext.name = p_strdup(index->extension_pool, name);
6679
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
225 rext.index_idx = array_count(&index->extensions);
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
226 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
227 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
228 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
229
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
230 array_append(&index->extensions, &rext, 1);
6679
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
231 return rext.index_idx;
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
232 }
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
233
18849
9c90eba19aee lib-index: Added mail_index_ext_register_resize_defaults()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
234 void mail_index_ext_register_resize_defaults(struct mail_index *index,
9c90eba19aee lib-index: Added mail_index_ext_register_resize_defaults()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
235 uint32_t ext_id,
9c90eba19aee lib-index: Added mail_index_ext_register_resize_defaults()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
236 uint32_t default_hdr_size,
9c90eba19aee lib-index: Added mail_index_ext_register_resize_defaults()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
237 uint16_t default_record_size,
9c90eba19aee lib-index: Added mail_index_ext_register_resize_defaults()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
238 uint16_t default_record_align)
9c90eba19aee lib-index: Added mail_index_ext_register_resize_defaults()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
239 {
9c90eba19aee lib-index: Added mail_index_ext_register_resize_defaults()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
240 struct mail_index_registered_ext *rext;
9c90eba19aee lib-index: Added mail_index_ext_register_resize_defaults()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
241
9c90eba19aee lib-index: Added mail_index_ext_register_resize_defaults()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
242 rext = array_idx_modifiable(&index->extensions, ext_id);
9c90eba19aee lib-index: Added mail_index_ext_register_resize_defaults()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
243 rext->hdr_size = default_hdr_size;
9c90eba19aee lib-index: Added mail_index_ext_register_resize_defaults()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
244 rext->record_size = default_record_size;
9c90eba19aee lib-index: Added mail_index_ext_register_resize_defaults()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
245 rext->record_align = default_record_align;
9c90eba19aee lib-index: Added mail_index_ext_register_resize_defaults()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
246 }
9c90eba19aee lib-index: Added mail_index_ext_register_resize_defaults()
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
247
6679
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
248 bool mail_index_ext_lookup(struct mail_index *index, const char *name,
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
249 uint32_t *ext_id_r)
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
250 {
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
251 const struct mail_index_registered_ext *extensions;
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
252 unsigned int i, count;
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
253
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
254 extensions = array_get(&index->extensions, &count);
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
255 for (i = 0; i < count; i++) {
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
256 if (strcmp(extensions[i].name, name) == 0) {
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
257 *ext_id_r = i;
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
258 return TRUE;
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
259 }
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
260 }
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
261
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
262 *ext_id_r = (uint32_t)-1;
90196328bcce Added mail_index_ext_lookup()
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
263 return FALSE;
2563
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
264 }
5752e5ac88f0 Save extra record/header infos into index file permanently.
Timo Sirainen <tss@iki.fi>
parents: 2553
diff changeset
265
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
266 void mail_index_register_expunge_handler(struct mail_index *index,
4903
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4876
diff changeset
267 uint32_t ext_id, bool call_always,
4490
56d17f2e1d66 Added support for calling expunge handler for an extension even if the
Timo Sirainen <tss@iki.fi>
parents: 4453
diff changeset
268 mail_index_expunge_handler_t *cb,
4903
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4876
diff changeset
269 void *context)
2853
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
270 {
3817
dc560ef2654b Moved expunge handlers to mail_index_registered_ext.
Timo Sirainen <tss@iki.fi>
parents: 3816
diff changeset
271 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
272
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4396
diff changeset
273 rext = array_idx_modifiable(&index->extensions, ext_id);
4616
b0966236fda7 Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 4596
diff changeset
274 i_assert(rext->expunge_handler == NULL || rext->expunge_handler == cb);
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
275
3817
dc560ef2654b Moved expunge handlers to mail_index_registered_ext.
Timo Sirainen <tss@iki.fi>
parents: 3816
diff changeset
276 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
277 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
278 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
279 }
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
280
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
281 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
282 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
283 {
3817
dc560ef2654b Moved expunge handlers to mail_index_registered_ext.
Timo Sirainen <tss@iki.fi>
parents: 3816
diff changeset
284 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
285
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4396
diff changeset
286 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
287 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
288
3817
dc560ef2654b Moved expunge handlers to mail_index_registered_ext.
Timo Sirainen <tss@iki.fi>
parents: 3816
diff changeset
289 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
290 }
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
291
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
292 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
293 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
294 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
295 {
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
296 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
297
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4396
diff changeset
298 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
299 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
300
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
301 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
302 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
303 }
512dd7d76cdc Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents: 2825
diff changeset
304
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
305 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
306 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
307 {
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
308 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
309
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4396
diff changeset
310 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
311 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
312
3816
575c79a0aabc Cleanup: Created mail_index_registered_ext which is used for
Timo Sirainen <tss@iki.fi>
parents: 3582
diff changeset
313 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
314 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
315 }
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
316
2934
c3ae75597952 Added "sync lost" handlers which are called with mmap_disable=yes when index
Timo Sirainen <tss@iki.fi>
parents: 2926
diff changeset
317 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
318 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
319 {
3191
0df3f5d71958 Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents: 3179
diff changeset
320 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
321 }
c3ae75597952 Added "sync lost" handlers which are called with mmap_disable=yes when index
Timo Sirainen <tss@iki.fi>
parents: 2926
diff changeset
322
3224
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
323 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
324 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
325 {
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
326 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
327 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
328
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
329 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
330 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
331 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
332 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
333 break;
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
334 }
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
335 }
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
336 }
f6e0d1826645 Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
Timo Sirainen <tss@iki.fi>
parents: 3222
diff changeset
337
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
338 bool mail_index_keyword_lookup(struct mail_index *index,
6335
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
339 const char *keyword, 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
340 {
14923
96fd2c3bf932 Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents: 14918
diff changeset
341 char *key;
96fd2c3bf932 Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents: 14918
diff changeset
342 void *value;
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
343
3818
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
344 /* keywords_hash keeps a name => index mapping of keywords.
6758c0f3c318 Comment updates and minor cleanups
Timo Sirainen <tss@iki.fi>
parents: 3817
diff changeset
345 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
346 for the lifetime of the mail_index. */
8573
f9166a09423a Renamed hash_*() to hash_table_*() to avoid conflicts with OSX's strhash.h
Timo Sirainen <tss@iki.fi>
parents: 8572
diff changeset
347 if (hash_table_lookup_full(index->keywords_hash, keyword,
14629
c93ca5e46a8a Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents: 14231
diff changeset
348 &key, &value)) {
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
349 *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
350 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
351 }
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
352
15904
d3cf06639864 Replaced all -1U and (unsigned int)-1 with UINT_MAX.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
353 *idx_r = UINT_MAX;
6335
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
354 return FALSE;
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
355 }
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
356
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
357 void mail_index_keyword_lookup_or_create(struct mail_index *index,
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
358 const char *keyword,
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
359 unsigned int *idx_r)
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
360 {
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
361 char *keyword_dup;
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
362
6350
e7f61751822e Added assert against empty keyword.
Timo Sirainen <tss@iki.fi>
parents: 6349
diff changeset
363 i_assert(*keyword != '\0');
e7f61751822e Added assert against empty keyword.
Timo Sirainen <tss@iki.fi>
parents: 6349
diff changeset
364
6335
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
365 if (mail_index_keyword_lookup(index, keyword, idx_r))
a1c587d3d633 Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents: 6330
diff changeset
366 return;
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
367
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
368 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
369 *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
370
14923
96fd2c3bf932 Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents: 14918
diff changeset
371 hash_table_insert(index->keywords_hash, keyword_dup,
96fd2c3bf932 Reverted "support for non-pointers" part of the hash table API changes.
Timo Sirainen <tss@iki.fi>
parents: 14918
diff changeset
372 POINTER_CAST(*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
373 array_append(&index->keywords, &keyword, 1);
13306
ba03935cc599 mail_index_get_keywords() / status.keywords weren't actually guaranteed to be NULL terminated
Timo Sirainen <tss@iki.fi>
parents: 12936
diff changeset
374
ba03935cc599 mail_index_get_keywords() / status.keywords weren't actually guaranteed to be NULL terminated
Timo Sirainen <tss@iki.fi>
parents: 12936
diff changeset
375 /* keep the array NULL-terminated, but the NULL itself invisible */
14686
9ff19c1d5f69 Added array_append_zero() to write a zero-filled record to an array.
Timo Sirainen <tss@iki.fi>
parents: 14682
diff changeset
376 array_append_zero(&index->keywords);
13306
ba03935cc599 mail_index_get_keywords() / status.keywords weren't actually guaranteed to be NULL terminated
Timo Sirainen <tss@iki.fi>
parents: 12936
diff changeset
377 array_delete(&index->keywords, array_count(&index->keywords)-1, 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
378 }
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
379
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4396
diff changeset
380 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
381 {
3254
a2943c050571 Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents: 3243
diff changeset
382 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
383 }
61c8d205d887 Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents: 2956
diff changeset
384
9613
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
385 struct mail_keywords *
9614
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
386 mail_index_keywords_create(struct mail_index *index,
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
387 const char *const keywords[])
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
388 {
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
389 struct mail_keywords *k;
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
390 unsigned int src, dest, i, count;
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
391
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
392 count = str_array_length(keywords);
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
393 if (count == 0) {
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
394 k = i_new(struct mail_keywords, 1);
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
395 k->index = index;
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
396 k->refcount = 1;
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
397 return k;
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
398 }
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
399
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
400 /* @UNSAFE */
21323
d223fad9767f global: Make sure *_malloc() calculations won't cause integer overflows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21205
diff changeset
401 k = i_malloc(MALLOC_ADD(sizeof(struct mail_keywords),
d223fad9767f global: Make sure *_malloc() calculations won't cause integer overflows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21205
diff changeset
402 MALLOC_MULTIPLY(sizeof(k->idx), (count-1))));
9614
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
403 k->index = index;
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
404 k->refcount = 1;
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
405
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
406 /* look up the keywords from index. they're never removed from there
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
407 so we can permanently store indexes to them. */
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
408 for (src = dest = 0; src < count; src++) {
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
409 mail_index_keyword_lookup_or_create(index, keywords[src],
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
410 &k->idx[dest]);
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
411 /* ignore if this is a duplicate */
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
412 for (i = 0; i < src; i++) {
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
413 if (k->idx[i] == k->idx[dest])
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
414 break;
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
415 }
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
416 if (i == src)
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
417 dest++;
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
418 }
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
419 k->count = dest;
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
420 return k;
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
421 }
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
422
d670b5d66302 Previous commit accidentally removed mail_index_keywords_create().
Timo Sirainen <tss@iki.fi>
parents: 9613
diff changeset
423 struct mail_keywords *
9613
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
424 mail_index_keywords_create_from_indexes(struct mail_index *index,
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
425 const ARRAY_TYPE(keyword_indexes)
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
426 *keyword_indexes)
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
427 {
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
428 struct mail_keywords *k;
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
429 const unsigned int *indexes;
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
430 unsigned int src, dest, i, count;
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
431
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
432 indexes = array_get(keyword_indexes, &count);
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
433 if (count == 0) {
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
434 k = i_new(struct mail_keywords, 1);
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
435 k->index = index;
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
436 k->refcount = 1;
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
437 return k;
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
438 }
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
439
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
440 /* @UNSAFE */
21323
d223fad9767f global: Make sure *_malloc() calculations won't cause integer overflows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21205
diff changeset
441 k = i_malloc(MALLOC_ADD(sizeof(struct mail_keywords),
d223fad9767f global: Make sure *_malloc() calculations won't cause integer overflows.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21205
diff changeset
442 MALLOC_MULTIPLY(sizeof(k->idx), (count-1))));
9613
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
443 k->index = index;
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
444 k->refcount = 1;
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
445
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
446 /* copy but skip duplicates */
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
447 for (src = dest = 0; src < count; src++) {
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
448 for (i = 0; i < src; i++) {
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
449 if (k->idx[i] == indexes[src])
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
450 break;
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
451 }
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
452 if (i == src)
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
453 k->idx[dest++] = indexes[src];
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
454 }
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
455 k->count = dest;
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
456 return k;
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
457 }
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
458
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
459 void mail_index_keywords_ref(struct mail_keywords *keywords)
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
460 {
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
461 keywords->refcount++;
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
462 }
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
463
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
464 void mail_index_keywords_unref(struct mail_keywords **_keywords)
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
465 {
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
466 struct mail_keywords *keywords = *_keywords;
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
467
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
468 i_assert(keywords->refcount > 0);
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
469
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
470 *_keywords = NULL;
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
471 if (--keywords->refcount == 0)
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
472 i_free(keywords);
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
473 }
ed9b4bc28913 Moved mail_index_keywords_*() to mail-index.c.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
474
5686
0d2a6a7f2a1b Moved mail index map related code to its own file.
Timo Sirainen <tss@iki.fi>
parents: 5666
diff changeset
475 int mail_index_try_open_only(struct mail_index *index)
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
476 {
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
477 i_assert(index->fd == -1);
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
478 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
479
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
480 /* Note that our caller must close index->fd by itself. */
6686
610f3d9813b5 Added MAIL_INDEX_OPEN_FLAG_READONLY.
Timo Sirainen <tss@iki.fi>
parents: 6679
diff changeset
481 if (index->readonly)
610f3d9813b5 Added MAIL_INDEX_OPEN_FLAG_READONLY.
Timo Sirainen <tss@iki.fi>
parents: 6679
diff changeset
482 errno = EACCES;
610f3d9813b5 Added MAIL_INDEX_OPEN_FLAG_READONLY.
Timo Sirainen <tss@iki.fi>
parents: 6679
diff changeset
483 else {
610f3d9813b5 Added MAIL_INDEX_OPEN_FLAG_READONLY.
Timo Sirainen <tss@iki.fi>
parents: 6679
diff changeset
484 index->fd = nfs_safe_open(index->filepath, O_RDWR);
610f3d9813b5 Added MAIL_INDEX_OPEN_FLAG_READONLY.
Timo Sirainen <tss@iki.fi>
parents: 6679
diff changeset
485 index->readonly = FALSE;
610f3d9813b5 Added MAIL_INDEX_OPEN_FLAG_READONLY.
Timo Sirainen <tss@iki.fi>
parents: 6679
diff changeset
486 }
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
487
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
488 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
489 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
490 index->readonly = TRUE;
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
491 }
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
492
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
493 if (index->fd == -1) {
14682
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
494 if (errno != ENOENT) {
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
495 mail_index_set_syscall_error(index, "open()");
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
496 return -1;
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
497 }
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
498
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
499 /* have to create it */
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
500 return 0;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
501 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
502 return 1;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
503 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
504
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
505 static int
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
506 mail_index_try_open(struct mail_index *index)
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
507 {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
508 int ret;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
509
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
510 i_assert(index->fd == -1);
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
511
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
512 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
513 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
514
5854
eca7e29dce0d Rewrite index lock handling.
Timo Sirainen <tss@iki.fi>
parents: 5853
diff changeset
515 ret = mail_index_map(index, MAIL_INDEX_SYNC_HANDLER_HEAD);
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
516 if (ret == 0) {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
517 /* it's corrupted - recreate it */
5820
e59892590a02 Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents: 5819
diff changeset
518 if (index->fd != -1) {
e59892590a02 Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents: 5819
diff changeset
519 if (close(index->fd) < 0)
e59892590a02 Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents: 5819
diff changeset
520 mail_index_set_syscall_error(index, "close()");
e59892590a02 Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents: 5819
diff changeset
521 index->fd = -1;
e59892590a02 Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents: 5819
diff changeset
522 }
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
523 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
524 return ret;
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
525 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
526
17904
0a34975b2dcc lib-index: Added path parameter to mail_index_create_tmp_file()
Timo Sirainen <tss@iki.fi>
parents: 17900
diff changeset
527 int mail_index_create_tmp_file(struct mail_index *index,
0a34975b2dcc lib-index: Added path parameter to mail_index_create_tmp_file()
Timo Sirainen <tss@iki.fi>
parents: 17900
diff changeset
528 const char *path_prefix, const char **path_r)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
529 {
2879
aa93c7216722 dovecot-shared file was supposed to show permissions/gid for files created
Timo Sirainen <tss@iki.fi>
parents: 2877
diff changeset
530 mode_t old_mask;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
531 const char *path;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
532 int fd;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
533
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
534 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
535
17904
0a34975b2dcc lib-index: Added path parameter to mail_index_create_tmp_file()
Timo Sirainen <tss@iki.fi>
parents: 17900
diff changeset
536 path = *path_r = t_strconcat(path_prefix, ".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
537 old_mask = umask(0);
12702
7ecc5e10da57 lib-index: Avoid corrupting dovecot.index file when recreating it even in case of broken file locking.
Timo Sirainen <tss@iki.fi>
parents: 12249
diff changeset
538 fd = open(path, O_RDWR|O_CREAT|O_EXCL, 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
539 umask(old_mask);
12702
7ecc5e10da57 lib-index: Avoid corrupting dovecot.index file when recreating it even in case of broken file locking.
Timo Sirainen <tss@iki.fi>
parents: 12249
diff changeset
540 if (fd == -1 && errno == EEXIST) {
7ecc5e10da57 lib-index: Avoid corrupting dovecot.index file when recreating it even in case of broken file locking.
Timo Sirainen <tss@iki.fi>
parents: 12249
diff changeset
541 /* stale temp file. unlink and recreate rather than overwriting,
7ecc5e10da57 lib-index: Avoid corrupting dovecot.index file when recreating it even in case of broken file locking.
Timo Sirainen <tss@iki.fi>
parents: 12249
diff changeset
542 just to make sure locking problems won't cause corruption */
19136
fefaa6d09a81 Replaced unlink() calls with i_unlink*() wherever possible.
Timo Sirainen <tss@iki.fi>
parents: 18849
diff changeset
543 if (i_unlink(path) < 0)
12702
7ecc5e10da57 lib-index: Avoid corrupting dovecot.index file when recreating it even in case of broken file locking.
Timo Sirainen <tss@iki.fi>
parents: 12249
diff changeset
544 return -1;
7ecc5e10da57 lib-index: Avoid corrupting dovecot.index file when recreating it even in case of broken file locking.
Timo Sirainen <tss@iki.fi>
parents: 12249
diff changeset
545 old_mask = umask(0);
7ecc5e10da57 lib-index: Avoid corrupting dovecot.index file when recreating it even in case of broken file locking.
Timo Sirainen <tss@iki.fi>
parents: 12249
diff changeset
546 fd = open(path, O_RDWR|O_CREAT|O_EXCL, index->mode);
7ecc5e10da57 lib-index: Avoid corrupting dovecot.index file when recreating it even in case of broken file locking.
Timo Sirainen <tss@iki.fi>
parents: 12249
diff changeset
547 umask(old_mask);
7ecc5e10da57 lib-index: Avoid corrupting dovecot.index file when recreating it even in case of broken file locking.
Timo Sirainen <tss@iki.fi>
parents: 12249
diff changeset
548 }
10686
442c980d6221 lib-index: Fixed logging file creation EACCES failures.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
549 if (fd == -1) {
442c980d6221 lib-index: Fixed logging file creation EACCES failures.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
550 mail_index_file_set_syscall_error(index, path, "creat()");
442c980d6221 lib-index: Fixed logging file creation EACCES failures.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
551 return -1;
442c980d6221 lib-index: Fixed logging file creation EACCES failures.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
552 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
553
9420
c496f137c843 index: Handle better errors where a new file's group can't be changed.
Timo Sirainen <tss@iki.fi>
parents: 9394
diff changeset
554 mail_index_fchown(index, fd, path);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
555 return fd;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
556 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
557
6375
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
558 static int mail_index_open_files(struct mail_index *index,
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
559 enum mail_index_open_flags flags)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
560 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
561 int ret;
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
562
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
563 ret = mail_transaction_log_open(index->log);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
564 if (ret == 0) {
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
565 if ((flags & MAIL_INDEX_OPEN_FLAG_CREATE) == 0)
6375
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
566 return 0;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
567
5819
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5775
diff changeset
568 /* if dovecot.index exists, read it first so that we can get
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5775
diff changeset
569 the correct indexid and log sequence */
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5775
diff changeset
570 (void)mail_index_try_open(index);
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5775
diff changeset
571
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5775
diff changeset
572 if (index->indexid == 0) {
6359
c54c07f30a97 Fixed opening indexes to memory.
Timo Sirainen <tss@iki.fi>
parents: 6350
diff changeset
573 /* Create a new indexid for us. If we're opening index
c54c07f30a97 Fixed opening indexes to memory.
Timo Sirainen <tss@iki.fi>
parents: 6350
diff changeset
574 into memory, index->map doesn't exist yet. */
5819
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5775
diff changeset
575 index->indexid = ioloop_time;
7573
de08cc81da73 Fixes to handling races in initial index creation.
Timo Sirainen <tss@iki.fi>
parents: 7361
diff changeset
576 index->initial_create = TRUE;
6359
c54c07f30a97 Fixed opening indexes to memory.
Timo Sirainen <tss@iki.fi>
parents: 6350
diff changeset
577 if (index->map != NULL)
c54c07f30a97 Fixed opening indexes to memory.
Timo Sirainen <tss@iki.fi>
parents: 6350
diff changeset
578 index->map->hdr.indexid = index->indexid;
5819
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5775
diff changeset
579 }
4ea31bf18a56 Handle indexid changes better.
Timo Sirainen <tss@iki.fi>
parents: 5775
diff changeset
580
7573
de08cc81da73 Fixes to handling races in initial index creation.
Timo Sirainen <tss@iki.fi>
parents: 7361
diff changeset
581 ret = mail_transaction_log_create(index->log, FALSE);
9950
7aea0156986a Avoid assert-crashing when two processes try to create index at the same time.
Timo Sirainen <tss@iki.fi>
parents: 9698
diff changeset
582 if (index->map != NULL) {
7aea0156986a Avoid assert-crashing when two processes try to create index at the same time.
Timo Sirainen <tss@iki.fi>
parents: 9698
diff changeset
583 /* log creation could have changed it if someone else
7aea0156986a Avoid assert-crashing when two processes try to create index at the same time.
Timo Sirainen <tss@iki.fi>
parents: 9698
diff changeset
584 just created it. */
7aea0156986a Avoid assert-crashing when two processes try to create index at the same time.
Timo Sirainen <tss@iki.fi>
parents: 9698
diff changeset
585 index->map->hdr.indexid = index->indexid;
7aea0156986a Avoid assert-crashing when two processes try to create index at the same time.
Timo Sirainen <tss@iki.fi>
parents: 9698
diff changeset
586 }
7573
de08cc81da73 Fixes to handling races in initial index creation.
Timo Sirainen <tss@iki.fi>
parents: 7361
diff changeset
587 index->initial_create = FALSE;
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
588 }
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
589 if (ret >= 0) {
7573
de08cc81da73 Fixes to handling races in initial index creation.
Timo Sirainen <tss@iki.fi>
parents: 7361
diff changeset
590 ret = index->map != NULL ? 1 : mail_index_try_open(index);
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
591 if (ret == 0) {
7573
de08cc81da73 Fixes to handling races in initial index creation.
Timo Sirainen <tss@iki.fi>
parents: 7361
diff changeset
592 /* corrupted */
6322
8d9a156ec94e Handle opening corrupted index files better.
Timo Sirainen <tss@iki.fi>
parents: 6321
diff changeset
593 mail_transaction_log_close(index->log);
7573
de08cc81da73 Fixes to handling races in initial index creation.
Timo Sirainen <tss@iki.fi>
parents: 7361
diff changeset
594 ret = mail_transaction_log_create(index->log, TRUE);
6359
c54c07f30a97 Fixed opening indexes to memory.
Timo Sirainen <tss@iki.fi>
parents: 6350
diff changeset
595 if (ret == 0) {
c54c07f30a97 Fixed opening indexes to memory.
Timo Sirainen <tss@iki.fi>
parents: 6350
diff changeset
596 if (index->map != NULL)
c54c07f30a97 Fixed opening indexes to memory.
Timo Sirainen <tss@iki.fi>
parents: 6350
diff changeset
597 mail_index_unmap(&index->map);
6322
8d9a156ec94e Handle opening corrupted index files better.
Timo Sirainen <tss@iki.fi>
parents: 6321
diff changeset
598 index->map = mail_index_map_alloc(index);
6359
c54c07f30a97 Fixed opening indexes to memory.
Timo Sirainen <tss@iki.fi>
parents: 6350
diff changeset
599 }
2170
fb785d235c43 minor fix for error handling
Timo Sirainen <tss@iki.fi>
parents: 2122
diff changeset
600 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
601 }
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
602 if (ret < 0) {
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
603 /* open/create failed, fallback to in-memory indexes */
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
604 if ((flags & MAIL_INDEX_OPEN_FLAG_CREATE) == 0)
6375
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
605 return -1;
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
606
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
607 if (mail_index_move_to_memory(index) < 0)
6375
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
608 return -1;
2200
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
609 }
97bb7b127617 Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents: 2193
diff changeset
610
17900
6aeb2a7e5303 lib-index: Fixed cache file creation race condition.
Timo Sirainen <tss@iki.fi>
parents: 17579
diff changeset
611 if (index->cache == NULL)
6aeb2a7e5303 lib-index: Fixed cache file creation race condition.
Timo Sirainen <tss@iki.fi>
parents: 17579
diff changeset
612 index->cache = mail_cache_open_or_create(index);
13384
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
613 return 1;
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
614 }
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
615
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
616 static int
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
617 mail_index_open_opened(struct mail_index *index,
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
618 enum mail_index_open_flags flags)
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
619 {
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
620 int ret;
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
621
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
622 i_assert(index->map != NULL);
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
623
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
624 if ((index->map->hdr.flags & MAIL_INDEX_HDR_FLAG_CORRUPTED) != 0) {
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
625 /* index was marked corrupted. we'll probably need to
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
626 recreate the files. */
17464
203b3a6f508f Removed pointless NULL checks.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
627 mail_index_unmap(&index->map);
13384
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
628 mail_index_close_file(index);
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
629 mail_transaction_log_close(index->log);
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
630 if ((ret = mail_index_open_files(index, flags)) <= 0)
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
631 return ret;
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
632 }
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
633
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
634 index->open_count++;
6375
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
635 return 1;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
636 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
637
11623
c3ee4421e86a Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents: 10722
diff changeset
638 int mail_index_open(struct mail_index *index, enum mail_index_open_flags flags)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
639 {
6375
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
640 int ret;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
641
10677
93fe3aa23bdb lib-index: Don't close index files if they're still being used by another mailbox.
Timo Sirainen <tss@iki.fi>
parents: 10674
diff changeset
642 if (index->open_count > 0) {
13384
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
643 if ((ret = mail_index_open_opened(index, flags)) <= 0) {
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
644 /* doesn't exist and create flag not used */
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
645 }
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
646 return ret;
2926
c035583b4839 Make sure index is reopened if it's marked corrupted.
Timo Sirainen <tss@iki.fi>
parents: 2922
diff changeset
647 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
648
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
649 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
650 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
651 i_strconcat(index->dir, "/", index->prefix, NULL);
1967
b6d900688c55 memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 1965
diff changeset
652
6375
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
653 index->readonly = FALSE;
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
654 index->nodiskspace = FALSE;
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
655 index->index_lock_timeout = FALSE;
12249
41e99ee5c1dd lib-index: Avoid unnecessary pread()s at end of transaction log file.
Timo Sirainen <tss@iki.fi>
parents: 12202
diff changeset
656 index->log_sync_locked = FALSE;
9696
126132cb1c19 index: Removed duplication of mail_index_open_flags from struct mail_index.
Timo Sirainen <tss@iki.fi>
parents: 9614
diff changeset
657 index->flags = flags;
6686
610f3d9813b5 Added MAIL_INDEX_OPEN_FLAG_READONLY.
Timo Sirainen <tss@iki.fi>
parents: 6679
diff changeset
658 index->readonly = (flags & MAIL_INDEX_OPEN_FLAG_READONLY) != 0;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
659
9696
126132cb1c19 index: Removed duplication of mail_index_open_flags from struct mail_index.
Timo Sirainen <tss@iki.fi>
parents: 9614
diff changeset
660 if ((flags & MAIL_INDEX_OPEN_FLAG_NFS_FLUSH) != 0 &&
11634
7f19062f58fd Renamed fsync_disable to mail_fsync=optimized|always|never.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
661 index->fsync_mode != FSYNC_MODE_ALWAYS)
7f19062f58fd Renamed fsync_disable to mail_fsync=optimized|always|never.
Timo Sirainen <tss@iki.fi>
parents: 11623
diff changeset
662 i_fatal("nfs flush requires mail_fsync=always");
9696
126132cb1c19 index: Removed duplication of mail_index_open_flags from struct mail_index.
Timo Sirainen <tss@iki.fi>
parents: 9614
diff changeset
663 if ((flags & MAIL_INDEX_OPEN_FLAG_NFS_FLUSH) != 0 &&
126132cb1c19 index: Removed duplication of mail_index_open_flags from struct mail_index.
Timo Sirainen <tss@iki.fi>
parents: 9614
diff changeset
664 (flags & MAIL_INDEX_OPEN_FLAG_MMAP_DISABLE) == 0)
6375
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
665 i_fatal("nfs flush requires mmap_disable=yes");
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
666
13384
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
667 /* NOTE: increase open_count only after mail_index_open_files().
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
668 it's used elsewhere to check if we're doing an initial opening
33dc66d4286d lib-index: Fixed reopening index file that was marked as corrupted.
Timo Sirainen <tss@iki.fi>
parents: 13379
diff changeset
669 of the index files */
6375
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
670 if ((ret = mail_index_open_files(index, flags)) <= 0) {
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
671 /* doesn't exist and create flag not used */
17579
092137bd092b lib-index: Fixed error handling in mail_index_open()
Timo Sirainen <tss@iki.fi>
parents: 17578
diff changeset
672 mail_index_close_nonopened(index);
6375
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
673 return ret;
3824
3e756ea0474b Comment updates, small cleanups and optimizations.
Timo Sirainen <tss@iki.fi>
parents: 3819
diff changeset
674 }
21184
e87c575aaa1c lib-index: Do not crash if log is missing
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21176
diff changeset
675
12202
8af455e61dad lib-index: Avoid refreshing transaction log immediately after it was opened.
Timo Sirainen <tss@iki.fi>
parents: 12009
diff changeset
676 index->open_count++;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
677
21184
e87c575aaa1c lib-index: Do not crash if log is missing
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21176
diff changeset
678 if (index->log->head == NULL) {
e87c575aaa1c lib-index: Do not crash if log is missing
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21176
diff changeset
679 mail_index_close(index);
e87c575aaa1c lib-index: Do not crash if log is missing
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21176
diff changeset
680 mail_index_set_error(index, "Index is corrupted "
e87c575aaa1c lib-index: Do not crash if log is missing
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21176
diff changeset
681 "(log->view->head == NULL)");
e87c575aaa1c lib-index: Do not crash if log is missing
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21176
diff changeset
682 return -1;
e87c575aaa1c lib-index: Do not crash if log is missing
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21176
diff changeset
683 }
e87c575aaa1c lib-index: Do not crash if log is missing
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21176
diff changeset
684
6375
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
685 i_assert(index->map != NULL);
10656
9d3b5cbef222 Moved mail_index lookup cache from lib-storage to lib-index.
Timo Sirainen <tss@iki.fi>
parents: 10655
diff changeset
686 mail_index_alloc_cache_index_opened(index);
6375
fc2f5607108d fsck the index while it's being mapped.
Timo Sirainen <tss@iki.fi>
parents: 6372
diff changeset
687 return 1;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
688 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
689
8953
f80f26822262 Added mail_index_open_or_create().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
690 int mail_index_open_or_create(struct mail_index *index,
11623
c3ee4421e86a Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents: 10722
diff changeset
691 enum mail_index_open_flags flags)
8953
f80f26822262 Added mail_index_open_or_create().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
692 {
f80f26822262 Added mail_index_open_or_create().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
693 int ret;
f80f26822262 Added mail_index_open_or_create().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
694
f80f26822262 Added mail_index_open_or_create().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
695 flags |= MAIL_INDEX_OPEN_FLAG_CREATE;
11623
c3ee4421e86a Added mail_max_lock_timeout setting.
Timo Sirainen <tss@iki.fi>
parents: 10722
diff changeset
696 ret = mail_index_open(index, flags);
8953
f80f26822262 Added mail_index_open_or_create().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
697 i_assert(ret != 0);
f80f26822262 Added mail_index_open_or_create().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
698 return ret < 0 ? -1 : 0;
f80f26822262 Added mail_index_open_or_create().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
699 }
f80f26822262 Added mail_index_open_or_create().
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
700
6390
ff48b008150f Fix ESTALE handling when reading main index.
Timo Sirainen <tss@iki.fi>
parents: 6384
diff changeset
701 void mail_index_close_file(struct mail_index *index)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
702 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
703 if (index->fd != -1) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
704 if (close(index->fd) < 0)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
705 mail_index_set_syscall_error(index, "close()");
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
706 index->fd = -1;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
707 }
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
708 }
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
709
17579
092137bd092b lib-index: Fixed error handling in mail_index_open()
Timo Sirainen <tss@iki.fi>
parents: 17578
diff changeset
710 static void mail_index_close_nonopened(struct mail_index *index)
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
711 {
12762
74300385cce0 lib-index: Give better assert-crashes if view or log view isn't closed.
Timo Sirainen <tss@iki.fi>
parents: 12702
diff changeset
712 i_assert(!index->syncing);
17108
3f352534af56 lib-index: Keep track of views and transactions in linked lists.
Timo Sirainen <tss@iki.fi>
parents: 15904
diff changeset
713 i_assert(index->views == NULL);
12762
74300385cce0 lib-index: Give better assert-crashes if view or log view isn't closed.
Timo Sirainen <tss@iki.fi>
parents: 12702
diff changeset
714
5827
f17d4bccd74d Memory and fd leak fix
Timo Sirainen <tss@iki.fi>
parents: 5820
diff changeset
715 if (index->map != NULL)
5853
d9f319a9d6e0 mail_index_map now contains pointer to index, so all functions taking map
Timo Sirainen <tss@iki.fi>
parents: 5827
diff changeset
716 mail_index_unmap(&index->map);
5827
f17d4bccd74d Memory and fd leak fix
Timo Sirainen <tss@iki.fi>
parents: 5820
diff changeset
717
f17d4bccd74d Memory and fd leak fix
Timo Sirainen <tss@iki.fi>
parents: 5820
diff changeset
718 mail_index_close_file(index);
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
719 mail_transaction_log_close(index->log);
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
720 if (index->cache != NULL)
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
721 mail_cache_free(&index->cache);
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
722
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
723 i_free_and_null(index->filepath);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
724
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
725 index->indexid = 0;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
726 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
727
17579
092137bd092b lib-index: Fixed error handling in mail_index_open()
Timo Sirainen <tss@iki.fi>
parents: 17578
diff changeset
728 void mail_index_close(struct mail_index *index)
092137bd092b lib-index: Fixed error handling in mail_index_open()
Timo Sirainen <tss@iki.fi>
parents: 17578
diff changeset
729 {
092137bd092b lib-index: Fixed error handling in mail_index_open()
Timo Sirainen <tss@iki.fi>
parents: 17578
diff changeset
730 i_assert(index->open_count > 0);
092137bd092b lib-index: Fixed error handling in mail_index_open()
Timo Sirainen <tss@iki.fi>
parents: 17578
diff changeset
731
092137bd092b lib-index: Fixed error handling in mail_index_open()
Timo Sirainen <tss@iki.fi>
parents: 17578
diff changeset
732 mail_index_alloc_cache_index_closing(index);
092137bd092b lib-index: Fixed error handling in mail_index_open()
Timo Sirainen <tss@iki.fi>
parents: 17578
diff changeset
733 if (--index->open_count == 0)
092137bd092b lib-index: Fixed error handling in mail_index_open()
Timo Sirainen <tss@iki.fi>
parents: 17578
diff changeset
734 mail_index_close_nonopened(index);
092137bd092b lib-index: Fixed error handling in mail_index_open()
Timo Sirainen <tss@iki.fi>
parents: 17578
diff changeset
735 }
092137bd092b lib-index: Fixed error handling in mail_index_open()
Timo Sirainen <tss@iki.fi>
parents: 17578
diff changeset
736
9311
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
737 int mail_index_unlink(struct mail_index *index)
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
738 {
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
739 const char *path;
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
740 int last_errno = 0;
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
741
10006
a425ba46a64c lib-index: Take MAIL_INDEX_OPEN_FLAG_READONLY more seriously.
Timo Sirainen <tss@iki.fi>
parents: 9950
diff changeset
742 if (MAIL_INDEX_IS_IN_MEMORY(index) || index->readonly)
9311
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
743 return 0;
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
744
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
745 /* main index */
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
746 if (unlink(index->filepath) < 0 && errno != ENOENT)
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
747 last_errno = errno;
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
748
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
749 /* logs */
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
750 path = t_strconcat(index->filepath, MAIL_TRANSACTION_LOG_SUFFIX, NULL);
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
751 if (unlink(path) < 0 && errno != ENOENT)
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
752 last_errno = errno;
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
753
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
754 path = t_strconcat(index->filepath,
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
755 MAIL_TRANSACTION_LOG_SUFFIX".2", NULL);
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
756 if (unlink(path) < 0 && errno != ENOENT)
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
757 last_errno = errno;
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
758
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
759 /* cache */
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
760 path = t_strconcat(index->filepath, MAIL_CACHE_FILE_SUFFIX, NULL);
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
761 if (unlink(path) < 0 && errno != ENOENT)
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
762 last_errno = errno;
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
763
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
764 if (last_errno == 0)
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
765 return 0;
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
766 else {
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
767 errno = last_errno;
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
768 return -1;
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
769 }
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
770 }
0b3d90514e85 Added mail_index_unlink().
Timo Sirainen <tss@iki.fi>
parents: 9100
diff changeset
771
21087
3b909cd1264b lib-index: Improve error messages when transaction log is unexpectedly lost
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20716
diff changeset
772 int mail_index_reopen_if_changed(struct mail_index *index,
3b909cd1264b lib-index: Improve error messages when transaction log is unexpectedly lost
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20716
diff changeset
773 const char **reason_r)
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
774 {
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
775 struct stat st1, st2;
21087
3b909cd1264b lib-index: Improve error messages when transaction log is unexpectedly lost
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20716
diff changeset
776 int ret;
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
777
21087
3b909cd1264b lib-index: Improve error messages when transaction log is unexpectedly lost
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20716
diff changeset
778 if (MAIL_INDEX_IS_IN_MEMORY(index)) {
3b909cd1264b lib-index: Improve error messages when transaction log is unexpectedly lost
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20716
diff changeset
779 *reason_r = "in-memory 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
780 return 0;
21087
3b909cd1264b lib-index: Improve error messages when transaction log is unexpectedly lost
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20716
diff changeset
781 }
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
782
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
783 if (index->fd == -1)
21087
3b909cd1264b lib-index: Improve error messages when transaction log is unexpectedly lost
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20716
diff changeset
784 goto final;
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
785
9696
126132cb1c19 index: Removed duplication of mail_index_open_flags from struct mail_index.
Timo Sirainen <tss@iki.fi>
parents: 9614
diff changeset
786 if ((index->flags & MAIL_INDEX_OPEN_FLAG_NFS_FLUSH) != 0)
6857
41911abe6fa7 NFS cache flushing updates.
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
787 nfs_flush_file_handle_cache(index->filepath);
6797
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6755
diff changeset
788 if (nfs_safe_stat(index->filepath, &st2) < 0) {
21087
3b909cd1264b lib-index: Improve error messages when transaction log is unexpectedly lost
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20716
diff changeset
789 if (errno == ENOENT) {
3b909cd1264b lib-index: Improve error messages when transaction log is unexpectedly lost
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20716
diff changeset
790 *reason_r = "index not found via stat()";
6797
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6755
diff changeset
791 return 0;
21087
3b909cd1264b lib-index: Improve error messages when transaction log is unexpectedly lost
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20716
diff changeset
792 }
14682
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
793 mail_index_set_syscall_error(index, "stat()");
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
794 return -1;
6797
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6755
diff changeset
795 }
a59deefc552f NFS attribute cache flushing fixes. nfs_flush_attr_cache() takes now
Timo Sirainen <tss@iki.fi>
parents: 6755
diff changeset
796
4023
b19ccbaa3802 Try to handle ESTALE NFS errors the best way we can.
Timo Sirainen <timo.sirainen@movial.fi>
parents: 3912
diff changeset
797 if (fstat(index->fd, &st1) < 0) {
14682
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
798 if (!ESTALE_FSTAT(errno)) {
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
799 mail_index_set_syscall_error(index, "fstat()");
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
800 return -1;
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
801 }
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
802 /* deleted/recreated, reopen */
21087
3b909cd1264b lib-index: Improve error messages when transaction log is unexpectedly lost
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20716
diff changeset
803 *reason_r = "index is stale";
6829
dbab5e592577 NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents: 6819
diff changeset
804 } else if (st1.st_ino == st2.st_ino &&
dbab5e592577 NFS cache flushing APIs changed and backend implements it a bit differently.
Timo Sirainen <tss@iki.fi>
parents: 6819
diff changeset
805 CMP_DEV_T(st1.st_dev, st2.st_dev)) {
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
806 /* the same file */
21087
3b909cd1264b lib-index: Improve error messages when transaction log is unexpectedly lost
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20716
diff changeset
807 *reason_r = "index unchanged";
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
808 return 1;
21087
3b909cd1264b lib-index: Improve error messages when transaction log is unexpectedly lost
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20716
diff changeset
809 } else {
3b909cd1264b lib-index: Improve error messages when transaction log is unexpectedly lost
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20716
diff changeset
810 *reason_r = "index inode changed";
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
811 }
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
812
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
813 /* new file, new locks. the old fd can keep its locks, they don't
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
814 matter anymore as no-one's going to modify the file. */
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
815 mail_index_close_file(index);
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
816
21087
3b909cd1264b lib-index: Improve error messages when transaction log is unexpectedly lost
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20716
diff changeset
817 final:
3b909cd1264b lib-index: Improve error messages when transaction log is unexpectedly lost
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20716
diff changeset
818 if ((ret = mail_index_try_open_only(index)) == 0)
3b909cd1264b lib-index: Improve error messages when transaction log is unexpectedly lost
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20716
diff changeset
819 *reason_r = "index not found via open()";
3b909cd1264b lib-index: Improve error messages when transaction log is unexpectedly lost
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20716
diff changeset
820 else if (ret > 0)
3b909cd1264b lib-index: Improve error messages when transaction log is unexpectedly lost
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20716
diff changeset
821 *reason_r = "index opened";
3b909cd1264b lib-index: Improve error messages when transaction log is unexpectedly lost
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20716
diff changeset
822 return ret;
2063
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
823 }
21a3e5d08290 mail_index_refresh() - allows forcing a refresh check
Timo Sirainen <tss@iki.fi>
parents: 2051
diff changeset
824
2936
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
825 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
826 {
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
827 int ret;
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
828
5854
eca7e29dce0d Rewrite index lock handling.
Timo Sirainen <tss@iki.fi>
parents: 5853
diff changeset
829 ret = mail_index_map(index, MAIL_INDEX_SYNC_HANDLER_HEAD);
2936
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
830 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
831 }
57f975a9b63b Renamed mail_index_refresh() to mail_index_reopen_if_needed(). Added public
Timo Sirainen <tss@iki.fi>
parents: 2935
diff changeset
832
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
833 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
834 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
835 return index->cache;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
836 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
837
14682
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
838 void mail_index_set_error(struct mail_index *index, const char *fmt, ...)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
839 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
840 va_list va;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
841
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
842 i_free(index->error);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
843
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
844 if (fmt == NULL)
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
845 index->error = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
846 else {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
847 va_start(va, fmt);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
848 index->error = i_strdup_vprintf(fmt, va);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
849 va_end(va);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
850
21176
eb5e99ab03d9 lib-index: Revert log flooding prevention / 3c014db6f
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21087
diff changeset
851 i_error("%s", index->error);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
852 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
853 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
854
9099
67369ba9f447 maildir: When saving messages, in some race conditions we might have written a duplicate UID.
Timo Sirainen <tss@iki.fi>
parents: 8973
diff changeset
855 bool mail_index_is_in_memory(struct mail_index *index)
67369ba9f447 maildir: When saving messages, in some race conditions we might have written a duplicate UID.
Timo Sirainen <tss@iki.fi>
parents: 8973
diff changeset
856 {
67369ba9f447 maildir: When saving messages, in some race conditions we might have written a duplicate UID.
Timo Sirainen <tss@iki.fi>
parents: 8973
diff changeset
857 return MAIL_INDEX_IS_IN_MEMORY(index);
67369ba9f447 maildir: When saving messages, in some race conditions we might have written a duplicate UID.
Timo Sirainen <tss@iki.fi>
parents: 8973
diff changeset
858 }
67369ba9f447 maildir: When saving messages, in some race conditions we might have written a duplicate UID.
Timo Sirainen <tss@iki.fi>
parents: 8973
diff changeset
859
3833
318c70c1d4ec Beginnings of fallbacking to in-memory indexes when write fails with "out of
Timo Sirainen <tss@iki.fi>
parents: 3832
diff changeset
860 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
861 {
3911
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
862 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
863
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
864 if (MAIL_INDEX_IS_IN_MEMORY(index))
5430
c8bb83980ff7 If mail_index_move_to_memory() fails, make sure the future calls to it also
Timo Sirainen <tss@iki.fi>
parents: 5323
diff changeset
865 return index->map == NULL ? -1 : 0;
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
866
9696
126132cb1c19 index: Removed duplication of mail_index_open_flags from struct mail_index.
Timo Sirainen <tss@iki.fi>
parents: 9614
diff changeset
867 if ((index->flags & MAIL_INDEX_OPEN_FLAG_NEVER_IN_MEMORY) != 0)
8973
f295678cef1e dbox: Make sure indexes are never moved to memory (in case of out-of-disk space).
Timo Sirainen <tss@iki.fi>
parents: 8960
diff changeset
868 return -1;
f295678cef1e dbox: Make sure indexes are never moved to memory (in case of out-of-disk space).
Timo Sirainen <tss@iki.fi>
parents: 8960
diff changeset
869
4919
d54145736f99 If mail_index_move_to_memory() was called before index file was opened, we
Timo Sirainen <tss@iki.fi>
parents: 4918
diff changeset
870 /* set the index as being into memory */
d54145736f99 If mail_index_move_to_memory() was called before index file was opened, we
Timo Sirainen <tss@iki.fi>
parents: 4918
diff changeset
871 i_free_and_null(index->dir);
d54145736f99 If mail_index_move_to_memory() was called before index file was opened, we
Timo Sirainen <tss@iki.fi>
parents: 4918
diff changeset
872
5274
7641e625fbd5 When moving index file to memory, change the filename to be "(in-memory
Timo Sirainen <tss@iki.fi>
parents: 5273
diff changeset
873 i_free(index->filepath);
7641e625fbd5 When moving index file to memory, change the filename to be "(in-memory
Timo Sirainen <tss@iki.fi>
parents: 5273
diff changeset
874 index->filepath = i_strdup("(in-memory index)");
7641e625fbd5 When moving index file to memory, change the filename to be "(in-memory
Timo Sirainen <tss@iki.fi>
parents: 5273
diff changeset
875
3912
fc0b638330a4 Added mbox_min_index_size setting.
Timo Sirainen <tss@iki.fi>
parents: 3911
diff changeset
876 if (index->map == NULL) {
5224
c3ab7e621fa6 comment cleanup
Timo Sirainen <tss@iki.fi>
parents: 5212
diff changeset
877 /* index was never even opened. just mark it as being in
3912
fc0b638330a4 Added mbox_min_index_size setting.
Timo Sirainen <tss@iki.fi>
parents: 3911
diff changeset
878 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
879 i_assert(index->fd == -1);
fc0b638330a4 Added mbox_min_index_size setting.
Timo Sirainen <tss@iki.fi>
parents: 3911
diff changeset
880 return -1;
fc0b638330a4 Added mbox_min_index_size setting.
Timo Sirainen <tss@iki.fi>
parents: 3911
diff changeset
881 }
fc0b638330a4 Added mbox_min_index_size setting.
Timo Sirainen <tss@iki.fi>
parents: 3911
diff changeset
882
3911
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
883 /* move index map to memory */
5278
d569caa88a66 If we run out of disk space, move to in-memory indexes.
Timo Sirainen <tss@iki.fi>
parents: 5274
diff changeset
884 if (!MAIL_INDEX_MAP_IS_IN_MEMORY(index->map)) {
5689
c2362f144f15 Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents: 5686
diff changeset
885 map = mail_index_map_clone(index->map);
5853
d9f319a9d6e0 mail_index_map now contains pointer to index, so all functions taking map
Timo Sirainen <tss@iki.fi>
parents: 5827
diff changeset
886 mail_index_unmap(&index->map);
5278
d569caa88a66 If we run out of disk space, move to in-memory indexes.
Timo Sirainen <tss@iki.fi>
parents: 5274
diff changeset
887 index->map = map;
d569caa88a66 If we run out of disk space, move to in-memory indexes.
Timo Sirainen <tss@iki.fi>
parents: 5274
diff changeset
888 }
3911
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
889
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
890 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
891 /* move transaction log to memory */
5714
dcf5dbb6a76a mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents: 5689
diff changeset
892 mail_transaction_log_move_to_memory(index->log);
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
893 }
3911
3a2fe49912f3 Fixed mail_index_move_to_memory() to work better and made it public
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
894
6022
8da2881df0dc mail_index_move_to_memory(): Don't log an error if index fd is already closed
Timo Sirainen <tss@iki.fi>
parents: 5976
diff changeset
895 if (index->fd != -1) {
8da2881df0dc mail_index_move_to_memory(): Don't log an error if index fd is already closed
Timo Sirainen <tss@iki.fi>
parents: 5976
diff changeset
896 if (close(index->fd) < 0)
8da2881df0dc mail_index_move_to_memory(): Don't log an error if index fd is already closed
Timo Sirainen <tss@iki.fi>
parents: 5976
diff changeset
897 mail_index_set_syscall_error(index, "close()");
8da2881df0dc mail_index_move_to_memory(): Don't log an error if index fd is already closed
Timo Sirainen <tss@iki.fi>
parents: 5976
diff changeset
898 index->fd = -1;
8da2881df0dc mail_index_move_to_memory(): Don't log an error if index fd is already closed
Timo Sirainen <tss@iki.fi>
parents: 5976
diff changeset
899 }
5714
dcf5dbb6a76a mail_transaction_log_move_to_memory() can't fail anymore. Moved the code to
Timo Sirainen <tss@iki.fi>
parents: 5689
diff changeset
900 return 0;
3833
318c70c1d4ec Beginnings of fallbacking to in-memory indexes when write fails with "out of
Timo Sirainen <tss@iki.fi>
parents: 3832
diff changeset
901 }
318c70c1d4ec Beginnings of fallbacking to in-memory indexes when write fails with "out of
Timo Sirainen <tss@iki.fi>
parents: 3832
diff changeset
902
1945
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
903 void mail_index_mark_corrupted(struct mail_index *index)
1943
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
904 {
5820
e59892590a02 Handle losing index file better. Handle fsck better.
Timo Sirainen <tss@iki.fi>
parents: 5819
diff changeset
905 index->indexid = 0;
1945
268a4096e8be cleanup
Timo Sirainen <tss@iki.fi>
parents: 1943
diff changeset
906
5772
002aa9bbfcb2 Removed index->hdr. Use index->map->hdr instead.
Timo Sirainen <tss@iki.fi>
parents: 5714
diff changeset
907 index->map->hdr.flags |= MAIL_INDEX_HDR_FLAG_CORRUPTED;
10006
a425ba46a64c lib-index: Take MAIL_INDEX_OPEN_FLAG_READONLY more seriously.
Timo Sirainen <tss@iki.fi>
parents: 9950
diff changeset
908 if (!index->readonly) {
a425ba46a64c lib-index: Take MAIL_INDEX_OPEN_FLAG_READONLY more seriously.
Timo Sirainen <tss@iki.fi>
parents: 9950
diff changeset
909 if (unlink(index->filepath) < 0 &&
a425ba46a64c lib-index: Take MAIL_INDEX_OPEN_FLAG_READONLY more seriously.
Timo Sirainen <tss@iki.fi>
parents: 9950
diff changeset
910 errno != ENOENT && errno != ESTALE)
a425ba46a64c lib-index: Take MAIL_INDEX_OPEN_FLAG_READONLY more seriously.
Timo Sirainen <tss@iki.fi>
parents: 9950
diff changeset
911 mail_index_set_syscall_error(index, "unlink()");
13379
7b240ecc37b5 lib-index: When marking index corrupted, delete also transaction log file.
Timo Sirainen <tss@iki.fi>
parents: 13327
diff changeset
912 (void)mail_transaction_log_unlink(index->log);
10006
a425ba46a64c lib-index: Take MAIL_INDEX_OPEN_FLAG_READONLY more seriously.
Timo Sirainen <tss@iki.fi>
parents: 9950
diff changeset
913 }
1943
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
914 }
e473d2df21be missing index file fixes
Timo Sirainen <tss@iki.fi>
parents: 1942
diff changeset
915
10655
fc0ac73f0b36 Added support for marking mailbox index deleted. Don't allow any changes after that.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
916 bool mail_index_is_deleted(struct mail_index *index)
fc0ac73f0b36 Added support for marking mailbox index deleted. Don't allow any changes after that.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
917 {
10674
22354f505277 lib-index: Added support for undeleting a deleted index.
Timo Sirainen <tss@iki.fi>
parents: 10656
diff changeset
918 return index->index_delete_requested || index->index_deleted;
10655
fc0ac73f0b36 Added support for marking mailbox index deleted. Don't allow any changes after that.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
919 }
fc0ac73f0b36 Added support for marking mailbox index deleted. Don't allow any changes after that.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
920
10722
31aca1df525b lib-index: Added mail_index_get_modification_time().
Timo Sirainen <tss@iki.fi>
parents: 10686
diff changeset
921 int mail_index_get_modification_time(struct mail_index *index, time_t *mtime_r)
31aca1df525b lib-index: Added mail_index_get_modification_time().
Timo Sirainen <tss@iki.fi>
parents: 10686
diff changeset
922 {
31aca1df525b lib-index: Added mail_index_get_modification_time().
Timo Sirainen <tss@iki.fi>
parents: 10686
diff changeset
923 struct stat st;
22362
5e665ab8487c lib-index: Fix mail_index_get_modification_time() to work when index isn't open.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22361
diff changeset
924 const char *path;
10722
31aca1df525b lib-index: Added mail_index_get_modification_time().
Timo Sirainen <tss@iki.fi>
parents: 10686
diff changeset
925
22362
5e665ab8487c lib-index: Fix mail_index_get_modification_time() to work when index isn't open.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22361
diff changeset
926 *mtime_r = 0;
5e665ab8487c lib-index: Fix mail_index_get_modification_time() to work when index isn't open.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22361
diff changeset
927 if (MAIL_INDEX_IS_IN_MEMORY(index)) {
5e665ab8487c lib-index: Fix mail_index_get_modification_time() to work when index isn't open.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22361
diff changeset
928 /* this function doesn't make sense for in-memory indexes */
5e665ab8487c lib-index: Fix mail_index_get_modification_time() to work when index isn't open.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22361
diff changeset
929 return 0;
5e665ab8487c lib-index: Fix mail_index_get_modification_time() to work when index isn't open.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22361
diff changeset
930 }
10722
31aca1df525b lib-index: Added mail_index_get_modification_time().
Timo Sirainen <tss@iki.fi>
parents: 10686
diff changeset
931
22362
5e665ab8487c lib-index: Fix mail_index_get_modification_time() to work when index isn't open.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22361
diff changeset
932 /* index may not be open, so index->filepath may be NULL */
5e665ab8487c lib-index: Fix mail_index_get_modification_time() to work when index isn't open.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22361
diff changeset
933 path = t_strconcat(index->dir, "/", index->prefix,
5e665ab8487c lib-index: Fix mail_index_get_modification_time() to work when index isn't open.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22361
diff changeset
934 MAIL_TRANSACTION_LOG_SUFFIX, NULL);
5e665ab8487c lib-index: Fix mail_index_get_modification_time() to work when index isn't open.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22361
diff changeset
935 if (stat(path, &st) < 0) {
5e665ab8487c lib-index: Fix mail_index_get_modification_time() to work when index isn't open.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22361
diff changeset
936 if (errno == ENOENT) {
5e665ab8487c lib-index: Fix mail_index_get_modification_time() to work when index isn't open.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22361
diff changeset
937 /* .log is always supposed to exist - don't bother
5e665ab8487c lib-index: Fix mail_index_get_modification_time() to work when index isn't open.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22361
diff changeset
938 trying to stat(dovecot.index) */
5e665ab8487c lib-index: Fix mail_index_get_modification_time() to work when index isn't open.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22361
diff changeset
939 return 0;
10722
31aca1df525b lib-index: Added mail_index_get_modification_time().
Timo Sirainen <tss@iki.fi>
parents: 10686
diff changeset
940 }
22362
5e665ab8487c lib-index: Fix mail_index_get_modification_time() to work when index isn't open.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22361
diff changeset
941 mail_index_file_set_syscall_error(index, path, "stat()");
5e665ab8487c lib-index: Fix mail_index_get_modification_time() to work when index isn't open.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22361
diff changeset
942 return -1;
10722
31aca1df525b lib-index: Added mail_index_get_modification_time().
Timo Sirainen <tss@iki.fi>
parents: 10686
diff changeset
943 }
22362
5e665ab8487c lib-index: Fix mail_index_get_modification_time() to work when index isn't open.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 22361
diff changeset
944 *mtime_r = st.st_mtime;
10722
31aca1df525b lib-index: Added mail_index_get_modification_time().
Timo Sirainen <tss@iki.fi>
parents: 10686
diff changeset
945 return 0;
31aca1df525b lib-index: Added mail_index_get_modification_time().
Timo Sirainen <tss@iki.fi>
parents: 10686
diff changeset
946 }
31aca1df525b lib-index: Added mail_index_get_modification_time().
Timo Sirainen <tss@iki.fi>
parents: 10686
diff changeset
947
9420
c496f137c843 index: Handle better errors where a new file's group can't be changed.
Timo Sirainen <tss@iki.fi>
parents: 9394
diff changeset
948 void mail_index_fchown(struct mail_index *index, int fd, const char *path)
c496f137c843 index: Handle better errors where a new file's group can't be changed.
Timo Sirainen <tss@iki.fi>
parents: 9394
diff changeset
949 {
c496f137c843 index: Handle better errors where a new file's group can't be changed.
Timo Sirainen <tss@iki.fi>
parents: 9394
diff changeset
950 mode_t mode;
c496f137c843 index: Handle better errors where a new file's group can't be changed.
Timo Sirainen <tss@iki.fi>
parents: 9394
diff changeset
951
c496f137c843 index: Handle better errors where a new file's group can't be changed.
Timo Sirainen <tss@iki.fi>
parents: 9394
diff changeset
952 if (index->gid == (gid_t)-1) {
c496f137c843 index: Handle better errors where a new file's group can't be changed.
Timo Sirainen <tss@iki.fi>
parents: 9394
diff changeset
953 /* no gid changing */
c496f137c843 index: Handle better errors where a new file's group can't be changed.
Timo Sirainen <tss@iki.fi>
parents: 9394
diff changeset
954 return;
c496f137c843 index: Handle better errors where a new file's group can't be changed.
Timo Sirainen <tss@iki.fi>
parents: 9394
diff changeset
955 } else if (fchown(fd, (uid_t)-1, index->gid) == 0) {
c496f137c843 index: Handle better errors where a new file's group can't be changed.
Timo Sirainen <tss@iki.fi>
parents: 9394
diff changeset
956 /* success */
c496f137c843 index: Handle better errors where a new file's group can't be changed.
Timo Sirainen <tss@iki.fi>
parents: 9394
diff changeset
957 return;
9421
14ed9ca980d1 More group permission handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 9420
diff changeset
958 } if ((index->mode & 0060) >> 3 == (index->mode & 0006)) {
14ed9ca980d1 More group permission handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 9420
diff changeset
959 /* group and world permissions are the same, so group doesn't
14ed9ca980d1 More group permission handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 9420
diff changeset
960 really matter. ignore silently. */
9420
c496f137c843 index: Handle better errors where a new file's group can't be changed.
Timo Sirainen <tss@iki.fi>
parents: 9394
diff changeset
961 return;
c496f137c843 index: Handle better errors where a new file's group can't be changed.
Timo Sirainen <tss@iki.fi>
parents: 9394
diff changeset
962 }
9698
37bdd5ce828f mail_index_chown(): Check for fchown() failing with EPERM, not EACCES.
Timo Sirainen <tss@iki.fi>
parents: 9696
diff changeset
963 if (errno != EPERM)
9537
b373de4973cd Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9535
diff changeset
964 mail_index_file_set_syscall_error(index, path, "fchown()");
b373de4973cd Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9535
diff changeset
965 else {
b373de4973cd Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9535
diff changeset
966 mail_index_set_error(index, "%s",
b373de4973cd Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9535
diff changeset
967 eperm_error_get_chgrp("fchown", path, index->gid,
b373de4973cd Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9535
diff changeset
968 index->gid_origin));
b373de4973cd Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9535
diff changeset
969 }
9421
14ed9ca980d1 More group permission handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 9420
diff changeset
970
14ed9ca980d1 More group permission handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 9420
diff changeset
971 /* continue, but change permissions so that only the common
14ed9ca980d1 More group permission handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 9420
diff changeset
972 subset of group and world is used. this makes sure no one
14ed9ca980d1 More group permission handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 9420
diff changeset
973 gets any extra permissions. */
14ed9ca980d1 More group permission handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 9420
diff changeset
974 mode = ((index->mode & 0060) >> 3) & (index->mode & 0006);
14ed9ca980d1 More group permission handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 9420
diff changeset
975 mode |= (mode << 3) | (index->mode & 0600);
14ed9ca980d1 More group permission handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 9420
diff changeset
976 if (fchmod(fd, mode) < 0)
14ed9ca980d1 More group permission handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 9420
diff changeset
977 mail_index_file_set_syscall_error(index, path, "fchmod()");
9420
c496f137c843 index: Handle better errors where a new file's group can't be changed.
Timo Sirainen <tss@iki.fi>
parents: 9394
diff changeset
978 }
c496f137c843 index: Handle better errors where a new file's group can't be changed.
Timo Sirainen <tss@iki.fi>
parents: 9394
diff changeset
979
14682
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
980 void mail_index_set_syscall_error(struct mail_index *index,
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
981 const char *function)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
982 {
14682
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
983 mail_index_file_set_syscall_error(index, index->filepath, function);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
984 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
985
14682
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
986 void mail_index_file_set_syscall_error(struct mail_index *index,
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
987 const char *filepath,
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
988 const char *function)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
989 {
10686
442c980d6221 lib-index: Fixed logging file creation EACCES failures.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
990 const char *errstr;
442c980d6221 lib-index: Fixed logging file creation EACCES failures.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
991
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
992 i_assert(filepath != NULL);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
993 i_assert(function != NULL);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
994
22361
73479718bc0b lib-index: Mark index deleted if index log file is missing
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21390
diff changeset
995 if (errno == ENOENT) {
73479718bc0b lib-index: Mark index deleted if index log file is missing
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21390
diff changeset
996 struct stat st;
73479718bc0b lib-index: Mark index deleted if index log file is missing
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21390
diff changeset
997 int old_errno = errno;
73479718bc0b lib-index: Mark index deleted if index log file is missing
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21390
diff changeset
998 i_assert(index->log->filepath != NULL);
73479718bc0b lib-index: Mark index deleted if index log file is missing
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21390
diff changeset
999 if (nfs_safe_stat(index->log->filepath, &st) < 0 &&
73479718bc0b lib-index: Mark index deleted if index log file is missing
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21390
diff changeset
1000 errno == ENOENT) {
73479718bc0b lib-index: Mark index deleted if index log file is missing
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21390
diff changeset
1001 /* the index log has gone away */
73479718bc0b lib-index: Mark index deleted if index log file is missing
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21390
diff changeset
1002 index->index_deleted = TRUE;
73479718bc0b lib-index: Mark index deleted if index log file is missing
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21390
diff changeset
1003 errno = old_errno;
73479718bc0b lib-index: Mark index deleted if index log file is missing
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21390
diff changeset
1004 return;
73479718bc0b lib-index: Mark index deleted if index log file is missing
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21390
diff changeset
1005 }
73479718bc0b lib-index: Mark index deleted if index log file is missing
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21390
diff changeset
1006 errno = old_errno;
73479718bc0b lib-index: Mark index deleted if index log file is missing
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21390
diff changeset
1007 }
73479718bc0b lib-index: Mark index deleted if index log file is missing
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21390
diff changeset
1008
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1009 if (ENOSPACE(errno)) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1010 index->nodiskspace = TRUE;
9696
126132cb1c19 index: Removed duplication of mail_index_open_flags from struct mail_index.
Timo Sirainen <tss@iki.fi>
parents: 9614
diff changeset
1011 if ((index->flags & MAIL_INDEX_OPEN_FLAG_NEVER_IN_MEMORY) == 0)
14682
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
1012 return;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1013 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1014
9535
bbe4c24faf21 Use eacces_get_error() in more places for handling EACCES errors.
Timo Sirainen <tss@iki.fi>
parents: 9421
diff changeset
1015 if (errno == EACCES) {
10686
442c980d6221 lib-index: Fixed logging file creation EACCES failures.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
1016 function = t_strcut(function, '(');
442c980d6221 lib-index: Fixed logging file creation EACCES failures.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
1017 if (strcmp(function, "creat") == 0 ||
442c980d6221 lib-index: Fixed logging file creation EACCES failures.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
1018 strncmp(function, "file_dotlock_", 13) == 0)
442c980d6221 lib-index: Fixed logging file creation EACCES failures.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
1019 errstr = eacces_error_get_creating(function, filepath);
442c980d6221 lib-index: Fixed logging file creation EACCES failures.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
1020 else
442c980d6221 lib-index: Fixed logging file creation EACCES failures.
Timo Sirainen <tss@iki.fi>
parents: 10677
diff changeset
1021 errstr = eacces_error_get(function, filepath);
14682
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
1022 mail_index_set_error(index, "%s", errstr);
9535
bbe4c24faf21 Use eacces_get_error() in more places for handling EACCES errors.
Timo Sirainen <tss@iki.fi>
parents: 9421
diff changeset
1023 } else {
12009
706f30fa4028 lib-index: Give a clearer error message for syscall failing with EFBIG.
Timo Sirainen <tss@iki.fi>
parents: 12008
diff changeset
1024 const char *suffix = errno != EFBIG ? "" :
706f30fa4028 lib-index: Give a clearer error message for syscall failing with EFBIG.
Timo Sirainen <tss@iki.fi>
parents: 12008
diff changeset
1025 " (process was started with ulimit -f limit)";
14682
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
1026 mail_index_set_error(index, "%s failed with file %s: "
d0d7b810646b Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
1027 "%m%s", function, filepath, suffix);
9535
bbe4c24faf21 Use eacces_get_error() in more places for handling EACCES errors.
Timo Sirainen <tss@iki.fi>
parents: 9421
diff changeset
1028 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1029 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1030
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1031 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
1032 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1033 return index->error;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1034 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1035
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1036 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
1037 {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1038 if (index->error != NULL) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1039 i_free(index->error);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1040 index->error = NULL;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1041 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1042
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1043 index->nodiskspace = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1044 index->index_lock_timeout = FALSE;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1045 }