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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
f1a2a8097903 Compiler warning fix.
Timo Sirainen <tss@iki.fi>
parents: 10868
diff changeset
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 };