Mercurial > dovecot > core-2.2
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 |
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 | 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 | 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 | 53 |
5028 | 54 index->extension_pool = |
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 | 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 | 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 | 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 | 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 | 220 if (mail_index_ext_lookup(index, name, &ext_id)) |
221 return ext_id; | |
2116 | 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 | 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 | 231 return rext.index_idx; |
232 } | |
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 | 248 bool mail_index_ext_lookup(struct mail_index *index, const char *name, |
249 uint32_t *ext_id_r) | |
250 { | |
251 const struct mail_index_registered_ext *extensions; | |
252 unsigned int i, count; | |
253 | |
254 extensions = array_get(&index->extensions, &count); | |
255 for (i = 0; i < count; i++) { | |
256 if (strcmp(extensions[i].name, name) == 0) { | |
257 *ext_id_r = i; | |
258 return TRUE; | |
259 } | |
260 } | |
261 | |
262 *ext_id_r = (uint32_t)-1; | |
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 | 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 | 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 | 568 /* if dovecot.index exists, read it first so that we can get |
569 the correct indexid and log sequence */ | |
570 (void)mail_index_try_open(index); | |
571 | |
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 | 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 | 579 } |
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 | 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 | 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 | 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 | 717 |
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 | 737 int mail_index_unlink(struct mail_index *index) |
738 { | |
739 const char *path; | |
740 int last_errno = 0; | |
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 | 743 return 0; |
744 | |
745 /* main index */ | |
746 if (unlink(index->filepath) < 0 && errno != ENOENT) | |
747 last_errno = errno; | |
748 | |
749 /* logs */ | |
750 path = t_strconcat(index->filepath, MAIL_TRANSACTION_LOG_SUFFIX, NULL); | |
751 if (unlink(path) < 0 && errno != ENOENT) | |
752 last_errno = errno; | |
753 | |
754 path = t_strconcat(index->filepath, | |
755 MAIL_TRANSACTION_LOG_SUFFIX".2", NULL); | |
756 if (unlink(path) < 0 && errno != ENOENT) | |
757 last_errno = errno; | |
758 | |
759 /* cache */ | |
760 path = t_strconcat(index->filepath, MAIL_CACHE_FILE_SUFFIX, NULL); | |
761 if (unlink(path) < 0 && errno != ENOENT) | |
762 last_errno = errno; | |
763 | |
764 if (last_errno == 0) | |
765 return 0; | |
766 else { | |
767 errno = last_errno; | |
768 return -1; | |
769 } | |
770 } | |
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 | 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 | 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 | 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 | 903 void mail_index_mark_corrupted(struct mail_index *index) |
1943 | 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 | 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 | 914 } |
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 } |