Mercurial > dovecot > core-2.2
annotate src/lib-storage/index/dbox-common/dbox-storage.c @ 15170:b6663a4f60fe
Compiler warning fix for previous change
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 28 Sep 2012 15:11:54 +0300 |
parents | 48ee8bad7d51 |
children | ce57bacc3010 |
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" |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "ioloop.h" |
15170
b6663a4f60fe
Compiler warning fix for previous change
Timo Sirainen <tss@iki.fi>
parents:
15169
diff
changeset
|
5 #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
|
6 #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
|
7 #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
|
8 #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
|
9 #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
|
10 #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
|
11 #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
|
12 #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
|
13 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #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
|
15 #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
|
16 #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
|
17 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 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
|
19 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
|
20 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 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
|
22 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
|
23 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
|
24 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
|
25 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
|
26 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
|
27 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
|
28 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
|
29 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 |
13269
8aeeaf770612
dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
31 static bool |
8aeeaf770612
dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
32 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
|
33 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
|
34 { |
15169 | 35 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
|
36 |
15169 | 37 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
|
38 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
|
39 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
|
40 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
|
41 return FALSE; |
8aeeaf770612
dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
42 } |
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 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
|
45 i_warning("dbox %s: Original ALT=%s, " |
15169 | 46 "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
|
47 return TRUE; |
15169 | 48 } 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
|
49 i_warning("dbox %s: Original ALT=%s, " |
15169 | 50 "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
|
51 return TRUE; |
8aeeaf770612
dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
52 } |
8aeeaf770612
dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
53 return FALSE; |
8aeeaf770612
dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
54 } |
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 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
|
57 { |
8aeeaf770612
dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
58 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
|
59 |
15163
c7a99d41e39e
lib-storage: mailbox_get_path() and friends can now return an error.
Timo Sirainen <tss@iki.fi>
parents:
15162
diff
changeset
|
60 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
|
61 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
|
62 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
|
63 (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
|
64 &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
|
65 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
|
66 return; |
8aeeaf770612
dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
67 |
8aeeaf770612
dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
68 /* 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
|
69 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
|
70 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
|
71 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
|
72 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
|
73 errno != EEXIST) { |
8aeeaf770612
dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
74 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
|
75 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
|
76 } |
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 |
12312
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11652
diff
changeset
|
80 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
|
81 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
|
82 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
|
83 { |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11652
diff
changeset
|
84 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
|
85 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
|
86 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
|
87 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
|
88 |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11652
diff
changeset
|
89 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
|
90 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
|
91 |
15085
8f4ce0932777
lib-fs: fs_init() API changed to allow returning an error.
Timo Sirainen <tss@iki.fi>
parents:
15080
diff
changeset
|
92 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
|
93 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
|
94 |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11652
diff
changeset
|
95 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
|
96 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
|
97 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
|
98 args = ""; |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11652
diff
changeset
|
99 } else { |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11652
diff
changeset
|
100 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
|
101 } |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11652
diff
changeset
|
102 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
|
103 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
|
104 storage->attachment_dir = p_strdup(_storage->pool, dir); |
15085
8f4ce0932777
lib-fs: fs_init() API changed to allow returning an error.
Timo Sirainen <tss@iki.fi>
parents:
15080
diff
changeset
|
105 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
|
106 &error) < 0) { |
8f4ce0932777
lib-fs: fs_init() API changed to allow returning an error.
Timo Sirainen <tss@iki.fi>
parents:
15080
diff
changeset
|
107 *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
|
108 error); |
8f4ce0932777
lib-fs: fs_init() API changed to allow returning an error.
Timo Sirainen <tss@iki.fi>
parents:
15080
diff
changeset
|
109 return -1; |
8f4ce0932777
lib-fs: fs_init() API changed to allow returning an error.
Timo Sirainen <tss@iki.fi>
parents:
15080
diff
changeset
|
110 } |
8f4ce0932777
lib-fs: fs_init() API changed to allow returning an error.
Timo Sirainen <tss@iki.fi>
parents:
15080
diff
changeset
|
111 } |
13269
8aeeaf770612
dbox: Create symlink to alt root dir, and warn whenever it changes.
Timo Sirainen <tss@iki.fi>
parents:
12860
diff
changeset
|
112 |
15159
a14f1d2e2b45
lib-storage: Added ALTNOCHECK option to mail_location.
Timo Sirainen <tss@iki.fi>
parents:
14379
diff
changeset
|
113 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
|
114 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
|
115 return 0; |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11652
diff
changeset
|
116 } |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11652
diff
changeset
|
117 |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11652
diff
changeset
|
118 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
|
119 { |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11652
diff
changeset
|
120 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
|
121 |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11652
diff
changeset
|
122 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
|
123 fs_deinit(&storage->attachment_fs); |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11652
diff
changeset
|
124 } |
28eaaa23f2c6
lib-storage: Added support for saving mail attachments separately via filesystem API.
Timo Sirainen <tss@iki.fi>
parents:
11652
diff
changeset
|
125 |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 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
|
127 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 const char *path; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 |
15163
c7a99d41e39e
lib-storage: mailbox_get_path() and friends can now return an error.
Timo Sirainen <tss@iki.fi>
parents:
15162
diff
changeset
|
130 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
|
131 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
|
132 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
|
133 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 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
|
136 { |
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
|
137 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
|
138 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 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
|
140 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
|
141 else { |
15163
c7a99d41e39e
lib-storage: mailbox_get_path() and friends can now return an error.
Timo Sirainen <tss@iki.fi>
parents:
15162
diff
changeset
|
142 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
|
143 &dir) <= 0) |
c7a99d41e39e
lib-storage: mailbox_get_path() and friends can now return an error.
Timo Sirainen <tss@iki.fi>
parents:
15162
diff
changeset
|
144 return; |
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
|
145 path = t_strdup_printf("%s/"DBOX_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
|
146 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
|
147 } |
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 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 static bool |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 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
|
152 { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 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
|
154 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
|
155 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 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
|
157 return FALSE; |
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 /* 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
|
160 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
|
161 /* disabled */ |
370e1f945c01
Added mail_temp_scan_interval setting and changed its default from 8h -> 1w.
Timo Sirainen <tss@iki.fi>
parents:
14332
diff
changeset
|
162 } 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
|
163 /* 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
|
164 last checked it. */ |
15080
e708a1d691d3
Compiler warning fixes for 32bit systems.
Timo Sirainen <tss@iki.fi>
parents:
15063
diff
changeset
|
165 } 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
|
166 /* time to scan */ |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 const char *prefix = |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 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
|
169 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 (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
|
171 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
|
172 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 return TRUE; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 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
|
177 { |
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
|
178 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
|
179 |
12521
b22766c1aa51
lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents:
12520
diff
changeset
|
180 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
|
181 ; |
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
|
182 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
|
183 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
|
184 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
|
185 return -1; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 } 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
|
187 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
|
188 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
|
189 return -1; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 } else { |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 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
|
192 "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
|
193 return -1; |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 } |
12521
b22766c1aa51
lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents:
12520
diff
changeset
|
195 |
b22766c1aa51
lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents:
12520
diff
changeset
|
196 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
|
197 return -1; |
b22766c1aa51
lib-storage: Don't allocate index until mailbox_open()
Timo Sirainen <tss@iki.fi>
parents:
12520
diff
changeset
|
198 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
|
199 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
|
200 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
|
201 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
|
202 return 0; |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
203 } |
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 |
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
|
205 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
|
206 { |
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
|
207 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
|
208 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
|
209 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
|
210 |
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
|
211 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
|
212 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
|
213 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
|
214 /* 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
|
215 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
|
216 } |
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 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
|
218 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
|
219 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
|
220 } |
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 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
|
222 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
|
223 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
|
224 |
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 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
|
226 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
|
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 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
|
229 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
|
230 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
|
231 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
|
232 } |
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 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
|
234 } |
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 |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
236 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
|
237 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
|
238 { |
10653
5fe70b5da1b8
lib-storage: Moved mailbox directory creation code to mailbox_list backend.
Timo Sirainen <tss@iki.fi>
parents:
10652
diff
changeset
|
239 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
|
240 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
|
241 struct mail_index_view *view; |
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10720
diff
changeset
|
242 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
|
243 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
|
244 struct stat st; |
11484
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10720
diff
changeset
|
245 int ret; |
9977
0bb321c347ae
Split dbox (single-dbox) and mdbox (multi-dbox) into separate storage backends.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 |
15112
6e90fc8dfa25
lib-storage: Removed mailbox_list.create_mailbox_dir() virtual function.
Timo Sirainen <tss@iki.fi>
parents:
15100
diff
changeset
|
247 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
|
248 return ret; |
12710
42ca32299617
dbox: mailbox_create/update() might not have updated index header correctly.
Timo Sirainen <tss@iki.fi>
parents:
12387
diff
changeset
|
249 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
|
250 return -1; |
11484
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10720
diff
changeset
|
251 |
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
|
252 /* 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
|
253 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
|
254 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
|
255 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
|
256 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
|
257 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
|
258 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
|
259 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
|
260 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
|
261 "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
|
262 "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
|
263 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
|
264 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
|
265 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
|
266 } |
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 /* 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
|
268 } |
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 |
11484
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10720
diff
changeset
|
270 /* use syncing as a lock */ |
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10720
diff
changeset
|
271 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
|
272 if (ret <= 0) { |
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10720
diff
changeset
|
273 i_assert(ret != 0); |
13474
1903d5fd7e76
lib-storage: Minor error handling cleanups.
Timo Sirainen <tss@iki.fi>
parents:
12822
diff
changeset
|
274 mail_storage_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
|
275 return -1; |
11484
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10720
diff
changeset
|
276 } |
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10720
diff
changeset
|
277 |
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10720
diff
changeset
|
278 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
|
279 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
|
280 mail_index_sync_rollback(&sync_ctx); |
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10720
diff
changeset
|
281 return -1; |
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10720
diff
changeset
|
282 } |
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10720
diff
changeset
|
283 } |
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10720
diff
changeset
|
284 |
7fc5db26f6eb
dbox, mdbox: Fixed race conditions when creating mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
10720
diff
changeset
|
285 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
|
286 } |
15095
89c319980584
dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents:
15085
diff
changeset
|
287 |
89c319980584
dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents:
15085
diff
changeset
|
288 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
|
289 { |
15118
02d00843dd79
lib-storage: Cleanups to mailbox mkdir() related functions.
Timo Sirainen <tss@iki.fi>
parents:
15112
diff
changeset
|
290 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
|
291 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
|
292 |
15163
c7a99d41e39e
lib-storage: mailbox_get_path() and friends can now return an error.
Timo Sirainen <tss@iki.fi>
parents:
15162
diff
changeset
|
293 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
|
294 &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
|
295 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
|
296 |
89c319980584
dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents:
15085
diff
changeset
|
297 /* 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
|
298 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
|
299 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
|
300 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
|
301 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
|
302 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
|
303 } |
89c319980584
dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents:
15085
diff
changeset
|
304 |
89c319980584
dbox: Renamed dbox_sync_rebuild_verify_alt_storage() to dbox_verify_alt_storage()
Timo Sirainen <tss@iki.fi>
parents:
15085
diff
changeset
|
305 /* 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
|
306 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
|
307 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
|
308 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
|
309 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
|
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 } |