annotate src/lib-storage/index/dbox-common/dbox-storage.c @ 15342:5479887eb461

lib-storage: Renamed mail_storage_set_index_error() to mailbox_set_index_error()
author Timo Sirainen <tss@iki.fi>
date Mon, 29 Oct 2012 19:54:50 +0200
parents 15dfd6475f64
children b1267f135417
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14133
ba770cba5598 Updated copyright notices to include year 2012.
Timo Sirainen <tss@iki.fi>
parents: 14046
diff changeset
1 /* Copyright (c) 2007-2012 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"
15285
2a44991cbf66 Avoid using PATH_MAX.
Timo Sirainen <tss@iki.fi>
parents: 15284
diff changeset
4 #include "abspath.h"
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "ioloop.h"
15170
b6663a4f60fe Compiler warning fix for previous change
Timo Sirainen <tss@iki.fi>
parents: 15169
diff changeset
6 #include "abspath.h"
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
7 #include "fs-api.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 "mkdir-parents.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "unlink-old-files.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "mailbox-uidvalidity.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "mailbox-list-private.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include "index-storage.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include "dbox-storage.h"
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #include <stdio.h>
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: 11484
diff changeset
16 #include <dirent.h>
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
17 #include <unistd.h>
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 void dbox_storage_get_list_settings(const struct mail_namespace *ns ATTR_UNUSED,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 struct mailbox_list_settings *set)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 if (set->layout == NULL)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 set->layout = MAILBOX_LIST_NAME_FS;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 if (set->subscription_fname == NULL)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 set->subscription_fname = DBOX_SUBSCRIPTION_FILE_NAME;
14046
db8c1dde0b41 lib-storage: And another fix to previous maildir_name/mailbox_dir_name changes.
Timo Sirainen <tss@iki.fi>
parents: 13509
diff changeset
26 if (*set->maildir_name == '\0')
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 set->maildir_name = DBOX_MAILDIR_NAME;
14046
db8c1dde0b41 lib-storage: And another fix to previous maildir_name/mailbox_dir_name changes.
Timo Sirainen <tss@iki.fi>
parents: 13509
diff changeset
28 if (*set->mailbox_dir_name == '\0')
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 set->mailbox_dir_name = DBOX_MAILBOX_DIR_NAME;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31
13269
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
32 static bool
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
33 dbox_alt_path_has_changed(const char *root_dir,
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
34 const char *alt_path, const char *alt_symlink_path)
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
35 {
15284
75aadea5c2a2 Avoid using PATH_MAX.
Timo Sirainen <tss@iki.fi>
parents: 15159
diff changeset
36 const char *linkpath;
13269
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
37
15284
75aadea5c2a2 Avoid using PATH_MAX.
Timo Sirainen <tss@iki.fi>
parents: 15159
diff changeset
38 if (t_readlink(alt_symlink_path, &linkpath) < 0) {
13269
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
39 if (errno == ENOENT)
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
40 return alt_path != NULL;
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
41 i_error("readlink(%s) failed: %m", alt_symlink_path);
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
42 return FALSE;
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
43 }
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
44
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
45 if (alt_path == NULL) {
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
46 i_warning("dbox %s: Original ALT=%s, "
15284
75aadea5c2a2 Avoid using PATH_MAX.
Timo Sirainen <tss@iki.fi>
parents: 15159
diff changeset
47 "but currently no ALT path set", root_dir, linkpath);
13269
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
48 return TRUE;
15284
75aadea5c2a2 Avoid using PATH_MAX.
Timo Sirainen <tss@iki.fi>
parents: 15159
diff changeset
49 } else if (strcmp(linkpath, alt_path) != 0) {
13269
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
50 i_warning("dbox %s: Original ALT=%s, "
15284
75aadea5c2a2 Avoid using PATH_MAX.
Timo Sirainen <tss@iki.fi>
parents: 15159
diff changeset
51 "but currently ALT=%s", root_dir, linkpath, alt_path);
13269
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
52 return TRUE;
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
53 }
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
54 return FALSE;
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
55 }
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
56
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
57 static void dbox_verify_alt_path(struct mailbox_list *list)
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
58 {
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
59 const char *root_dir, *alt_symlink_path, *alt_path;
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
60
15163
c7a99d41e39e lib-storage: mailbox_get_path() and friends can now return an error.
Timo Sirainen <tss@iki.fi>
parents: 15162
diff changeset
61 root_dir = mailbox_list_get_root_forced(list, MAILBOX_LIST_PATH_TYPE_DIR);
13269
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
62 alt_symlink_path =
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
63 t_strconcat(root_dir, "/"DBOX_ALT_SYMLINK_NAME, NULL);
15163
c7a99d41e39e lib-storage: mailbox_get_path() and friends can now return an error.
Timo Sirainen <tss@iki.fi>
parents: 15162
diff changeset
64 (void)mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_ALT_MAILBOX,
c7a99d41e39e lib-storage: mailbox_get_path() and friends can now return an error.
Timo Sirainen <tss@iki.fi>
parents: 15162
diff changeset
65 &alt_path);
13269
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
66 if (!dbox_alt_path_has_changed(root_dir, alt_path, alt_symlink_path))
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
67 return;
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
68
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
69 /* unlink/create the current alt path symlink */
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
70 if (unlink(alt_symlink_path) < 0 && errno != ENOENT)
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
71 i_error("unlink(%s) failed: %m", alt_symlink_path);
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
72 if (alt_path != NULL) {
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
73 if (symlink(alt_path, alt_symlink_path) < 0 &&
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
74 errno != EEXIST) {
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
75 i_error("symlink(%s, %s) failed: %m",
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
76 alt_path, alt_symlink_path);
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
77 }
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
78 }
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
79 }
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
80
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
81 int dbox_storage_create(struct mail_storage *_storage,
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
82 struct mail_namespace *ns,
15085
8f4ce0932777 lib-fs: fs_init() API changed to allow returning an error.
Timo Sirainen <tss@iki.fi>
parents: 15080
diff changeset
83 const char **error_r)
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
84 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
85 struct dbox_storage *storage = (struct dbox_storage *)_storage;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
86 const struct mail_storage_settings *set = _storage->set;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
87 struct fs_settings fs_set;
15085
8f4ce0932777 lib-fs: fs_init() API changed to allow returning an error.
Timo Sirainen <tss@iki.fi>
parents: 15080
diff changeset
88 const char *error;
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
89
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
90 memset(&fs_set, 0, sizeof(fs_set));
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
91 fs_set.temp_file_prefix = mailbox_list_get_global_temp_prefix(ns->list);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
92
15085
8f4ce0932777 lib-fs: fs_init() API changed to allow returning an error.
Timo Sirainen <tss@iki.fi>
parents: 15080
diff changeset
93 if (*set->mail_attachment_fs != '\0') {
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
94 const char *name, *args, *dir;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
95
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
96 args = strchr(set->mail_attachment_fs, ' ');
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
97 if (args == NULL) {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
98 name = set->mail_attachment_fs;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
99 args = "";
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
100 } else {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
101 name = t_strdup_until(set->mail_attachment_fs, args++);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
102 }
15305
9542732069ff sdbox: Make sure mail_attachment_fs=sis-queue isn't attempted to be used.
Timo Sirainen <tss@iki.fi>
parents: 15285
diff changeset
103 if (strcmp(name, "sis-queue") == 0 &&
9542732069ff sdbox: Make sure mail_attachment_fs=sis-queue isn't attempted to be used.
Timo Sirainen <tss@iki.fi>
parents: 15285
diff changeset
104 (_storage->class_flags & MAIL_STORAGE_CLASS_FLAG_FILE_PER_MSG) != 0) {
9542732069ff sdbox: Make sure mail_attachment_fs=sis-queue isn't attempted to be used.
Timo Sirainen <tss@iki.fi>
parents: 15285
diff changeset
105 /* FIXME: the deduplication part doesn't work, because
9542732069ff sdbox: Make sure mail_attachment_fs=sis-queue isn't attempted to be used.
Timo Sirainen <tss@iki.fi>
parents: 15285
diff changeset
106 sdbox renames the files.. */
9542732069ff sdbox: Make sure mail_attachment_fs=sis-queue isn't attempted to be used.
Timo Sirainen <tss@iki.fi>
parents: 15285
diff changeset
107 *error_r = "mail_attachment_fs: "
9542732069ff sdbox: Make sure mail_attachment_fs=sis-queue isn't attempted to be used.
Timo Sirainen <tss@iki.fi>
parents: 15285
diff changeset
108 "sis-queue not currently supported by sdbox";
9542732069ff sdbox: Make sure mail_attachment_fs=sis-queue isn't attempted to be used.
Timo Sirainen <tss@iki.fi>
parents: 15285
diff changeset
109 return -1;
9542732069ff sdbox: Make sure mail_attachment_fs=sis-queue isn't attempted to be used.
Timo Sirainen <tss@iki.fi>
parents: 15285
diff changeset
110 }
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
111 dir = mail_user_home_expand(_storage->user,
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
112 set->mail_attachment_dir);
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
113 storage->attachment_dir = p_strdup(_storage->pool, dir);
15198
ce57bacc3010 lib-fs API cleanups and improvements
Timo Sirainen <tss@iki.fi>
parents: 15170
diff changeset
114 fs_set.root_path = storage->attachment_dir;
15085
8f4ce0932777 lib-fs: fs_init() API changed to allow returning an error.
Timo Sirainen <tss@iki.fi>
parents: 15080
diff changeset
115 if (fs_init(name, args, &fs_set, &storage->attachment_fs,
8f4ce0932777 lib-fs: fs_init() API changed to allow returning an error.
Timo Sirainen <tss@iki.fi>
parents: 15080
diff changeset
116 &error) < 0) {
8f4ce0932777 lib-fs: fs_init() API changed to allow returning an error.
Timo Sirainen <tss@iki.fi>
parents: 15080
diff changeset
117 *error_r = t_strdup_printf("mail_attachment_fs: %s",
8f4ce0932777 lib-fs: fs_init() API changed to allow returning an error.
Timo Sirainen <tss@iki.fi>
parents: 15080
diff changeset
118 error);
8f4ce0932777 lib-fs: fs_init() API changed to allow returning an error.
Timo Sirainen <tss@iki.fi>
parents: 15080
diff changeset
119 return -1;
8f4ce0932777 lib-fs: fs_init() API changed to allow returning an error.
Timo Sirainen <tss@iki.fi>
parents: 15080
diff changeset
120 }
8f4ce0932777 lib-fs: fs_init() API changed to allow returning an error.
Timo Sirainen <tss@iki.fi>
parents: 15080
diff changeset
121 }
13269
8aeeaf770612 dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents: 12860
diff changeset
122
15159
a14f1d2e2b45 lib-storage: Added ALTNOCHECK option to mail_location.
Timo Sirainen <tss@iki.fi>
parents: 14379
diff changeset
123 if (!ns->list->set.alt_dir_nocheck)
a14f1d2e2b45 lib-storage: Added ALTNOCHECK option to mail_location.
Timo Sirainen <tss@iki.fi>
parents: 14379
diff changeset
124 dbox_verify_alt_path(ns->list);
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
125 return 0;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
126 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
127
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
128 void dbox_storage_destroy(struct mail_storage *_storage)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
129 {
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
130 struct dbox_storage *storage = (struct dbox_storage *)_storage;
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
131
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
132 if (storage->attachment_fs != NULL)
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
133 fs_deinit(&storage->attachment_fs);
15272
ca10d2e8d8e3 lib-storage: Moved mail attribute dict to struct mail_storage.
Timo Sirainen <tss@iki.fi>
parents: 15198
diff changeset
134 index_storage_destroy(_storage);
12312
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
135 }
28eaaa23f2c6 lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents: 11652
diff changeset
136
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 uint32_t dbox_get_uidvalidity_next(struct mailbox_list *list)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 const char *path;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140
15163
c7a99d41e39e lib-storage: mailbox_get_path() and friends can now return an error.
Timo Sirainen <tss@iki.fi>
parents: 15162
diff changeset
141 path = mailbox_list_get_root_forced(list, MAILBOX_LIST_PATH_TYPE_CONTROL);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 path = t_strconcat(path, "/"DBOX_UIDVALIDITY_FILE_NAME, NULL);
10475
7f2e9c793af8 dovecot-uidvalidity*: Create files with correct permission.
Timo Sirainen <tss@iki.fi>
parents: 10254
diff changeset
143 return mailbox_uidvalidity_next(list, path);
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
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 void dbox_notify_changes(struct mailbox *box)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 {
10254
ea4a80ee0283 dbox notify: Look for dbox index files from index dir, not mail root dir.
Timo Sirainen <tss@iki.fi>
parents: 9977
diff changeset
148 const char *dir, *path;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 if (box->notify_callback == NULL)
10660
56b1d4dd9c7d lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents: 10653
diff changeset
151 index_mailbox_check_remove_all(box);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 else {
15163
c7a99d41e39e lib-storage: mailbox_get_path() and friends can now return an error.
Timo Sirainen <tss@iki.fi>
parents: 15162
diff changeset
153 if (mailbox_get_path_to(box, MAILBOX_LIST_PATH_TYPE_INDEX,
c7a99d41e39e lib-storage: mailbox_get_path() and friends can now return an error.
Timo Sirainen <tss@iki.fi>
parents: 15162
diff changeset
154 &dir) <= 0)
c7a99d41e39e lib-storage: mailbox_get_path() and friends can now return an error.
Timo Sirainen <tss@iki.fi>
parents: 15162
diff changeset
155 return;
15341
15dfd6475f64 Replaced *_INDEX_PREFIX macros with a common MAIL_INDEX_PREFIX.
Timo Sirainen <tss@iki.fi>
parents: 15337
diff changeset
156 path = t_strdup_printf("%s/"MAIL_INDEX_PREFIX".log", dir);
10660
56b1d4dd9c7d lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents: 10653
diff changeset
157 index_mailbox_check_add(box, path);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 static bool
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 dbox_cleanup_if_exists(struct mailbox_list *list, const char *path)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 struct stat st;
14379
370e1f945c01 Added mail_temp_scan_interval setting and changed its default from 8h -> 1w.
Timo Sirainen <tss@iki.fi>
parents: 14332
diff changeset
165 unsigned int interval = list->mail_set->mail_temp_scan_interval;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 if (stat(path, &st) < 0)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 return FALSE;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 /* check once in a while if there are temp files to clean up */
14379
370e1f945c01 Added mail_temp_scan_interval setting and changed its default from 8h -> 1w.
Timo Sirainen <tss@iki.fi>
parents: 14332
diff changeset
171 if (interval == 0) {
370e1f945c01 Added mail_temp_scan_interval setting and changed its default from 8h -> 1w.
Timo Sirainen <tss@iki.fi>
parents: 14332
diff changeset
172 /* disabled */
370e1f945c01 Added mail_temp_scan_interval setting and changed its default from 8h -> 1w.
Timo Sirainen <tss@iki.fi>
parents: 14332
diff changeset
173 } else if (st.st_atime > st.st_ctime + DBOX_TMP_DELETE_SECS) {
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 /* there haven't been any changes to this directory since we
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 last checked it. */
15080
e708a1d691d3 Compiler warning fixes for 32bit systems.
Timo Sirainen <tss@iki.fi>
parents: 15063
diff changeset
176 } else if (st.st_atime < ioloop_time - (time_t)interval) {
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 /* time to scan */
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 const char *prefix =
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 mailbox_list_get_global_temp_prefix(list);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 (void)unlink_old_files(path, prefix,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 ioloop_time - DBOX_TMP_DELETE_SECS);
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 return TRUE;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 int dbox_mailbox_open(struct mailbox *box)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 {
12520
b26d6da05d48 lib-storage: Lazily look up mailbox path and permissions. Added functions to get them.
Timo Sirainen <tss@iki.fi>
parents: 12387
diff changeset
189 const char *box_path = mailbox_get_path(box);
b26d6da05d48 lib-storage: Lazily look up mailbox path and permissions. Added functions to get them.
Timo Sirainen <tss@iki.fi>
parents: 12387
diff changeset
190
12521
b22766c1aa51 lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents: 12520
diff changeset
191 if (dbox_cleanup_if_exists(box->list, box_path))
b22766c1aa51 lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents: 12520
diff changeset
192 ;
14332
37d6dd0f053b lib-storage: Don't log errors if trying to open a mailbox with too long name.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
193 else if (errno == ENOENT || errno == ENAMETOOLONG) {
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 mail_storage_set_error(box->storage, MAIL_ERROR_NOTFOUND,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 T_MAIL_ERR_MAILBOX_NOT_FOUND(box->name));
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 return -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 } else if (errno == EACCES) {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 mail_storage_set_critical(box->storage, "%s",
12520
b26d6da05d48 lib-storage: Lazily look up mailbox path and permissions. Added functions to get them.
Timo Sirainen <tss@iki.fi>
parents: 12387
diff changeset
199 mail_error_eacces_msg("stat", box_path));
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 return -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 } else {
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 mail_storage_set_critical(box->storage,
12520
b26d6da05d48 lib-storage: Lazily look up mailbox path and permissions. Added functions to get them.
Timo Sirainen <tss@iki.fi>
parents: 12387
diff changeset
203 "stat(%s) failed: %m", box_path);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 return -1;
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 }
12521
b22766c1aa51 lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents: 12520
diff changeset
206
b22766c1aa51 lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents: 12520
diff changeset
207 if (index_storage_mailbox_open(box, FALSE) < 0)
b22766c1aa51 lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents: 12520
diff changeset
208 return -1;
b22766c1aa51 lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents: 12520
diff changeset
209 mail_index_set_fsync_mode(box->index,
b22766c1aa51 lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents: 12520
diff changeset
210 box->storage->set->parsed_fsync_mode,
15063
0efc12f3eb2a lib-index: Changed mail_index_set_fsync_mode() to use a separate enum for the mask.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
211 MAIL_INDEX_FSYNC_MASK_APPENDS |
0efc12f3eb2a lib-index: Changed mail_index_set_fsync_mode() to use a separate enum for the mask.
Timo Sirainen <tss@iki.fi>
parents: 14629
diff changeset
212 MAIL_INDEX_FSYNC_MASK_EXPUNGES);
12521
b22766c1aa51 lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents: 12520
diff changeset
213 return 0;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 }
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215
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: 11484
diff changeset
216 static int dir_is_empty(struct mail_storage *storage, const char *path)
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
217 {
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
218 DIR *dir;
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
219 struct dirent *d;
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
220 int ret = 1;
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
221
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
222 dir = opendir(path);
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
223 if (dir == NULL) {
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
224 if (errno == ENOENT) {
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
225 /* race condition with DELETE/RENAME? */
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
226 return 1;
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
227 }
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
228 mail_storage_set_critical(storage, "opendir(%s) failed: %m",
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
229 path);
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
230 return -1;
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
231 }
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
232 while ((d = readdir(dir)) != NULL) {
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
233 if (*d->d_name == '.')
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
234 continue;
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
235
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
236 ret = 0;
12387
ed94f6d615ef dbox: Minor optimization when creating a mailbox when its alt dir already existed.
Timo Sirainen <tss@iki.fi>
parents: 12312
diff changeset
237 break;
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: 11484
diff changeset
238 }
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
239 if (closedir(dir) < 0) {
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
240 mail_storage_set_critical(storage, "closedir(%s) failed: %m",
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
241 path);
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
242 ret = -1;
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
243 }
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
244 return ret;
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
245 }
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
246
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 int dbox_mailbox_create(struct mailbox *box,
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 const struct mailbox_update *update, bool directory)
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 {
10653
5fe70b5da1b8 lib-storage: Moved mailbox directory creation code to mailbox_list backend.
Timo Sirainen <tss@iki.fi>
parents: 10652
diff changeset
250 struct dbox_storage *storage = (struct dbox_storage *)box->storage;
11484
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 10720
diff changeset
251 struct mail_index_sync_ctx *sync_ctx;
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 10720
diff changeset
252 struct mail_index_view *view;
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 10720
diff changeset
253 struct mail_index_transaction *trans;
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: 11484
diff changeset
254 const char *alt_path;
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
255 struct stat st;
11484
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 10720
diff changeset
256 int ret;
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257
15112
6e90fc8dfa25 lib-storage: Removed mailbox_list.create_mailbox_dir() virtual function.
Timo Sirainen <tss@iki.fi>
parents: 15100
diff changeset
258 if ((ret = index_storage_mailbox_create(box, directory)) <= 0)
6e90fc8dfa25 lib-storage: Removed mailbox_list.create_mailbox_dir() virtual function.
Timo Sirainen <tss@iki.fi>
parents: 15100
diff changeset
259 return ret;
12710
42ca32299617 dbox: mailbox_create/update() might not have updated index header correctly.
Timo Sirainen <tss@iki.fi>
parents: 12387
diff changeset
260 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
261 return -1;
11484
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 10720
diff changeset
262
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: 11484
diff changeset
263 /* if alt path already exists and contains files, rebuild storage so
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
264 that we don't start overwriting files. */
15163
c7a99d41e39e lib-storage: mailbox_get_path() and friends can now return an error.
Timo Sirainen <tss@iki.fi>
parents: 15162
diff changeset
265 ret = mailbox_get_path_to(box, MAILBOX_LIST_PATH_TYPE_ALT_MAILBOX, &alt_path);
c7a99d41e39e lib-storage: mailbox_get_path() and friends can now return an error.
Timo Sirainen <tss@iki.fi>
parents: 15162
diff changeset
266 if (ret > 0 && stat(alt_path, &st) == 0) {
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: 11484
diff changeset
267 ret = dir_is_empty(box->storage, alt_path);
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
268 if (ret < 0)
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
269 return -1;
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
270 if (ret == 0) {
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
271 mail_storage_set_critical(&storage->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: 11484
diff changeset
272 "Mailbox %s has existing files in alt path, "
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
273 "rebuilding storage to avoid losing messages",
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
274 box->vname);
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
275 storage->v.set_mailbox_corrupted(box);
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
276 return -1;
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
277 }
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
278 /* dir is empty, ignore it */
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
279 }
ad122febbf26 [m]dbox: If alt-dir exists for a mailbox while trying to create it, rebuild mailbox indexes.
Timo Sirainen <tss@iki.fi>
parents: 11484
diff changeset
280
11484
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 10720
diff changeset
281 /* use syncing as a lock */
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 10720
diff changeset
282 ret = mail_index_sync_begin(box->index, &sync_ctx, &view, &trans, 0);
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 10720
diff changeset
283 if (ret <= 0) {
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 10720
diff changeset
284 i_assert(ret != 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
285 mailbox_set_index_error(box);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 return -1;
11484
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 10720
diff changeset
287 }
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 10720
diff changeset
288
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 10720
diff changeset
289 if (mail_index_get_header(view)->uid_validity == 0) {
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 10720
diff changeset
290 if (storage->v.mailbox_create_indexes(box, update, trans) < 0) {
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 10720
diff changeset
291 mail_index_sync_rollback(&sync_ctx);
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 10720
diff changeset
292 return -1;
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 10720
diff changeset
293 }
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 10720
diff changeset
294 }
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 10720
diff changeset
295
7fc5db26f6eb dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 10720
diff changeset
296 return mail_index_sync_commit(&sync_ctx);
9977
0bb321c347ae Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 }
15095
89c319980584 dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents: 15085
diff changeset
298
89c319980584 dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents: 15085
diff changeset
299 int dbox_verify_alt_storage(struct mailbox_list *list)
89c319980584 dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents: 15085
diff changeset
300 {
15118
02d00843dd79 lib-storage: Cleanups to mailbox mkdir() related functions.
Timo Sirainen <tss@iki.fi>
parents: 15112
diff changeset
301 const char *alt_path;
15095
89c319980584 dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents: 15085
diff changeset
302 struct stat st;
89c319980584 dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents: 15085
diff changeset
303
15163
c7a99d41e39e lib-storage: mailbox_get_path() and friends can now return an error.
Timo Sirainen <tss@iki.fi>
parents: 15162
diff changeset
304 if (!mailbox_list_get_root_path(list, MAILBOX_LIST_PATH_TYPE_ALT_DIR,
c7a99d41e39e lib-storage: mailbox_get_path() and friends can now return an error.
Timo Sirainen <tss@iki.fi>
parents: 15162
diff changeset
305 &alt_path))
15095
89c319980584 dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents: 15085
diff changeset
306 return 0;
89c319980584 dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents: 15085
diff changeset
307
89c319980584 dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents: 15085
diff changeset
308 /* make sure alt storage is mounted. if it's not, abort the rebuild. */
89c319980584 dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents: 15085
diff changeset
309 if (stat(alt_path, &st) == 0)
89c319980584 dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents: 15085
diff changeset
310 return 0;
89c319980584 dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents: 15085
diff changeset
311 if (errno != ENOENT) {
89c319980584 dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents: 15085
diff changeset
312 i_error("stat(%s) failed: %m", alt_path);
89c319980584 dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents: 15085
diff changeset
313 return -1;
89c319980584 dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents: 15085
diff changeset
314 }
89c319980584 dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents: 15085
diff changeset
315
89c319980584 dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents: 15085
diff changeset
316 /* try to create the alt directory. if it fails, it means alt
89c319980584 dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents: 15085
diff changeset
317 storage isn't mounted. */
89c319980584 dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents: 15085
diff changeset
318 if (mailbox_list_mkdir_root(list, alt_path,
15118
02d00843dd79 lib-storage: Cleanups to mailbox mkdir() related functions.
Timo Sirainen <tss@iki.fi>
parents: 15112
diff changeset
319 MAILBOX_LIST_PATH_TYPE_ALT_DIR) < 0)
15095
89c319980584 dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents: 15085
diff changeset
320 return -1;
89c319980584 dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents: 15085
diff changeset
321 return 0;
89c319980584 dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents: 15085
diff changeset
322 }