Mercurial > dovecot > core-2.2
annotate src/lib-storage/index/dbox-multi/mdbox-storage.c @ 22713:cb108f786fb4
Updated copyright notices to include the year 2018.
author | Stephan Bosch <stephan.bosch@dovecot.fi> |
---|---|
date | Mon, 01 Jan 2018 22:42:08 +0100 |
parents | d86a691543b4 |
children |
rev | line source |
---|---|
22713
cb108f786fb4
Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
22301
diff
changeset
|
1 /* Copyright (c) 2007-2018 Dovecot authors, see the included COPYING file */ |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "array.h" |
10877 | 5 #include "ioloop.h" |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "mkdir-parents.h" |
11132
3d585e69aa95
dbox: Use flock() for file locking if possible. If not, require client_limit=1.
Timo Sirainen <tss@iki.fi>
parents:
11127
diff
changeset
|
7 #include "master-service.h" |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "mail-index-modseq.h" |
10676
1fd7833c16ca
lib-storage: Mailbox deletion API changed.
Timo Sirainen <tss@iki.fi>
parents:
10662
diff
changeset
|
9 #include "mail-index-alloc-cache.h" |
1fd7833c16ca
lib-storage: Mailbox deletion API changed.
Timo Sirainen <tss@iki.fi>
parents:
10662
diff
changeset
|
10 #include "mailbox-log.h" |
11476
3e51c846f293
Avoid including mailbox-list-private.h everywhere.
Timo Sirainen <tss@iki.fi>
parents:
11218
diff
changeset
|
11 #include "mailbox-list-private.h" |
20522
2c0956060e6d
dbox: Initialize pop3-uidl header on INBOX creation.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
12 #include "index-pop3-uidl.h" |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 #include "dbox-mail.h" |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #include "dbox-save.h" |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 #include "mdbox-map.h" |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 #include "mdbox-file.h" |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 #include "mdbox-sync.h" |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 #include "mdbox-storage-rebuild.h" |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 #include "mdbox-storage.h" |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 extern struct mail_storage mdbox_storage; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 extern struct mailbox mdbox_mailbox; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 static struct mail_storage *mdbox_storage_alloc(void) |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 struct mdbox_storage *storage; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 pool_t pool; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 |
10684
e202b2b86702
Increased initial memory pool sizes.
Timo Sirainen <tss@iki.fi>
parents:
10676
diff
changeset
|
29 pool = pool_alloconly_create("mdbox storage", 2048); |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 storage = p_new(pool, struct mdbox_storage, 1); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 storage->storage.v = mdbox_dbox_storage_vfuncs; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 storage->storage.storage = mdbox_storage; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 storage->storage.storage.pool = pool; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 return &storage->storage.storage; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 |
16895
c238c55479c8
mdbox: Added "mdbox_deleted" storage, which can be used to access messages with refcount=0
Timo Sirainen <tss@iki.fi>
parents:
16781
diff
changeset
|
37 int mdbox_storage_create(struct mail_storage *_storage, |
c238c55479c8
mdbox: Added "mdbox_deleted" storage, which can be used to access messages with refcount=0
Timo Sirainen <tss@iki.fi>
parents:
16781
diff
changeset
|
38 struct mail_namespace *ns, const char **error_r) |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 struct mdbox_storage *storage = (struct mdbox_storage *)_storage; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 const char *dir; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 |
21152
5fbe42215594
lib-storage: Add mail_namespace_get_driver_settings() and use it.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20766
diff
changeset
|
43 storage->set = mail_namespace_get_driver_settings(ns, _storage); |
12320
b884441a713f
mdbox: Added mdbox_preallocate_space setting to preallocate size for newly created files.
Timo Sirainen <tss@iki.fi>
parents:
12312
diff
changeset
|
44 storage->preallocate_space = storage->set->mdbox_preallocate_space; |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 if (*ns->list->set.mailbox_dir_name == '\0') { |
11217
6e1bbf87749f
mdbox: Changed error messages to contain "mdbox" prefix instead of "dbox".
Timo Sirainen <tss@iki.fi>
parents:
11216
diff
changeset
|
47 *error_r = "mdbox: MAILBOXDIR must not be empty"; |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 return -1; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 _storage->unique_root_dir = |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 p_strdup(_storage->pool, ns->list->set.root_dir); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 |
15163
c7a99d41e39e
lib-storage: mailbox_get_path() and friends can now return an error.
Timo Sirainen <tss@iki.fi>
parents:
15162
diff
changeset
|
54 dir = mailbox_list_get_root_forced(ns->list, MAILBOX_LIST_PATH_TYPE_DIR); |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 storage->storage_dir = p_strconcat(_storage->pool, dir, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 "/"MDBOX_GLOBAL_DIR_NAME, NULL); |
21355
788bd1e04e3d
storage: do NOT feed p_strconcat() with NULL.
Baofeng <baofeng.wang@dovecot.com>
parents:
21225
diff
changeset
|
57 if (ns->list->set.alt_dir != NULL) { |
788bd1e04e3d
storage: do NOT feed p_strconcat() with NULL.
Baofeng <baofeng.wang@dovecot.com>
parents:
21225
diff
changeset
|
58 storage->alt_storage_dir = p_strconcat(_storage->pool, |
788bd1e04e3d
storage: do NOT feed p_strconcat() with NULL.
Baofeng <baofeng.wang@dovecot.com>
parents:
21225
diff
changeset
|
59 ns->list->set.alt_dir, |
788bd1e04e3d
storage: do NOT feed p_strconcat() with NULL.
Baofeng <baofeng.wang@dovecot.com>
parents:
21225
diff
changeset
|
60 "/"MDBOX_GLOBAL_DIR_NAME, NULL); |
788bd1e04e3d
storage: do NOT feed p_strconcat() with NULL.
Baofeng <baofeng.wang@dovecot.com>
parents:
21225
diff
changeset
|
61 } |
10868
863eafcf8428
mdbox: Removed mdbox_max_open_files setting.
Timo Sirainen <tss@iki.fi>
parents:
10805
diff
changeset
|
62 i_array_init(&storage->open_files, 64); |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 |
12135
012a1773ebfd
mdbox: If :INDEX=path is specified, keep storage indexes there also.
Timo Sirainen <tss@iki.fi>
parents:
11707
diff
changeset
|
64 storage->map = mdbox_map_init(storage, ns->list); |
12312
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
12177
diff
changeset
|
65 return dbox_storage_create(_storage, ns, error_r); |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 |
16895
c238c55479c8
mdbox: Added "mdbox_deleted" storage, which can be used to access messages with refcount=0
Timo Sirainen <tss@iki.fi>
parents:
16781
diff
changeset
|
68 void mdbox_storage_destroy(struct mail_storage *_storage) |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 struct mdbox_storage *storage = (struct mdbox_storage *)_storage; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 mdbox_files_free(storage); |
11218
ac62dbb6a355
mdbox: Renamed dbox_map* to mdbox_map*.
Timo Sirainen <tss@iki.fi>
parents:
11217
diff
changeset
|
73 mdbox_map_deinit(&storage->map); |
10868
863eafcf8428
mdbox: Removed mdbox_max_open_files setting.
Timo Sirainen <tss@iki.fi>
parents:
10805
diff
changeset
|
74 if (storage->to_close_unused_files != NULL) |
863eafcf8428
mdbox: Removed mdbox_max_open_files setting.
Timo Sirainen <tss@iki.fi>
parents:
10805
diff
changeset
|
75 timeout_remove(&storage->to_close_unused_files); |
11177
a92389387cb7
mdbox: Moving messages to alt storage is done done with doveadm altmove command.
Timo Sirainen <tss@iki.fi>
parents:
11170
diff
changeset
|
76 |
a92389387cb7
mdbox: Moving messages to alt storage is done done with doveadm altmove command.
Timo Sirainen <tss@iki.fi>
parents:
11170
diff
changeset
|
77 if (array_is_created(&storage->move_from_alt_map_uids)) |
a92389387cb7
mdbox: Moving messages to alt storage is done done with doveadm altmove command.
Timo Sirainen <tss@iki.fi>
parents:
11170
diff
changeset
|
78 array_free(&storage->move_from_alt_map_uids); |
a92389387cb7
mdbox: Moving messages to alt storage is done done with doveadm altmove command.
Timo Sirainen <tss@iki.fi>
parents:
11170
diff
changeset
|
79 if (array_is_created(&storage->move_to_alt_map_uids)) |
a92389387cb7
mdbox: Moving messages to alt storage is done done with doveadm altmove command.
Timo Sirainen <tss@iki.fi>
parents:
11170
diff
changeset
|
80 array_free(&storage->move_to_alt_map_uids); |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 array_free(&storage->open_files); |
12312
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
12177
diff
changeset
|
82 dbox_storage_destroy(_storage); |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 |
13698
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
85 static const char * |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
86 mdbox_storage_find_root_dir(const struct mail_namespace *ns) |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
87 { |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
88 bool debug = ns->mail_set->mail_debug; |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
89 const char *home, *path; |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
90 |
15120
6b9db780b47d
lib-storage: Don't crash when trying to detect public namespace's mail_location.
Timo Sirainen <tss@iki.fi>
parents:
14564
diff
changeset
|
91 if (ns->owner != NULL && |
6b9db780b47d
lib-storage: Don't crash when trying to detect public namespace's mail_location.
Timo Sirainen <tss@iki.fi>
parents:
14564
diff
changeset
|
92 mail_user_get_home(ns->owner, &home) > 0) { |
13698
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
93 path = t_strconcat(home, "/mdbox", NULL); |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
94 if (access(path, R_OK|W_OK|X_OK) == 0) { |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
95 if (debug) |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
96 i_debug("mdbox: root exists (%s)", path); |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
97 return path; |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
98 } |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
99 if (debug) |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
100 i_debug("mdbox: access(%s, rwx): failed: %m", path); |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
101 } |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
102 return NULL; |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
103 } |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
104 |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
105 static bool mdbox_storage_autodetect(const struct mail_namespace *ns, |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
106 struct mailbox_list_settings *set) |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
107 { |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
108 bool debug = ns->mail_set->mail_debug; |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
109 struct stat st; |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
110 const char *path, *root_dir; |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
111 |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
112 if (set->root_dir != NULL) |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
113 root_dir = set->root_dir; |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
114 else { |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
115 root_dir = mdbox_storage_find_root_dir(ns); |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
116 if (root_dir == NULL) { |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
117 if (debug) |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
118 i_debug("mdbox: couldn't find root dir"); |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
119 return FALSE; |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
120 } |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
121 } |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
122 |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
123 path = t_strconcat(root_dir, "/"MDBOX_GLOBAL_DIR_NAME, NULL); |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
124 if (stat(path, &st) < 0) { |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
125 if (debug) |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
126 i_debug("mdbox autodetect: stat(%s) failed: %m", path); |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
127 return FALSE; |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
128 } |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
129 |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
130 if (!S_ISDIR(st.st_mode)) { |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
131 if (debug) |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
132 i_debug("mdbox autodetect: %s not a directory", path); |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
133 return FALSE; |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
134 } |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
135 |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
136 set->root_dir = root_dir; |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
137 dbox_storage_get_list_settings(ns, set); |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
138 return TRUE; |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
139 } |
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
140 |
12586
a2780b694b2d
lib-storage: mailbox_alloc() now takes a virtual mailbox name and other related API changes.
Timo Sirainen <tss@iki.fi>
parents:
12583
diff
changeset
|
141 static struct mailbox * |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 mdbox_mailbox_alloc(struct mail_storage *storage, struct mailbox_list *list, |
12586
a2780b694b2d
lib-storage: mailbox_alloc() now takes a virtual mailbox name and other related API changes.
Timo Sirainen <tss@iki.fi>
parents:
12583
diff
changeset
|
143 const char *vname, enum mailbox_flags flags) |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 struct mdbox_mailbox *mbox; |
10660
56b1d4dd9c7d
lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents:
10657
diff
changeset
|
146 struct index_mailbox_context *ibox; |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 pool_t pool; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 /* dbox can't work without index files */ |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 flags &= ~MAILBOX_FLAG_NO_INDEX_FILES; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 |
10726
44759fb882aa
lib-storage: Increased initial mailbox pool sizes.
Timo Sirainen <tss@iki.fi>
parents:
10719
diff
changeset
|
152 pool = pool_alloconly_create("mdbox mailbox", 1024*3); |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 mbox = p_new(pool, struct mdbox_mailbox, 1); |
10660
56b1d4dd9c7d
lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents:
10657
diff
changeset
|
154 mbox->box = mdbox_mailbox; |
56b1d4dd9c7d
lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents:
10657
diff
changeset
|
155 mbox->box.pool = pool; |
56b1d4dd9c7d
lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents:
10657
diff
changeset
|
156 mbox->box.storage = storage; |
56b1d4dd9c7d
lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents:
10657
diff
changeset
|
157 mbox->box.list = list; |
56b1d4dd9c7d
lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents:
10657
diff
changeset
|
158 mbox->box.mail_vfuncs = &mdbox_mail_vfuncs; |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 |
15341
15dfd6475f64
Replaced *_INDEX_PREFIX macros with a common MAIL_INDEX_PREFIX.
Timo Sirainen <tss@iki.fi>
parents:
15224
diff
changeset
|
160 index_storage_mailbox_alloc(&mbox->box, vname, flags, MAIL_INDEX_PREFIX); |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 |
10660
56b1d4dd9c7d
lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents:
10657
diff
changeset
|
162 ibox = INDEX_STORAGE_CONTEXT(&mbox->box); |
56b1d4dd9c7d
lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents:
10657
diff
changeset
|
163 ibox->index_flags |= MAIL_INDEX_OPEN_FLAG_KEEP_BACKUPS | |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 MAIL_INDEX_OPEN_FLAG_NEVER_IN_MEMORY; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 mbox->storage = (struct mdbox_storage *)storage; |
12521
b22766c1aa51
lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents:
12520
diff
changeset
|
167 return &mbox->box; |
b22766c1aa51
lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents:
12520
diff
changeset
|
168 } |
b22766c1aa51
lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents:
12520
diff
changeset
|
169 |
16895
c238c55479c8
mdbox: Added "mdbox_deleted" storage, which can be used to access messages with refcount=0
Timo Sirainen <tss@iki.fi>
parents:
16781
diff
changeset
|
170 int mdbox_mailbox_open(struct mailbox *box) |
12521
b22766c1aa51
lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents:
12520
diff
changeset
|
171 { |
b22766c1aa51
lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents:
12520
diff
changeset
|
172 struct mdbox_mailbox *mbox = (struct mdbox_mailbox *)box; |
22301
d86a691543b4
dbox: Use mail_index_header.last_temp_file_scan instead of directory's atime
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22291
diff
changeset
|
173 time_t path_ctime; |
12521
b22766c1aa51
lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents:
12520
diff
changeset
|
174 |
22301
d86a691543b4
dbox: Use mail_index_header.last_temp_file_scan instead of directory's atime
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22291
diff
changeset
|
175 if (dbox_mailbox_check_existence(box, &path_ctime) < 0) |
22291
5a81b1690625
sdbox: Don't create index directory when trying to open nonexistent mailboxes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21390
diff
changeset
|
176 return -1; |
22301
d86a691543b4
dbox: Use mail_index_header.last_temp_file_scan instead of directory's atime
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
22291
diff
changeset
|
177 if (dbox_mailbox_open(box, path_ctime) < 0) |
12521
b22766c1aa51
lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents:
12520
diff
changeset
|
178 return -1; |
b22766c1aa51
lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents:
12520
diff
changeset
|
179 |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 mbox->ext_id = |
10660
56b1d4dd9c7d
lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents:
10657
diff
changeset
|
181 mail_index_ext_register(mbox->box.index, "mdbox", 0, |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 sizeof(struct mdbox_mail_index_record), |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 sizeof(uint32_t)); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 mbox->hdr_ext_id = |
10660
56b1d4dd9c7d
lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents:
10657
diff
changeset
|
185 mail_index_ext_register(mbox->box.index, "mdbox-hdr", |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 sizeof(struct mdbox_index_header), 0, 0); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 mbox->guid_ext_id = |
10660
56b1d4dd9c7d
lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents:
10657
diff
changeset
|
188 mail_index_ext_register(mbox->box.index, "guid", |
13287
957060ca5b69
Moved GUID code to liblib. Use guid_128_t type consistently everywhere.
Timo Sirainen <tss@iki.fi>
parents:
12981
diff
changeset
|
189 0, GUID_128_SIZE, 1); |
12521
b22766c1aa51
lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents:
12520
diff
changeset
|
190 return 0; |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 |
10975
52d9b2d8c1e8
mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents:
10877
diff
changeset
|
193 static void mdbox_mailbox_close(struct mailbox *box) |
52d9b2d8c1e8
mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents:
10877
diff
changeset
|
194 { |
52d9b2d8c1e8
mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents:
10877
diff
changeset
|
195 struct mdbox_storage *mstorage = (struct mdbox_storage *)box->storage; |
52d9b2d8c1e8
mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents:
10877
diff
changeset
|
196 |
11216
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
197 if (mstorage->corrupted && !mstorage->rebuilding_storage) |
10975
52d9b2d8c1e8
mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents:
10877
diff
changeset
|
198 (void)mdbox_storage_rebuild(mstorage); |
52d9b2d8c1e8
mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents:
10877
diff
changeset
|
199 |
52d9b2d8c1e8
mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents:
10877
diff
changeset
|
200 index_storage_mailbox_close(box); |
52d9b2d8c1e8
mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents:
10877
diff
changeset
|
201 } |
52d9b2d8c1e8
mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents:
10877
diff
changeset
|
202 |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
203 int mdbox_read_header(struct mdbox_mailbox *mbox, |
16403
967ef2a7fa6f
dbox: Don't cache pop3.uidl|order unless index header indicates there are those.
Timo Sirainen <tss@iki.fi>
parents:
16373
diff
changeset
|
204 struct mdbox_index_header *hdr, bool *need_resize_r) |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 const void *data; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 size_t data_size; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 |
15163
c7a99d41e39e
lib-storage: mailbox_get_path() and friends can now return an error.
Timo Sirainen <tss@iki.fi>
parents:
15162
diff
changeset
|
209 i_assert(mbox->box.opened); |
c7a99d41e39e
lib-storage: mailbox_get_path() and friends can now return an error.
Timo Sirainen <tss@iki.fi>
parents:
15162
diff
changeset
|
210 |
10660
56b1d4dd9c7d
lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents:
10657
diff
changeset
|
211 mail_index_get_header_ext(mbox->box.view, mbox->hdr_ext_id, |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
212 &data, &data_size); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 if (data_size < MDBOX_INDEX_HEADER_MIN_SIZE && |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 (!mbox->creating || data_size != 0)) { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 mail_storage_set_critical(&mbox->storage->storage.storage, |
11217
6e1bbf87749f
mdbox: Changed error messages to contain "mdbox" prefix instead of "dbox".
Timo Sirainen <tss@iki.fi>
parents:
11216
diff
changeset
|
216 "mdbox %s: Invalid dbox header size: %"PRIuSIZE_T, |
12520
b26d6da05d48
lib-storage: Lazily look up mailbox path and permissions. Added functions to get them.
Timo Sirainen <tss@iki.fi>
parents:
12320
diff
changeset
|
217 mailbox_get_path(&mbox->box), data_size); |
11216
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
218 mdbox_storage_set_corrupted(mbox->storage); |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 return -1; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
220 } |
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:
21355
diff
changeset
|
221 i_zero(hdr); |
21213
10a77a6881cd
global: Code cleanup - avoid passing NULL to functions with non-null parameter
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21152
diff
changeset
|
222 if (data_size > 0) |
10a77a6881cd
global: Code cleanup - avoid passing NULL to functions with non-null parameter
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21152
diff
changeset
|
223 memcpy(hdr, data, I_MIN(data_size, sizeof(*hdr))); |
16403
967ef2a7fa6f
dbox: Don't cache pop3.uidl|order unless index header indicates there are those.
Timo Sirainen <tss@iki.fi>
parents:
16373
diff
changeset
|
224 *need_resize_r = data_size < sizeof(*hdr); |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 return 0; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
226 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
227 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
228 void mdbox_update_header(struct mdbox_mailbox *mbox, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 struct mail_index_transaction *trans, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
230 const struct mailbox_update *update) |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
231 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
232 struct mdbox_index_header hdr, new_hdr; |
16403
967ef2a7fa6f
dbox: Don't cache pop3.uidl|order unless index header indicates there are those.
Timo Sirainen <tss@iki.fi>
parents:
16373
diff
changeset
|
233 bool need_resize; |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
234 |
16522
5a429604923c
mdbox: Minor fix to handling corrupted mdbox header.
Timo Sirainen <tss@iki.fi>
parents:
16501
diff
changeset
|
235 if (mdbox_read_header(mbox, &hdr, &need_resize) < 0) { |
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:
21355
diff
changeset
|
236 i_zero(&hdr); |
16533
3056feb418b1
mdbox: If mdbox header is corrupted, resize it to make sure its size is correct.
Timo Sirainen <tss@iki.fi>
parents:
16522
diff
changeset
|
237 need_resize = TRUE; |
16522
5a429604923c
mdbox: Minor fix to handling corrupted mdbox header.
Timo Sirainen <tss@iki.fi>
parents:
16501
diff
changeset
|
238 } |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
239 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
240 new_hdr = hdr; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
241 |
13287
957060ca5b69
Moved GUID code to liblib. Use guid_128_t type consistently everywhere.
Timo Sirainen <tss@iki.fi>
parents:
12981
diff
changeset
|
242 if (update != NULL && !guid_128_is_empty(update->mailbox_guid)) { |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
243 memcpy(new_hdr.mailbox_guid, update->mailbox_guid, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 sizeof(new_hdr.mailbox_guid)); |
13287
957060ca5b69
Moved GUID code to liblib. Use guid_128_t type consistently everywhere.
Timo Sirainen <tss@iki.fi>
parents:
12981
diff
changeset
|
245 } else if (guid_128_is_empty(new_hdr.mailbox_guid)) { |
957060ca5b69
Moved GUID code to liblib. Use guid_128_t type consistently everywhere.
Timo Sirainen <tss@iki.fi>
parents:
12981
diff
changeset
|
246 guid_128_generate(new_hdr.mailbox_guid); |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
247 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
248 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
249 new_hdr.map_uid_validity = |
11218
ac62dbb6a355
mdbox: Renamed dbox_map* to mdbox_map*.
Timo Sirainen <tss@iki.fi>
parents:
11217
diff
changeset
|
250 mdbox_map_get_uid_validity(mbox->storage->map); |
16403
967ef2a7fa6f
dbox: Don't cache pop3.uidl|order unless index header indicates there are those.
Timo Sirainen <tss@iki.fi>
parents:
16373
diff
changeset
|
251 if (need_resize) { |
967ef2a7fa6f
dbox: Don't cache pop3.uidl|order unless index header indicates there are those.
Timo Sirainen <tss@iki.fi>
parents:
16373
diff
changeset
|
252 mail_index_ext_resize_hdr(trans, mbox->hdr_ext_id, |
967ef2a7fa6f
dbox: Don't cache pop3.uidl|order unless index header indicates there are those.
Timo Sirainen <tss@iki.fi>
parents:
16373
diff
changeset
|
253 sizeof(new_hdr)); |
967ef2a7fa6f
dbox: Don't cache pop3.uidl|order unless index header indicates there are those.
Timo Sirainen <tss@iki.fi>
parents:
16373
diff
changeset
|
254 } |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
255 if (memcmp(&hdr, &new_hdr, sizeof(hdr)) != 0) { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
256 mail_index_update_header_ext(trans, mbox->hdr_ext_id, 0, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
257 &new_hdr, sizeof(new_hdr)); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
258 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
259 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
260 |
14629
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14582
diff
changeset
|
261 static int ATTR_NULL(2, 3) |
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14582
diff
changeset
|
262 mdbox_write_index_header(struct mailbox *box, |
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14582
diff
changeset
|
263 const struct mailbox_update *update, |
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14582
diff
changeset
|
264 struct mail_index_transaction *trans) |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
265 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
266 struct mdbox_mailbox *mbox = (struct mdbox_mailbox *)box; |
11484
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11476
diff
changeset
|
267 struct mail_index_transaction *new_trans = NULL; |
14564
7dd1dd742825
mdbox: mailbox_update() didn't look at the latest index data.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
268 struct mail_index_view *view; |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
269 const struct mail_index_header *hdr; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
270 uint32_t uid_validity, uid_next; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 |
11218
ac62dbb6a355
mdbox: Renamed dbox_map* to mdbox_map*.
Timo Sirainen <tss@iki.fi>
parents:
11217
diff
changeset
|
272 if (mdbox_map_open_or_create(mbox->storage->map) < 0) |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
273 return -1; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
274 |
11484
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11476
diff
changeset
|
275 if (trans == NULL) { |
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11476
diff
changeset
|
276 new_trans = mail_index_transaction_begin(box->view, 0); |
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11476
diff
changeset
|
277 trans = new_trans; |
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11476
diff
changeset
|
278 } |
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11476
diff
changeset
|
279 |
14564
7dd1dd742825
mdbox: mailbox_update() didn't look at the latest index data.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
280 view = mail_index_view_open(box->index); |
7dd1dd742825
mdbox: mailbox_update() didn't look at the latest index data.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
281 hdr = mail_index_get_header(view); |
10350
d1d810348e65
mdbox: mailbox_update() was updating uidvalidity to random values.
Timo Sirainen <tss@iki.fi>
parents:
9977
diff
changeset
|
282 uid_validity = hdr->uid_validity; |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
283 if (update != NULL && update->uid_validity != 0) |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
284 uid_validity = update->uid_validity; |
10350
d1d810348e65
mdbox: mailbox_update() was updating uidvalidity to random values.
Timo Sirainen <tss@iki.fi>
parents:
9977
diff
changeset
|
285 else if (uid_validity == 0) { |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
286 /* set uidvalidity */ |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
287 uid_validity = dbox_get_uidvalidity_next(box->list); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
288 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
289 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
290 if (hdr->uid_validity != uid_validity) { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
291 mail_index_update_header(trans, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
292 offsetof(struct mail_index_header, uid_validity), |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
293 &uid_validity, sizeof(uid_validity), TRUE); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
294 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
295 if (update != NULL && hdr->next_uid < update->min_next_uid) { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
296 uid_next = update->min_next_uid; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
297 mail_index_update_header(trans, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
298 offsetof(struct mail_index_header, next_uid), |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
299 &uid_next, sizeof(uid_next), TRUE); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
300 } |
12855
310f2784de31
dbox: Fixed crash on creation of a new mailbox.
Timo Sirainen <tss@iki.fi>
parents:
12852
diff
changeset
|
301 if (update != NULL && update->min_first_recent_uid != 0 && |
12850
08e4c5d0dc9b
lib-storage: Added min_first_recent_uid to struct mailbox_update.
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
302 hdr->first_recent_uid < update->min_first_recent_uid) { |
08e4c5d0dc9b
lib-storage: Added min_first_recent_uid to struct mailbox_update.
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
303 uint32_t first_recent_uid = update->min_first_recent_uid; |
08e4c5d0dc9b
lib-storage: Added min_first_recent_uid to struct mailbox_update.
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
304 |
08e4c5d0dc9b
lib-storage: Added min_first_recent_uid to struct mailbox_update.
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
305 mail_index_update_header(trans, |
08e4c5d0dc9b
lib-storage: Added min_first_recent_uid to struct mailbox_update.
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
306 offsetof(struct mail_index_header, first_recent_uid), |
08e4c5d0dc9b
lib-storage: Added min_first_recent_uid to struct mailbox_update.
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
307 &first_recent_uid, sizeof(first_recent_uid), FALSE); |
08e4c5d0dc9b
lib-storage: Added min_first_recent_uid to struct mailbox_update.
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
308 } |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
309 if (update != NULL && update->min_highest_modseq != 0 && |
14564
7dd1dd742825
mdbox: mailbox_update() didn't look at the latest index data.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
310 mail_index_modseq_get_highest(view) < update->min_highest_modseq) { |
11707
3f9435c616e4
lib-storage: When mailbox_update() sets highest-modseq, make sure modseqs are enabled.
Timo Sirainen <tss@iki.fi>
parents:
11652
diff
changeset
|
311 mail_index_modseq_enable(box->index); |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
312 mail_index_update_highest_modseq(trans, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
313 update->min_highest_modseq); |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
314 } |
14564
7dd1dd742825
mdbox: mailbox_update() didn't look at the latest index data.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
315 mail_index_view_close(&view); |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
316 |
20766
271015c91be5
dbox: mailbox_update() shouldn't reset pop3-uidl header.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20522
diff
changeset
|
317 if (box->inbox_user && box->creating) { |
271015c91be5
dbox: mailbox_update() shouldn't reset pop3-uidl header.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20522
diff
changeset
|
318 /* initialize pop3-uidl header when creating mailbox |
271015c91be5
dbox: mailbox_update() shouldn't reset pop3-uidl header.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20522
diff
changeset
|
319 (not on mailbox_update()) */ |
20522
2c0956060e6d
dbox: Initialize pop3-uidl header on INBOX creation.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
320 index_pop3_uidl_set_max_uid(box, trans, 0); |
20766
271015c91be5
dbox: mailbox_update() shouldn't reset pop3-uidl header.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20522
diff
changeset
|
321 } |
20522
2c0956060e6d
dbox: Initialize pop3-uidl header on INBOX creation.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
322 |
10731
a3ec94b25456
mailbox_update(): Updating uid_validity requires also reseting index.
Timo Sirainen <tss@iki.fi>
parents:
10726
diff
changeset
|
323 mdbox_update_header(mbox, trans, update); |
11484
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11476
diff
changeset
|
324 if (new_trans != NULL) { |
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11476
diff
changeset
|
325 if (mail_index_transaction_commit(&new_trans) < 0) { |
15342
5479887eb461
lib-storage: Renamed mail_storage_set_index_error() to mailbox_set_index_error()
Timo Sirainen <tss@iki.fi>
parents:
15341
diff
changeset
|
326 mailbox_set_index_error(box); |
11484
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11476
diff
changeset
|
327 return -1; |
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11476
diff
changeset
|
328 } |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
329 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
330 return 0; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
331 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
332 |
16781
98702a45784c
dbox: Fixed "UIDVALIDITY=0" error race condition.
Timo Sirainen <tss@iki.fi>
parents:
16533
diff
changeset
|
333 int mdbox_mailbox_create_indexes(struct mailbox *box, |
98702a45784c
dbox: Fixed "UIDVALIDITY=0" error race condition.
Timo Sirainen <tss@iki.fi>
parents:
16533
diff
changeset
|
334 const struct mailbox_update *update, |
98702a45784c
dbox: Fixed "UIDVALIDITY=0" error race condition.
Timo Sirainen <tss@iki.fi>
parents:
16533
diff
changeset
|
335 struct mail_index_transaction *trans) |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
336 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
337 struct mdbox_mailbox *mbox = (struct mdbox_mailbox *)box; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
338 int ret; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
339 |
10652
bdb1ea37ccee
dbox: Moved more mailbox creation code to dbox-common.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
340 mbox->creating = TRUE; |
11484
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
11476
diff
changeset
|
341 ret = mdbox_write_index_header(box, update, trans); |
10652
bdb1ea37ccee
dbox: Moved more mailbox creation code to dbox-common.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
342 mbox->creating = FALSE; |
bdb1ea37ccee
dbox: Moved more mailbox creation code to dbox-common.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
343 return ret; |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
344 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
345 |
11216
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
346 void mdbox_storage_set_corrupted(struct mdbox_storage *storage) |
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
347 { |
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
348 if (storage->corrupted) { |
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
349 /* already set it corrupted (possibly recursing back here) */ |
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
350 return; |
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
351 } |
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
352 |
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
353 storage->corrupted = TRUE; |
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
354 storage->corrupted_rebuild_count = (uint32_t)-1; |
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
355 |
11218
ac62dbb6a355
mdbox: Renamed dbox_map* to mdbox_map*.
Timo Sirainen <tss@iki.fi>
parents:
11217
diff
changeset
|
356 if (mdbox_map_open(storage->map) > 0 && |
ac62dbb6a355
mdbox: Renamed dbox_map* to mdbox_map*.
Timo Sirainen <tss@iki.fi>
parents:
11217
diff
changeset
|
357 mdbox_map_refresh(storage->map) == 0) { |
11216
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
358 storage->corrupted_rebuild_count = |
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
359 mdbox_map_get_rebuild_count(storage->map); |
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
360 } |
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
361 } |
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
362 |
12312
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
12177
diff
changeset
|
363 static const char * |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
12177
diff
changeset
|
364 mdbox_get_attachment_path_suffix(struct dbox_file *file ATTR_UNUSED) |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
12177
diff
changeset
|
365 { |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
12177
diff
changeset
|
366 return ""; |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
12177
diff
changeset
|
367 } |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
12177
diff
changeset
|
368 |
16895
c238c55479c8
mdbox: Added "mdbox_deleted" storage, which can be used to access messages with refcount=0
Timo Sirainen <tss@iki.fi>
parents:
16781
diff
changeset
|
369 void mdbox_set_mailbox_corrupted(struct mailbox *box) |
11652
ad122febbf26
[m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents:
11647
diff
changeset
|
370 { |
ad122febbf26
[m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents:
11647
diff
changeset
|
371 struct mdbox_storage *mstorage = (struct mdbox_storage *)box->storage; |
ad122febbf26
[m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents:
11647
diff
changeset
|
372 |
ad122febbf26
[m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents:
11647
diff
changeset
|
373 mdbox_storage_set_corrupted(mstorage); |
ad122febbf26
[m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents:
11647
diff
changeset
|
374 } |
ad122febbf26
[m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents:
11647
diff
changeset
|
375 |
16895
c238c55479c8
mdbox: Added "mdbox_deleted" storage, which can be used to access messages with refcount=0
Timo Sirainen <tss@iki.fi>
parents:
16781
diff
changeset
|
376 void mdbox_set_file_corrupted(struct dbox_file *file) |
11216
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
377 { |
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
378 struct mdbox_storage *mstorage = (struct mdbox_storage *)file->storage; |
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
379 |
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
380 mdbox_storage_set_corrupted(mstorage); |
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
381 } |
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
382 |
10685
3609c8a35c36
lib-storage: STATUS_GUID moved to mailbox_get_guid() that can fail.
Timo Sirainen <tss@iki.fi>
parents:
10684
diff
changeset
|
383 static int |
13287
957060ca5b69
Moved GUID code to liblib. Use guid_128_t type consistently everywhere.
Timo Sirainen <tss@iki.fi>
parents:
12981
diff
changeset
|
384 mdbox_mailbox_get_guid(struct mdbox_mailbox *mbox, guid_128_t guid_r) |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
385 { |
16938
fa6466dcc37a
mdbox: Fixed race condition when mailbox GUID was looked up before mailbox create was finished.
Timo Sirainen <tss@iki.fi>
parents:
16895
diff
changeset
|
386 const struct mail_index_header *idx_hdr; |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
387 struct mdbox_index_header hdr; |
16403
967ef2a7fa6f
dbox: Don't cache pop3.uidl|order unless index header indicates there are those.
Timo Sirainen <tss@iki.fi>
parents:
16373
diff
changeset
|
388 bool need_resize; |
16938
fa6466dcc37a
mdbox: Fixed race condition when mailbox GUID was looked up before mailbox create was finished.
Timo Sirainen <tss@iki.fi>
parents:
16895
diff
changeset
|
389 int ret = 0; |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
390 |
16938
fa6466dcc37a
mdbox: Fixed race condition when mailbox GUID was looked up before mailbox create was finished.
Timo Sirainen <tss@iki.fi>
parents:
16895
diff
changeset
|
391 i_assert(!mbox->creating); |
fa6466dcc37a
mdbox: Fixed race condition when mailbox GUID was looked up before mailbox create was finished.
Timo Sirainen <tss@iki.fi>
parents:
16895
diff
changeset
|
392 |
fa6466dcc37a
mdbox: Fixed race condition when mailbox GUID was looked up before mailbox create was finished.
Timo Sirainen <tss@iki.fi>
parents:
16895
diff
changeset
|
393 /* there's a race condition between mkdir and getting the mailbox GUID. |
fa6466dcc37a
mdbox: Fixed race condition when mailbox GUID was looked up before mailbox create was finished.
Timo Sirainen <tss@iki.fi>
parents:
16895
diff
changeset
|
394 normally this is handled by mdbox syncing, but GUID can be looked up |
17331
ed6e472cab0e
mdbox: Fixed race condition when creating a new mailbox and another process getting its GUID.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
395 without syncing. when we detect this situation we'll try to finish |
ed6e472cab0e
mdbox: Fixed race condition when creating a new mailbox and another process getting its GUID.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
396 creating the indexes first, which usually means just waiting for |
ed6e472cab0e
mdbox: Fixed race condition when creating a new mailbox and another process getting its GUID.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
397 the sync lock to get unlocked by the other process creating them. */ |
16938
fa6466dcc37a
mdbox: Fixed race condition when mailbox GUID was looked up before mailbox create was finished.
Timo Sirainen <tss@iki.fi>
parents:
16895
diff
changeset
|
398 idx_hdr = mail_index_get_header(mbox->box.view); |
17331
ed6e472cab0e
mdbox: Fixed race condition when creating a new mailbox and another process getting its GUID.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
399 if (idx_hdr->uid_validity == 0 && idx_hdr->next_uid == 1) { |
ed6e472cab0e
mdbox: Fixed race condition when creating a new mailbox and another process getting its GUID.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
400 if (dbox_mailbox_create_indexes(&mbox->box, NULL) < 0) |
ed6e472cab0e
mdbox: Fixed race condition when creating a new mailbox and another process getting its GUID.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
401 return -1; |
ed6e472cab0e
mdbox: Fixed race condition when creating a new mailbox and another process getting its GUID.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
402 } |
ed6e472cab0e
mdbox: Fixed race condition when creating a new mailbox and another process getting its GUID.
Timo Sirainen <tss@iki.fi>
parents:
17130
diff
changeset
|
403 |
16403
967ef2a7fa6f
dbox: Don't cache pop3.uidl|order unless index header indicates there are those.
Timo Sirainen <tss@iki.fi>
parents:
16373
diff
changeset
|
404 if (mdbox_read_header(mbox, &hdr, &need_resize) < 0) |
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:
21355
diff
changeset
|
405 i_zero(&hdr); |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
406 |
13287
957060ca5b69
Moved GUID code to liblib. Use guid_128_t type consistently everywhere.
Timo Sirainen <tss@iki.fi>
parents:
12981
diff
changeset
|
407 if (guid_128_is_empty(hdr.mailbox_guid)) { |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
408 /* regenerate it */ |
12550
2c299c0e3bc8
lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents:
12545
diff
changeset
|
409 if (mdbox_write_index_header(&mbox->box, NULL, NULL) < 0 || |
16403
967ef2a7fa6f
dbox: Don't cache pop3.uidl|order unless index header indicates there are those.
Timo Sirainen <tss@iki.fi>
parents:
16373
diff
changeset
|
410 mdbox_read_header(mbox, &hdr, &need_resize) < 0) |
16938
fa6466dcc37a
mdbox: Fixed race condition when mailbox GUID was looked up before mailbox create was finished.
Timo Sirainen <tss@iki.fi>
parents:
16895
diff
changeset
|
411 ret = -1; |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
412 } |
16938
fa6466dcc37a
mdbox: Fixed race condition when mailbox GUID was looked up before mailbox create was finished.
Timo Sirainen <tss@iki.fi>
parents:
16895
diff
changeset
|
413 if (ret == 0) |
fa6466dcc37a
mdbox: Fixed race condition when mailbox GUID was looked up before mailbox create was finished.
Timo Sirainen <tss@iki.fi>
parents:
16895
diff
changeset
|
414 memcpy(guid_r, hdr.mailbox_guid, GUID_128_SIZE); |
fa6466dcc37a
mdbox: Fixed race condition when mailbox GUID was looked up before mailbox create was finished.
Timo Sirainen <tss@iki.fi>
parents:
16895
diff
changeset
|
415 return ret; |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
416 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
417 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
418 static int |
12550
2c299c0e3bc8
lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents:
12545
diff
changeset
|
419 mdbox_mailbox_get_metadata(struct mailbox *box, |
2c299c0e3bc8
lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents:
12545
diff
changeset
|
420 enum mailbox_metadata_items items, |
2c299c0e3bc8
lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents:
12545
diff
changeset
|
421 struct mailbox_metadata *metadata_r) |
2c299c0e3bc8
lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents:
12545
diff
changeset
|
422 { |
2c299c0e3bc8
lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents:
12545
diff
changeset
|
423 struct mdbox_mailbox *mbox = (struct mdbox_mailbox *)box; |
2c299c0e3bc8
lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents:
12545
diff
changeset
|
424 |
13596
b7e58d26393f
lib-storage: mailbox_get_metadata() no longer always opens mailbox.
Timo Sirainen <tss@iki.fi>
parents:
13287
diff
changeset
|
425 if (index_mailbox_get_metadata(box, items, metadata_r) < 0) |
b7e58d26393f
lib-storage: mailbox_get_metadata() no longer always opens mailbox.
Timo Sirainen <tss@iki.fi>
parents:
13287
diff
changeset
|
426 return -1; |
12550
2c299c0e3bc8
lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents:
12545
diff
changeset
|
427 if ((items & MAILBOX_METADATA_GUID) != 0) { |
2c299c0e3bc8
lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents:
12545
diff
changeset
|
428 if (mdbox_mailbox_get_guid(mbox, metadata_r->guid) < 0) |
2c299c0e3bc8
lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents:
12545
diff
changeset
|
429 return -1; |
2c299c0e3bc8
lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents:
12545
diff
changeset
|
430 } |
13596
b7e58d26393f
lib-storage: mailbox_get_metadata() no longer always opens mailbox.
Timo Sirainen <tss@iki.fi>
parents:
13287
diff
changeset
|
431 return 0; |
12550
2c299c0e3bc8
lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents:
12545
diff
changeset
|
432 } |
2c299c0e3bc8
lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents:
12545
diff
changeset
|
433 |
2c299c0e3bc8
lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents:
12545
diff
changeset
|
434 static int |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
435 mdbox_mailbox_update(struct mailbox *box, const struct mailbox_update *update) |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
436 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
437 if (!box->opened) { |
12710
42ca32299617
dbox: mailbox_create/update() might not have updated index header correctly.
Timo Sirainen <tss@iki.fi>
parents:
12320
diff
changeset
|
438 if (mailbox_open(box) < 0) |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
439 return -1; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
440 } |
15495
69371578720f
lib-storage: Added support for "private modseqs" for INDEXPVT index.
Timo Sirainen <tss@iki.fi>
parents:
15342
diff
changeset
|
441 if (mdbox_write_index_header(box, update, NULL) < 0) |
69371578720f
lib-storage: Added support for "private modseqs" for INDEXPVT index.
Timo Sirainen <tss@iki.fi>
parents:
15342
diff
changeset
|
442 return -1; |
69371578720f
lib-storage: Added support for "private modseqs" for INDEXPVT index.
Timo Sirainen <tss@iki.fi>
parents:
15342
diff
changeset
|
443 return index_storage_mailbox_update_common(box, update); |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
444 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
445 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
446 struct mail_storage mdbox_storage = { |
10410
b757dab45756
Removed MEMBER() macro. Require C99 style struct initializer.
Timo Sirainen <tss@iki.fi>
parents:
10350
diff
changeset
|
447 .name = MDBOX_STORAGE_NAME, |
15749
91f60f0d72df
lib-storage: Added mailbox_status.have_guids flag
Timo Sirainen <tss@iki.fi>
parents:
15715
diff
changeset
|
448 .class_flags = MAIL_STORAGE_CLASS_FLAG_UNIQUE_ROOT | |
16373
35871cb142df
lib-storage: Added mailbox_status.have_save_guids.
Timo Sirainen <tss@iki.fi>
parents:
15749
diff
changeset
|
449 MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_GUIDS | |
16501
102d8a59eeda
lib-storage: Added MAIL_STORAGE_CLASS_FLAG_BINARY_DATA flag for classes.
Timo Sirainen <tss@iki.fi>
parents:
16403
diff
changeset
|
450 MAIL_STORAGE_CLASS_FLAG_HAVE_MAIL_SAVE_GUIDS | |
102d8a59eeda
lib-storage: Added MAIL_STORAGE_CLASS_FLAG_BINARY_DATA flag for classes.
Timo Sirainen <tss@iki.fi>
parents:
16403
diff
changeset
|
451 MAIL_STORAGE_CLASS_FLAG_BINARY_DATA, |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
452 |
10410
b757dab45756
Removed MEMBER() macro. Require C99 style struct initializer.
Timo Sirainen <tss@iki.fi>
parents:
10350
diff
changeset
|
453 .v = { |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
454 mdbox_get_setting_parser_info, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
455 mdbox_storage_alloc, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
456 mdbox_storage_create, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
457 mdbox_storage_destroy, |
10715
be5590207f20
lib-storage: Changed mailbox_list.iter_is_mailbox() API.
Timo Sirainen <tss@iki.fi>
parents:
10711
diff
changeset
|
458 NULL, |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
459 dbox_storage_get_list_settings, |
13698
bcb20d216edd
mdbox: Added support for autodetection of ~/mdbox/ as mdbox storage.
Timo Sirainen <tss@iki.fi>
parents:
13596
diff
changeset
|
460 mdbox_storage_autodetect, |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
461 mdbox_mailbox_alloc, |
21225
2f077146c48e
lib-storage: Add mail_storage.list_index_corrupted()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21213
diff
changeset
|
462 mdbox_purge, |
2f077146c48e
lib-storage: Add mail_storage.list_index_corrupted()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
21213
diff
changeset
|
463 NULL, |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
464 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
465 }; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
466 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
467 struct mailbox mdbox_mailbox = { |
10410
b757dab45756
Removed MEMBER() macro. Require C99 style struct initializer.
Timo Sirainen <tss@iki.fi>
parents:
10350
diff
changeset
|
468 .v = { |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
469 index_storage_is_readonly, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
470 index_storage_mailbox_enable, |
12583
4073ccc8123f
lib-storage: Replaced mailbox_list_get_name_status() with mailbox_exists().
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
471 index_storage_mailbox_exists, |
12521
b22766c1aa51
lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents:
12520
diff
changeset
|
472 mdbox_mailbox_open, |
10975
52d9b2d8c1e8
mdbox: Do delayed storage rebuild when closing mailbox.
Timo Sirainen <tss@iki.fi>
parents:
10877
diff
changeset
|
473 mdbox_mailbox_close, |
10719
debbf3f39e0c
lib-storage: Use a default non-NULL mailbox.free() so plugins don't have to check for it.
Timo Sirainen <tss@iki.fi>
parents:
10718
diff
changeset
|
474 index_storage_mailbox_free, |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
475 dbox_mailbox_create, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
476 mdbox_mailbox_update, |
12896
a8fe529ea72b
lib-storage: mailbox_delete() now always first expunges all mails before trying deletion.
Timo Sirainen <tss@iki.fi>
parents:
12866
diff
changeset
|
477 index_storage_mailbox_delete, |
10711
292562f9b12c
lib-storage: Mailbox renaming API changed.
Timo Sirainen <tss@iki.fi>
parents:
10690
diff
changeset
|
478 index_storage_mailbox_rename, |
10685
3609c8a35c36
lib-storage: STATUS_GUID moved to mailbox_get_guid() that can fail.
Timo Sirainen <tss@iki.fi>
parents:
10684
diff
changeset
|
479 index_storage_get_status, |
12550
2c299c0e3bc8
lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents:
12545
diff
changeset
|
480 mdbox_mailbox_get_metadata, |
13876
bc9217cb0193
lib-storage: Added struct mailbox.set_subscribed() virtual method.
Timo Sirainen <tss@iki.fi>
parents:
13844
diff
changeset
|
481 index_storage_set_subscribed, |
15224
5659c178bdeb
lib-storage: Added support to get/set/iterate mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents:
15163
diff
changeset
|
482 index_storage_attribute_set, |
5659c178bdeb
lib-storage: Added support to get/set/iterate mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents:
15163
diff
changeset
|
483 index_storage_attribute_get, |
5659c178bdeb
lib-storage: Added support to get/set/iterate mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents:
15163
diff
changeset
|
484 index_storage_attribute_iter_init, |
5659c178bdeb
lib-storage: Added support to get/set/iterate mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents:
15163
diff
changeset
|
485 index_storage_attribute_iter_next, |
5659c178bdeb
lib-storage: Added support to get/set/iterate mailbox attributes.
Timo Sirainen <tss@iki.fi>
parents:
15163
diff
changeset
|
486 index_storage_attribute_iter_deinit, |
12646
87f84a76fb1e
lib-storage: Return STATUS replies from mailbox list index only when it's fully up-to-date.
Timo Sirainen <tss@iki.fi>
parents:
12597
diff
changeset
|
487 index_storage_list_index_has_changed, |
87f84a76fb1e
lib-storage: Return STATUS replies from mailbox list index only when it's fully up-to-date.
Timo Sirainen <tss@iki.fi>
parents:
12597
diff
changeset
|
488 index_storage_list_index_update_sync, |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
489 mdbox_storage_sync_init, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
490 index_mailbox_sync_next, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
491 index_mailbox_sync_deinit, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
492 NULL, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
493 dbox_notify_changes, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
494 index_transaction_begin, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
495 index_transaction_commit, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
496 index_transaction_rollback, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
497 NULL, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
498 dbox_mail_alloc, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
499 index_storage_search_init, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
500 index_storage_search_deinit, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
501 index_storage_search_next_nonblock, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
502 index_storage_search_next_update_seq, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
503 mdbox_save_alloc, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
504 mdbox_save_begin, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
505 dbox_save_continue, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
506 mdbox_save_finish, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
507 mdbox_save_cancel, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
508 mdbox_copy, |
12866
59e4c0d1457b
lib-storage: Moved index_mailbox_context.save_*() methods to mailbox_vfuncs.
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
509 mdbox_transaction_save_commit_pre, |
59e4c0d1457b
lib-storage: Moved index_mailbox_context.save_*() methods to mailbox_vfuncs.
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
510 mdbox_transaction_save_commit_post, |
59e4c0d1457b
lib-storage: Moved index_mailbox_context.save_*() methods to mailbox_vfuncs.
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
511 mdbox_transaction_save_rollback, |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
512 index_storage_is_inconsistent |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
513 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
514 }; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
515 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
516 struct dbox_storage_vfuncs mdbox_dbox_storage_vfuncs = { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
517 mdbox_file_unrefed, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
518 mdbox_file_create_fd, |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
519 mdbox_mail_open, |
11216
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
520 mdbox_mailbox_create_indexes, |
12312
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
12177
diff
changeset
|
521 mdbox_get_attachment_path_suffix, |
11652
ad122febbf26
[m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents:
11647
diff
changeset
|
522 mdbox_set_mailbox_corrupted, |
11216
de0ed7bea201
mdbox: Avoid rebuilding storage if another process already did it.
Timo Sirainen <tss@iki.fi>
parents:
11179
diff
changeset
|
523 mdbox_set_file_corrupted |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
524 }; |