annotate src/lib-storage/mailbox-list.c @ 9658:8ba4253adc9b HEAD tip

*-login: SSL connections didn't get closed when the client got destroyed.
author Timo Sirainen <tss@iki.fi>
date Thu, 08 May 2014 16:41:29 +0300
parents fe9a5bb62470
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9532
00cd9aacd03c Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents: 9391
diff changeset
1 /* Copyright (c) 2006-2010 Dovecot authors, see the included COPYING file */
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "array.h"
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "ioloop.h"
9204
f3c6cabae3af Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
Timo Sirainen <tss@iki.fi>
parents: 9195
diff changeset
6 #include "mkdir-parents.h"
8382
bcf3a185bfc1 Enforce valid mUTF-7 names when creating new mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8335
diff changeset
7 #include "str.h"
6434
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
8 #include "home-expand.h"
5448
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
9 #include "unlink-directory.h"
6639
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
10 #include "imap-match.h"
8382
bcf3a185bfc1 Enforce valid mUTF-7 names when creating new mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8335
diff changeset
11 #include "imap-utf7.h"
6639
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
12 #include "mailbox-tree.h"
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include "mailbox-list-private.h"
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #include <time.h>
5550
3c8d3c722539 Added mailbox_list_get_permissions() and MAILBOX_LIST_ITER_RAW_LIST.
Timo Sirainen <tss@iki.fi>
parents: 5539
diff changeset
16 #include <unistd.h>
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 #include <dirent.h>
5550
3c8d3c722539 Added mailbox_list_get_permissions() and MAILBOX_LIST_ITER_RAW_LIST.
Timo Sirainen <tss@iki.fi>
parents: 5539
diff changeset
18 #include <sys/stat.h>
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 /* 20 * (200+1) < 4096 which is the standard PATH_MAX. Having these settings
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 prevents malicious user from creating eg. "a/a/a/.../a" mailbox name and
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 then start renaming them to larger names from end to beginning, which
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 eventually would start causing the failures when trying to use too
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 long mailbox names. */
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 #define MAILBOX_MAX_HIERARCHY_LEVELS 20
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 #define MAILBOX_MAX_HIERARCHY_NAME_LENGTH 200
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27
8079
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
28 struct ns_list_iterate_context {
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
29 struct mailbox_list_iterate_context ctx;
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
30 struct mailbox_list_iterate_context *backend_ctx;
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
31 struct mail_namespace *namespaces;
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
32 pool_t pool;
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
33 const char **patterns;
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
34 };
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
35
5450
7a6db5ec047d Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5448
diff changeset
36 struct mailbox_list_module_register mailbox_list_module_register = { 0 };
4814
Timo Sirainen <tss@iki.fi>
parents: 4808
diff changeset
37
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 void (*hook_mailbox_list_created)(struct mailbox_list *list);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 static ARRAY_DEFINE(mailbox_list_drivers, const struct mailbox_list *);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41
7245
dbb7f65e6307 Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
42 void mailbox_lists_init(void)
dbb7f65e6307 Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
43 {
dbb7f65e6307 Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
44 i_array_init(&mailbox_list_drivers, 4);
dbb7f65e6307 Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
45 }
dbb7f65e6307 Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
46
dbb7f65e6307 Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
47 void mailbox_lists_deinit(void)
dbb7f65e6307 Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
48 {
dbb7f65e6307 Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
49 array_free(&mailbox_list_drivers);
dbb7f65e6307 Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
50 }
dbb7f65e6307 Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
51
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 static bool mailbox_list_driver_find(const char *name, unsigned int *idx_r)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 const struct mailbox_list *const *drivers;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 unsigned int i, count;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 drivers = array_get(&mailbox_list_drivers, &count);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 for (i = 0; i < count; i++) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 if (strcasecmp(drivers[i]->name, name) == 0) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 *idx_r = i;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 return TRUE;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 return FALSE;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 void mailbox_list_register(const struct mailbox_list *list)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 {
7245
dbb7f65e6307 Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
69 unsigned int idx;
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70
7245
dbb7f65e6307 Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
71 if (mailbox_list_driver_find(list->name, &idx)) {
dbb7f65e6307 Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
72 i_fatal("mailbox_list_register(%s): duplicate driver",
dbb7f65e6307 Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
73 list->name);
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 array_append(&mailbox_list_drivers, &list, 1);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 void mailbox_list_unregister(const struct mailbox_list *list)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 unsigned int idx;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 if (!mailbox_list_driver_find(list->name, &idx)) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 i_fatal("mailbox_list_unregister(%s): unknown driver",
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 list->name);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 array_delete(&mailbox_list_drivers, idx, 1);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89
6256
0c9b6ff6fb0b Split mailbox_list_init() to _alloc() and _init(). _init() is called only
Timo Sirainen <tss@iki.fi>
parents: 6023
diff changeset
90 int mailbox_list_alloc(const char *driver, struct mailbox_list **list_r,
0c9b6ff6fb0b Split mailbox_list_init() to _alloc() and _init(). _init() is called only
Timo Sirainen <tss@iki.fi>
parents: 6023
diff changeset
91 const char **error_r)
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 const struct mailbox_list *const *class_p;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 struct mailbox_list *list;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 unsigned int idx;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97 if (!mailbox_list_driver_find(driver, &idx)) {
6023
56879cc53cec mail_storage.create() now returns error message string. Also fixed handling
Timo Sirainen <tss@iki.fi>
parents: 6007
diff changeset
98 *error_r = t_strdup_printf("Unknown mailbox list driver: %s",
56879cc53cec mail_storage.create() now returns error message string. Also fixed handling
Timo Sirainen <tss@iki.fi>
parents: 6007
diff changeset
99 driver);
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 return -1;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102
6256
0c9b6ff6fb0b Split mailbox_list_init() to _alloc() and _init(). _init() is called only
Timo Sirainen <tss@iki.fi>
parents: 6023
diff changeset
103 class_p = array_idx(&mailbox_list_drivers, idx);
0c9b6ff6fb0b Split mailbox_list_init() to _alloc() and _init(). _init() is called only
Timo Sirainen <tss@iki.fi>
parents: 6023
diff changeset
104 list = *list_r = (*class_p)->v.alloc();
0c9b6ff6fb0b Split mailbox_list_init() to _alloc() and _init(). _init() is called only
Timo Sirainen <tss@iki.fi>
parents: 6023
diff changeset
105 array_create(&list->module_contexts, list->pool, sizeof(void *), 5);
0c9b6ff6fb0b Split mailbox_list_init() to _alloc() and _init(). _init() is called only
Timo Sirainen <tss@iki.fi>
parents: 6023
diff changeset
106 return 0;
0c9b6ff6fb0b Split mailbox_list_init() to _alloc() and _init(). _init() is called only
Timo Sirainen <tss@iki.fi>
parents: 6023
diff changeset
107 }
0c9b6ff6fb0b Split mailbox_list_init() to _alloc() and _init(). _init() is called only
Timo Sirainen <tss@iki.fi>
parents: 6023
diff changeset
108
8329
c7d14e00c158 If a missing home directory is tried to be used, fail the namespace creation.
Timo Sirainen <tss@iki.fi>
parents: 8258
diff changeset
109 static int fix_path(struct mail_namespace *ns, const char *path,
9195
072a44932976 mail_location: Added support back for ~user/ expansion in paths.
Timo Sirainen <tss@iki.fi>
parents: 9168
diff changeset
110 const char **path_r, const char **error_r)
6434
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
111 {
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
112 size_t len = strlen(path);
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
113
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
114 if (len > 1 && path[len-1] == '/')
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
115 path = t_strndup(path, len-1);
9195
072a44932976 mail_location: Added support back for ~user/ expansion in paths.
Timo Sirainen <tss@iki.fi>
parents: 9168
diff changeset
116 if (path[0] == '~' && path[1] != '/') {
072a44932976 mail_location: Added support back for ~user/ expansion in paths.
Timo Sirainen <tss@iki.fi>
parents: 9168
diff changeset
117 /* ~otheruser/dir */
072a44932976 mail_location: Added support back for ~user/ expansion in paths.
Timo Sirainen <tss@iki.fi>
parents: 9168
diff changeset
118 if (home_try_expand(&path) < 0) {
072a44932976 mail_location: Added support back for ~user/ expansion in paths.
Timo Sirainen <tss@iki.fi>
parents: 9168
diff changeset
119 *error_r = t_strconcat(
072a44932976 mail_location: Added support back for ~user/ expansion in paths.
Timo Sirainen <tss@iki.fi>
parents: 9168
diff changeset
120 "No home directory for system user. "
072a44932976 mail_location: Added support back for ~user/ expansion in paths.
Timo Sirainen <tss@iki.fi>
parents: 9168
diff changeset
121 "Can't expand ", t_strcut(path, '/'),
072a44932976 mail_location: Added support back for ~user/ expansion in paths.
Timo Sirainen <tss@iki.fi>
parents: 9168
diff changeset
122 " for ", NULL);
072a44932976 mail_location: Added support back for ~user/ expansion in paths.
Timo Sirainen <tss@iki.fi>
parents: 9168
diff changeset
123 return -1;
072a44932976 mail_location: Added support back for ~user/ expansion in paths.
Timo Sirainen <tss@iki.fi>
parents: 9168
diff changeset
124 }
072a44932976 mail_location: Added support back for ~user/ expansion in paths.
Timo Sirainen <tss@iki.fi>
parents: 9168
diff changeset
125 } else {
072a44932976 mail_location: Added support back for ~user/ expansion in paths.
Timo Sirainen <tss@iki.fi>
parents: 9168
diff changeset
126 if (mail_user_try_home_expand(ns->user, &path) < 0) {
072a44932976 mail_location: Added support back for ~user/ expansion in paths.
Timo Sirainen <tss@iki.fi>
parents: 9168
diff changeset
127 *error_r = "Home directory not set for user. "
072a44932976 mail_location: Added support back for ~user/ expansion in paths.
Timo Sirainen <tss@iki.fi>
parents: 9168
diff changeset
128 "Can't expand ~/ for ";
072a44932976 mail_location: Added support back for ~user/ expansion in paths.
Timo Sirainen <tss@iki.fi>
parents: 9168
diff changeset
129 return -1;
072a44932976 mail_location: Added support back for ~user/ expansion in paths.
Timo Sirainen <tss@iki.fi>
parents: 9168
diff changeset
130 }
072a44932976 mail_location: Added support back for ~user/ expansion in paths.
Timo Sirainen <tss@iki.fi>
parents: 9168
diff changeset
131 }
8329
c7d14e00c158 If a missing home directory is tried to be used, fail the namespace creation.
Timo Sirainen <tss@iki.fi>
parents: 8258
diff changeset
132 *path_r = path;
c7d14e00c158 If a missing home directory is tried to be used, fail the namespace creation.
Timo Sirainen <tss@iki.fi>
parents: 8258
diff changeset
133 return 0;
6434
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
134 }
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
135
9143
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
136 static const char *split_next_arg(const char *const **_args)
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
137 {
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
138 const char *const *args = *_args;
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
139 const char *str = args[0];
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
140
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
141 args++;
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
142 while (*args != NULL && **args == '\0') {
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
143 args++;
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
144 if (*args == NULL) {
9391
d0e7d95ca46a mail_location: If it ends with ":", ignore it instead of adding ":" character.
Timo Sirainen <tss@iki.fi>
parents: 9349
diff changeset
145 /* string ends with ":", just ignore it. */
9143
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
146 break;
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
147 }
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
148 str = t_strconcat(str, ":", *args, NULL);
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
149 args++;
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
150 }
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
151 *_args = args;
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
152 return str;
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
153 }
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
154
6434
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
155 int mailbox_list_settings_parse(const char *data,
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
156 struct mailbox_list_settings *set,
8137
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
157 struct mail_namespace *ns,
6668
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6639
diff changeset
158 const char **layout, const char **alt_dir_r,
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6639
diff changeset
159 const char **error_r)
6434
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
160 {
9195
072a44932976 mail_location: Added support back for ~user/ expansion in paths.
Timo Sirainen <tss@iki.fi>
parents: 9168
diff changeset
161 const char *const *tmp, *key, *value, **dest, *str, *error;
6434
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
162
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
163 i_assert(*data != '\0');
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
164
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
165 *error_r = NULL;
6668
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6639
diff changeset
166 if (alt_dir_r != NULL)
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6639
diff changeset
167 *alt_dir_r = NULL;
6434
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
168
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
169 /* <root dir> */
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
170 tmp = t_strsplit(data, ":");
9143
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
171 str = split_next_arg(&tmp);
9195
072a44932976 mail_location: Added support back for ~user/ expansion in paths.
Timo Sirainen <tss@iki.fi>
parents: 9168
diff changeset
172 if (fix_path(ns, str, &set->root_dir, &error) < 0) {
072a44932976 mail_location: Added support back for ~user/ expansion in paths.
Timo Sirainen <tss@iki.fi>
parents: 9168
diff changeset
173 *error_r = t_strconcat(error, "mail root dir in: ", data, NULL);
8329
c7d14e00c158 If a missing home directory is tried to be used, fail the namespace creation.
Timo Sirainen <tss@iki.fi>
parents: 8258
diff changeset
174 return -1;
c7d14e00c158 If a missing home directory is tried to be used, fail the namespace creation.
Timo Sirainen <tss@iki.fi>
parents: 8258
diff changeset
175 }
6434
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
176
9143
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
177 while (*tmp != NULL) {
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
178 str = split_next_arg(&tmp);
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
179 value = strchr(str, '=');
6434
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
180 if (value == NULL) {
9143
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
181 key = str;
6434
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
182 value = "";
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
183 } else {
9143
675f0df22f24 mail_location: Allow using ":" characters in dir names by escaping it as "::".
Timo Sirainen <tss@iki.fi>
parents: 9129
diff changeset
184 key = t_strdup_until(str, value);
6434
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
185 value++;
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
186 }
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
187
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
188 if (strcmp(key, "INBOX") == 0)
8329
c7d14e00c158 If a missing home directory is tried to be used, fail the namespace creation.
Timo Sirainen <tss@iki.fi>
parents: 8258
diff changeset
189 dest = &set->inbox_path;
6434
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
190 else if (strcmp(key, "INDEX") == 0)
8329
c7d14e00c158 If a missing home directory is tried to be used, fail the namespace creation.
Timo Sirainen <tss@iki.fi>
parents: 8258
diff changeset
191 dest = &set->index_dir;
6434
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
192 else if (strcmp(key, "CONTROL") == 0)
8329
c7d14e00c158 If a missing home directory is tried to be used, fail the namespace creation.
Timo Sirainen <tss@iki.fi>
parents: 8258
diff changeset
193 dest = &set->control_dir;
6668
4a3cc2968040 Support for looking up dbox files from an alternative directory if they're
Timo Sirainen <tss@iki.fi>
parents: 6639
diff changeset
194 else if (strcmp(key, "ALT") == 0 && alt_dir_r != NULL)
8329
c7d14e00c158 If a missing home directory is tried to be used, fail the namespace creation.
Timo Sirainen <tss@iki.fi>
parents: 8258
diff changeset
195 dest = alt_dir_r;
6434
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
196 else if (strcmp(key, "LAYOUT") == 0)
8329
c7d14e00c158 If a missing home directory is tried to be used, fail the namespace creation.
Timo Sirainen <tss@iki.fi>
parents: 8258
diff changeset
197 dest = layout;
6434
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
198 else if (strcmp(key, "SUBSCRIPTIONS") == 0)
8329
c7d14e00c158 If a missing home directory is tried to be used, fail the namespace creation.
Timo Sirainen <tss@iki.fi>
parents: 8258
diff changeset
199 dest = &set->subscription_fname;
6434
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
200 else if (strcmp(key, "DIRNAME") == 0)
8329
c7d14e00c158 If a missing home directory is tried to be used, fail the namespace creation.
Timo Sirainen <tss@iki.fi>
parents: 8258
diff changeset
201 dest = &set->maildir_name;
8816
0e7e25da544c Added :MAILBOXDIR= to mail_location to specify the root dir for mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8803
diff changeset
202 else if (strcmp(key, "MAILBOXDIR") == 0)
0e7e25da544c Added :MAILBOXDIR= to mail_location to specify the root dir for mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8803
diff changeset
203 dest = &set->mailbox_dir_name;
6434
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
204 else {
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
205 *error_r = t_strdup_printf("Unknown setting: %s", key);
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
206 return -1;
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
207 }
9195
072a44932976 mail_location: Added support back for ~user/ expansion in paths.
Timo Sirainen <tss@iki.fi>
parents: 9168
diff changeset
208 if (fix_path(ns, value, dest, &error) < 0) {
072a44932976 mail_location: Added support back for ~user/ expansion in paths.
Timo Sirainen <tss@iki.fi>
parents: 9168
diff changeset
209 *error_r = t_strconcat(error, key, " in: ", data, NULL);
8329
c7d14e00c158 If a missing home directory is tried to be used, fail the namespace creation.
Timo Sirainen <tss@iki.fi>
parents: 8258
diff changeset
210 return -1;
c7d14e00c158 If a missing home directory is tried to be used, fail the namespace creation.
Timo Sirainen <tss@iki.fi>
parents: 8258
diff changeset
211 }
6434
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
212 }
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
213
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
214 if (set->index_dir != NULL && strcmp(set->index_dir, "MEMORY") == 0)
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
215 set->index_dir = "";
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
216 return 0;
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
217 }
7b745fb85975 Moved mail_location data parsing to a common function. It supports now also
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
218
6256
0c9b6ff6fb0b Split mailbox_list_init() to _alloc() and _init(). _init() is called only
Timo Sirainen <tss@iki.fi>
parents: 6023
diff changeset
219 void mailbox_list_init(struct mailbox_list *list, struct mail_namespace *ns,
0c9b6ff6fb0b Split mailbox_list_init() to _alloc() and _init(). _init() is called only
Timo Sirainen <tss@iki.fi>
parents: 6023
diff changeset
220 const struct mailbox_list_settings *set,
0c9b6ff6fb0b Split mailbox_list_init() to _alloc() and _init(). _init() is called only
Timo Sirainen <tss@iki.fi>
parents: 6023
diff changeset
221 enum mailbox_list_flags flags)
0c9b6ff6fb0b Split mailbox_list_init() to _alloc() and _init(). _init() is called only
Timo Sirainen <tss@iki.fi>
parents: 6023
diff changeset
222 {
5486
61ef8b18a12c assert updates
Timo Sirainen <tss@iki.fi>
parents: 5473
diff changeset
223 i_assert(set->root_dir == NULL || *set->root_dir != '\0');
61ef8b18a12c assert updates
Timo Sirainen <tss@iki.fi>
parents: 5473
diff changeset
224 i_assert(set->subscription_fname == NULL ||
61ef8b18a12c assert updates
Timo Sirainen <tss@iki.fi>
parents: 5473
diff changeset
225 *set->subscription_fname != '\0');
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226
5539
7d828d1b39ab Added mailbox_list to struct mail_namespace. Added a few functions to get
Timo Sirainen <tss@iki.fi>
parents: 5486
diff changeset
227 list->ns = ns;
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 list->flags = flags;
6770
083681d2f4fb Simplified mailbox_list_get_permissions() a bit. Now it returns only
Timo Sirainen <tss@iki.fi>
parents: 6668
diff changeset
229 list->file_create_mode = (mode_t)-1;
8769
cc8d4d06ef9f mailboxes: Copy root directory's +x modes for newly created dirs perfectly.
Timo Sirainen <tss@iki.fi>
parents: 8767
diff changeset
230 list->dir_create_mode = (mode_t)-1;
6770
083681d2f4fb Simplified mailbox_list_get_permissions() a bit. Now it returns only
Timo Sirainen <tss@iki.fi>
parents: 6668
diff changeset
231 list->file_create_gid = (gid_t)-1;
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 /* copy settings */
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 list->set.root_dir = p_strdup(list->pool, set->root_dir);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235 list->set.index_dir = set->index_dir == NULL ||
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 strcmp(set->index_dir, set->root_dir) == 0 ? NULL :
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 p_strdup(list->pool, set->index_dir);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 list->set.control_dir = set->control_dir == NULL ||
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 strcmp(set->control_dir, set->root_dir) == 0 ? NULL :
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 p_strdup(list->pool, set->control_dir);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 list->set.inbox_path = p_strdup(list->pool, set->inbox_path);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 list->set.subscription_fname =
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 p_strdup(list->pool, set->subscription_fname);
8399
155700456194 Fixed dbox to work with Maildir++ layout.
Timo Sirainen <tss@iki.fi>
parents: 8382
diff changeset
245 list->set.maildir_name =
155700456194 Fixed dbox to work with Maildir++ layout.
Timo Sirainen <tss@iki.fi>
parents: 8382
diff changeset
246 (list->props & MAILBOX_LIST_PROP_NO_MAILDIR_NAME) != 0 ? "" :
155700456194 Fixed dbox to work with Maildir++ layout.
Timo Sirainen <tss@iki.fi>
parents: 8382
diff changeset
247 p_strdup(list->pool, set->maildir_name);
8838
50815f24cc22 MAILBOXDIR changes broke some setups.
Timo Sirainen <tss@iki.fi>
parents: 8816
diff changeset
248
8999
afc1b0ef120d When :MAILBOXDIR= was empty, we might have appended extra '/' to it, which caused problems.
Timo Sirainen <tss@iki.fi>
parents: 8838
diff changeset
249 if (set->mailbox_dir_name == NULL || *set->mailbox_dir_name == '\0')
8838
50815f24cc22 MAILBOXDIR changes broke some setups.
Timo Sirainen <tss@iki.fi>
parents: 8816
diff changeset
250 list->set.mailbox_dir_name = "";
50815f24cc22 MAILBOXDIR changes broke some setups.
Timo Sirainen <tss@iki.fi>
parents: 8816
diff changeset
251 else if (set->mailbox_dir_name[strlen(set->mailbox_dir_name)-1] == '/') {
50815f24cc22 MAILBOXDIR changes broke some setups.
Timo Sirainen <tss@iki.fi>
parents: 8816
diff changeset
252 list->set.mailbox_dir_name =
50815f24cc22 MAILBOXDIR changes broke some setups.
Timo Sirainen <tss@iki.fi>
parents: 8816
diff changeset
253 p_strdup(list->pool, set->mailbox_dir_name);
50815f24cc22 MAILBOXDIR changes broke some setups.
Timo Sirainen <tss@iki.fi>
parents: 8816
diff changeset
254 } else {
50815f24cc22 MAILBOXDIR changes broke some setups.
Timo Sirainen <tss@iki.fi>
parents: 8816
diff changeset
255 list->set.mailbox_dir_name =
50815f24cc22 MAILBOXDIR changes broke some setups.
Timo Sirainen <tss@iki.fi>
parents: 8816
diff changeset
256 p_strconcat(list->pool, set->mailbox_dir_name, "/", NULL);
50815f24cc22 MAILBOXDIR changes broke some setups.
Timo Sirainen <tss@iki.fi>
parents: 8816
diff changeset
257 }
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258
4848
967de900c73a Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents: 4814
diff changeset
259 list->set.mail_storage_flags = set->mail_storage_flags;
4876
f1d77064884c Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents: 4848
diff changeset
260 list->set.lock_method = set->lock_method;
4848
967de900c73a Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents: 4814
diff changeset
261
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 if ((flags & MAILBOX_LIST_FLAG_DEBUG) != 0) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 i_info("%s: root=%s, index=%s, control=%s, inbox=%s",
8258
7db59981c1a0 Shared mailboxes: Don't crash in some systems when debug logging NULL root_dir.
Timo Sirainen <tss@iki.fi>
parents: 8137
diff changeset
264 list->name,
7db59981c1a0 Shared mailboxes: Don't crash in some systems when debug logging NULL root_dir.
Timo Sirainen <tss@iki.fi>
parents: 8137
diff changeset
265 list->set.root_dir == NULL ? "" : list->set.root_dir,
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266 list->set.index_dir == NULL ? "" : list->set.index_dir,
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 list->set.control_dir == NULL ?
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 "" : list->set.control_dir,
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 list->set.inbox_path == NULL ?
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 "" : list->set.inbox_path);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 if (hook_mailbox_list_created != NULL)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 hook_mailbox_list_created(list);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275
4848
967de900c73a Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents: 4814
diff changeset
276 list->set.mail_storage_flags = NULL;
4876
f1d77064884c Lock handling changes. Everything goes through file-lock API now and there's
Timo Sirainen <tss@iki.fi>
parents: 4848
diff changeset
277 list->set.lock_method = NULL;
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 void mailbox_list_deinit(struct mailbox_list *list)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 {
5613
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
282 i_free_and_null(list->error_string);
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284 list->v.deinit(list);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7494
diff changeset
287 const char *mailbox_list_get_driver_name(const struct mailbox_list *list)
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289 return list->name;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7494
diff changeset
292 char mailbox_list_get_hierarchy_sep(const struct mailbox_list *list)
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 return list->hierarchy_sep;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7494
diff changeset
297 enum mailbox_list_flags mailbox_list_get_flags(const struct mailbox_list *list)
5539
7d828d1b39ab Added mailbox_list to struct mail_namespace. Added a few functions to get
Timo Sirainen <tss@iki.fi>
parents: 5486
diff changeset
298 {
7d828d1b39ab Added mailbox_list to struct mail_namespace. Added a few functions to get
Timo Sirainen <tss@iki.fi>
parents: 5486
diff changeset
299 return list->flags;
7d828d1b39ab Added mailbox_list to struct mail_namespace. Added a few functions to get
Timo Sirainen <tss@iki.fi>
parents: 5486
diff changeset
300 }
7d828d1b39ab Added mailbox_list to struct mail_namespace. Added a few functions to get
Timo Sirainen <tss@iki.fi>
parents: 5486
diff changeset
301
7912
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7494
diff changeset
302 struct mail_namespace *
81806d402514 Added more consts, ATTR_CONSTs and ATTR_PUREs.
Timo Sirainen <tss@iki.fi>
parents: 7494
diff changeset
303 mailbox_list_get_namespace(const struct mailbox_list *list)
5539
7d828d1b39ab Added mailbox_list to struct mail_namespace. Added a few functions to get
Timo Sirainen <tss@iki.fi>
parents: 5486
diff changeset
304 {
7d828d1b39ab Added mailbox_list to struct mail_namespace. Added a few functions to get
Timo Sirainen <tss@iki.fi>
parents: 5486
diff changeset
305 return list->ns;
7d828d1b39ab Added mailbox_list to struct mail_namespace. Added a few functions to get
Timo Sirainen <tss@iki.fi>
parents: 5486
diff changeset
306 }
7d828d1b39ab Added mailbox_list to struct mail_namespace. Added a few functions to get
Timo Sirainen <tss@iki.fi>
parents: 5486
diff changeset
307
8784
89e4d5da5ba7 mbox: Creating directories based on mbox file's mode dropped +x permissions.
Timo Sirainen <tss@iki.fi>
parents: 8769
diff changeset
308 static mode_t get_dir_mode(mode_t mode)
89e4d5da5ba7 mbox: Creating directories based on mbox file's mode dropped +x permissions.
Timo Sirainen <tss@iki.fi>
parents: 8769
diff changeset
309 {
89e4d5da5ba7 mbox: Creating directories based on mbox file's mode dropped +x permissions.
Timo Sirainen <tss@iki.fi>
parents: 8769
diff changeset
310 /* add the execute bit if either read or write bit is set */
89e4d5da5ba7 mbox: Creating directories based on mbox file's mode dropped +x permissions.
Timo Sirainen <tss@iki.fi>
parents: 8769
diff changeset
311 if ((mode & 0600) != 0) mode |= 0100;
89e4d5da5ba7 mbox: Creating directories based on mbox file's mode dropped +x permissions.
Timo Sirainen <tss@iki.fi>
parents: 8769
diff changeset
312 if ((mode & 0060) != 0) mode |= 0010;
89e4d5da5ba7 mbox: Creating directories based on mbox file's mode dropped +x permissions.
Timo Sirainen <tss@iki.fi>
parents: 8769
diff changeset
313 if ((mode & 0006) != 0) mode |= 0001;
89e4d5da5ba7 mbox: Creating directories based on mbox file's mode dropped +x permissions.
Timo Sirainen <tss@iki.fi>
parents: 8769
diff changeset
314 return mode;
89e4d5da5ba7 mbox: Creating directories based on mbox file's mode dropped +x permissions.
Timo Sirainen <tss@iki.fi>
parents: 8769
diff changeset
315 }
89e4d5da5ba7 mbox: Creating directories based on mbox file's mode dropped +x permissions.
Timo Sirainen <tss@iki.fi>
parents: 8769
diff changeset
316
9105
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
317 static void
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
318 mailbox_list_get_permissions_full(struct mailbox_list *list, const char *name,
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
319 mode_t *file_mode_r, mode_t *dir_mode_r,
9168
2bbf175bb6d3 Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
320 gid_t *gid_r, const char **gid_origin_r)
6770
083681d2f4fb Simplified mailbox_list_get_permissions() a bit. Now it returns only
Timo Sirainen <tss@iki.fi>
parents: 6668
diff changeset
321 {
083681d2f4fb Simplified mailbox_list_get_permissions() a bit. Now it returns only
Timo Sirainen <tss@iki.fi>
parents: 6668
diff changeset
322 const char *path;
083681d2f4fb Simplified mailbox_list_get_permissions() a bit. Now it returns only
Timo Sirainen <tss@iki.fi>
parents: 6668
diff changeset
323 struct stat st;
083681d2f4fb Simplified mailbox_list_get_permissions() a bit. Now it returns only
Timo Sirainen <tss@iki.fi>
parents: 6668
diff changeset
324
8767
e82e0a6b9399 Create all mail/index files'/dirs' permissions based on the mailbox directory.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
325 path = mailbox_list_get_path(list, name, MAILBOX_LIST_PATH_TYPE_DIR);
6770
083681d2f4fb Simplified mailbox_list_get_permissions() a bit. Now it returns only
Timo Sirainen <tss@iki.fi>
parents: 6668
diff changeset
326 if (stat(path, &st) < 0) {
083681d2f4fb Simplified mailbox_list_get_permissions() a bit. Now it returns only
Timo Sirainen <tss@iki.fi>
parents: 6668
diff changeset
327 if (!ENOTFOUND(errno)) {
083681d2f4fb Simplified mailbox_list_get_permissions() a bit. Now it returns only
Timo Sirainen <tss@iki.fi>
parents: 6668
diff changeset
328 mailbox_list_set_critical(list, "stat(%s) failed: %m",
083681d2f4fb Simplified mailbox_list_get_permissions() a bit. Now it returns only
Timo Sirainen <tss@iki.fi>
parents: 6668
diff changeset
329 path);
8033
38897ffeec2d If mail_debug=yes: Log which per-namespace file permissions are used.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
330 } else if ((list->flags & MAILBOX_LIST_FLAG_DEBUG) != 0) {
38897ffeec2d If mail_debug=yes: Log which per-namespace file permissions are used.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
331 i_info("Namespace %s: Permission lookup failed from %s",
38897ffeec2d If mail_debug=yes: Log which per-namespace file permissions are used.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
332 list->ns->prefix, path);
6770
083681d2f4fb Simplified mailbox_list_get_permissions() a bit. Now it returns only
Timo Sirainen <tss@iki.fi>
parents: 6668
diff changeset
333 }
9129
0cdb6c23683f When getting fs permissions for a non-existing mailbox, fallback to root dir's permissions.
Timo Sirainen <tss@iki.fi>
parents: 9108
diff changeset
334 if (name != NULL) {
0cdb6c23683f When getting fs permissions for a non-existing mailbox, fallback to root dir's permissions.
Timo Sirainen <tss@iki.fi>
parents: 9108
diff changeset
335 /* return defaults */
0cdb6c23683f When getting fs permissions for a non-existing mailbox, fallback to root dir's permissions.
Timo Sirainen <tss@iki.fi>
parents: 9108
diff changeset
336 mailbox_list_get_permissions_full(list, NULL,
0cdb6c23683f When getting fs permissions for a non-existing mailbox, fallback to root dir's permissions.
Timo Sirainen <tss@iki.fi>
parents: 9108
diff changeset
337 file_mode_r,
9168
2bbf175bb6d3 Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
338 dir_mode_r, gid_r,
2bbf175bb6d3 Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
339 gid_origin_r);
9129
0cdb6c23683f When getting fs permissions for a non-existing mailbox, fallback to root dir's permissions.
Timo Sirainen <tss@iki.fi>
parents: 9108
diff changeset
340 return;
0cdb6c23683f When getting fs permissions for a non-existing mailbox, fallback to root dir's permissions.
Timo Sirainen <tss@iki.fi>
parents: 9108
diff changeset
341 }
6770
083681d2f4fb Simplified mailbox_list_get_permissions() a bit. Now it returns only
Timo Sirainen <tss@iki.fi>
parents: 6668
diff changeset
342 /* return safe defaults */
9105
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
343 *file_mode_r = 0600;
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
344 *dir_mode_r = 0700;
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
345 *gid_r = (gid_t)-1;
9168
2bbf175bb6d3 Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
346 *gid_origin_r = "defaults";
9105
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
347 } else {
9640
fe9a5bb62470 lib-storage: Fixed creating indexes for read-only mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
348 *file_mode_r = (st.st_mode & 0666) | 0600;
fe9a5bb62470 lib-storage: Fixed creating indexes for read-only mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 9532
diff changeset
349 *dir_mode_r = (st.st_mode & 0777) | 0700;
9168
2bbf175bb6d3 Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
350 *gid_origin_r = path;
9105
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
351
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
352 if (!S_ISDIR(st.st_mode)) {
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
353 /* we're getting permissions from a file.
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
354 apply +x modes as necessary. */
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
355 *dir_mode_r = get_dir_mode(*dir_mode_r);
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
356 }
8803
fe4782341037 mailbox_list_get_dir_permissions() returned broken permissions if root dir didn't exist.
Timo Sirainen <tss@iki.fi>
parents: 8784
diff changeset
357
9105
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
358 if (S_ISDIR(st.st_mode) && (st.st_mode & S_ISGID) != 0) {
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
359 /* directory's GID is used automatically for new
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
360 files */
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
361 *gid_r = (gid_t)-1;
9108
e7c0b3068d58 More group permission handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 9105
diff changeset
362 } else if ((st.st_mode & 0070) >> 3 == (st.st_mode & 0007)) {
e7c0b3068d58 More group permission handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 9105
diff changeset
363 /* group has same permissions as world, so don't bother
9105
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
364 changing it */
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
365 *gid_r = (gid_t)-1;
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
366 } else if (getegid() == st.st_gid) {
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
367 /* using our own gid, no need to change it */
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
368 *gid_r = (gid_t)-1;
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
369 } else {
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
370 *gid_r = st.st_gid;
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
371 }
6770
083681d2f4fb Simplified mailbox_list_get_permissions() a bit. Now it returns only
Timo Sirainen <tss@iki.fi>
parents: 6668
diff changeset
372 }
083681d2f4fb Simplified mailbox_list_get_permissions() a bit. Now it returns only
Timo Sirainen <tss@iki.fi>
parents: 6668
diff changeset
373
9105
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
374 if (name == NULL) {
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
375 list->file_create_mode = *file_mode_r;
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
376 list->dir_create_mode = *dir_mode_r;
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
377 list->file_create_gid = *gid_r;
9168
2bbf175bb6d3 Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
378 list->file_create_gid_origin =
2bbf175bb6d3 Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
379 p_strdup(list->pool, *gid_origin_r);
6770
083681d2f4fb Simplified mailbox_list_get_permissions() a bit. Now it returns only
Timo Sirainen <tss@iki.fi>
parents: 6668
diff changeset
380 }
083681d2f4fb Simplified mailbox_list_get_permissions() a bit. Now it returns only
Timo Sirainen <tss@iki.fi>
parents: 6668
diff changeset
381
8767
e82e0a6b9399 Create all mail/index files'/dirs' permissions based on the mailbox directory.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
382 if ((list->flags & MAILBOX_LIST_FLAG_DEBUG) != 0 && name == NULL) {
8033
38897ffeec2d If mail_debug=yes: Log which per-namespace file permissions are used.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
383 i_info("Namespace %s: Using permissions from %s: "
38897ffeec2d If mail_debug=yes: Log which per-namespace file permissions are used.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
384 "mode=0%o gid=%ld", list->ns->prefix, path,
8769
cc8d4d06ef9f mailboxes: Copy root directory's +x modes for newly created dirs perfectly.
Timo Sirainen <tss@iki.fi>
parents: 8767
diff changeset
385 (int)list->dir_create_mode,
8033
38897ffeec2d If mail_debug=yes: Log which per-namespace file permissions are used.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
386 list->file_create_gid == (gid_t)-1 ? -1L :
38897ffeec2d If mail_debug=yes: Log which per-namespace file permissions are used.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
387 (long)list->file_create_gid);
38897ffeec2d If mail_debug=yes: Log which per-namespace file permissions are used.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
388 }
9105
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
389 }
8033
38897ffeec2d If mail_debug=yes: Log which per-namespace file permissions are used.
Timo Sirainen <tss@iki.fi>
parents: 7912
diff changeset
390
9168
2bbf175bb6d3 Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
391 void mailbox_list_get_permissions(struct mailbox_list *list,
2bbf175bb6d3 Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
392 const char *name,
2bbf175bb6d3 Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
393 mode_t *mode_r, gid_t *gid_r,
2bbf175bb6d3 Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
394 const char **gid_origin_r)
9105
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
395 {
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
396 mode_t dir_mode;
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
397
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
398 if (list->file_create_mode != (mode_t)-1 && name == NULL) {
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
399 *mode_r = list->file_create_mode;
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
400 *gid_r = list->file_create_gid;
9168
2bbf175bb6d3 Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
401 *gid_origin_r = list->file_create_gid_origin;
9105
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
402 return;
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
403 }
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
404
9168
2bbf175bb6d3 Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
405 mailbox_list_get_permissions_full(list, name, mode_r, &dir_mode, gid_r,
2bbf175bb6d3 Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
406 gid_origin_r);
6770
083681d2f4fb Simplified mailbox_list_get_permissions() a bit. Now it returns only
Timo Sirainen <tss@iki.fi>
parents: 6668
diff changeset
407 }
083681d2f4fb Simplified mailbox_list_get_permissions() a bit. Now it returns only
Timo Sirainen <tss@iki.fi>
parents: 6668
diff changeset
408
8037
ab1c170b1559 Use permissions based on mail root directory when creating new files/dirs under it.
Timo Sirainen <tss@iki.fi>
parents: 8033
diff changeset
409 void mailbox_list_get_dir_permissions(struct mailbox_list *list,
8767
e82e0a6b9399 Create all mail/index files'/dirs' permissions based on the mailbox directory.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
410 const char *name,
9168
2bbf175bb6d3 Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
411 mode_t *mode_r, gid_t *gid_r,
2bbf175bb6d3 Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
412 const char **gid_origin_r)
8037
ab1c170b1559 Use permissions based on mail root directory when creating new files/dirs under it.
Timo Sirainen <tss@iki.fi>
parents: 8033
diff changeset
413 {
9105
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
414 mode_t file_mode;
8037
ab1c170b1559 Use permissions based on mail root directory when creating new files/dirs under it.
Timo Sirainen <tss@iki.fi>
parents: 8033
diff changeset
415
9105
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
416 if (list->dir_create_mode != (mode_t)-1 && name == NULL) {
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
417 *mode_r = list->dir_create_mode;
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
418 *gid_r = list->file_create_gid;
9168
2bbf175bb6d3 Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
419 *gid_origin_r = list->file_create_gid_origin;
9105
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
420 return;
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
421 }
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
422
2f2a907f1132 storage: Create index/control root directories using same permissions as mail root.
Timo Sirainen <tss@iki.fi>
parents: 9046
diff changeset
423 mailbox_list_get_permissions_full(list, name, &file_mode,
9168
2bbf175bb6d3 Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9143
diff changeset
424 mode_r, gid_r, gid_origin_r);
8037
ab1c170b1559 Use permissions based on mail root directory when creating new files/dirs under it.
Timo Sirainen <tss@iki.fi>
parents: 8033
diff changeset
425 }
ab1c170b1559 Use permissions based on mail root directory when creating new files/dirs under it.
Timo Sirainen <tss@iki.fi>
parents: 8033
diff changeset
426
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5807
diff changeset
427 bool mailbox_list_is_valid_pattern(struct mailbox_list *list,
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5807
diff changeset
428 const char *pattern)
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
429 {
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5807
diff changeset
430 return list->v.is_valid_pattern(list, pattern);
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
431 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
432
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
433 bool mailbox_list_is_valid_existing_name(struct mailbox_list *list,
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434 const char *name)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435 {
9349
a5d530edfafe lib-storage: Allow selecting namespace prefix even when list=no.
Timo Sirainen <tss@iki.fi>
parents: 9303
diff changeset
436 if (*name == '\0' && *list->ns->prefix != '\0') {
9276
13fa572535f0 Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents: 9204
diff changeset
437 /* an ugly way to get to mailbox root (e.g. Maildir/ when
13fa572535f0 Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents: 9204
diff changeset
438 it's not the INBOX) */
13fa572535f0 Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents: 9204
diff changeset
439 return TRUE;
13fa572535f0 Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents: 9204
diff changeset
440 }
13fa572535f0 Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents: 9204
diff changeset
441
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
442 return list->v.is_valid_existing_name(list, name);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
443 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
444
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
445 bool mailbox_list_is_valid_create_name(struct mailbox_list *list,
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
446 const char *name)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
447 {
9289
e57d5c9daed3 lib-storage: Disallow control characters in mailbox names when creating them.
Timo Sirainen <tss@iki.fi>
parents: 9276
diff changeset
448 const char *p;
8382
bcf3a185bfc1 Enforce valid mUTF-7 names when creating new mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8335
diff changeset
449 int ret;
bcf3a185bfc1 Enforce valid mUTF-7 names when creating new mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8335
diff changeset
450
9289
e57d5c9daed3 lib-storage: Disallow control characters in mailbox names when creating them.
Timo Sirainen <tss@iki.fi>
parents: 9276
diff changeset
451 /* safer to just disallow all control characters */
e57d5c9daed3 lib-storage: Disallow control characters in mailbox names when creating them.
Timo Sirainen <tss@iki.fi>
parents: 9276
diff changeset
452 for (p = name; *p != '\0'; p++) {
e57d5c9daed3 lib-storage: Disallow control characters in mailbox names when creating them.
Timo Sirainen <tss@iki.fi>
parents: 9276
diff changeset
453 if (*p < ' ')
e57d5c9daed3 lib-storage: Disallow control characters in mailbox names when creating them.
Timo Sirainen <tss@iki.fi>
parents: 9276
diff changeset
454 return FALSE;
e57d5c9daed3 lib-storage: Disallow control characters in mailbox names when creating them.
Timo Sirainen <tss@iki.fi>
parents: 9276
diff changeset
455 }
e57d5c9daed3 lib-storage: Disallow control characters in mailbox names when creating them.
Timo Sirainen <tss@iki.fi>
parents: 9276
diff changeset
456
8382
bcf3a185bfc1 Enforce valid mUTF-7 names when creating new mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8335
diff changeset
457 T_BEGIN {
bcf3a185bfc1 Enforce valid mUTF-7 names when creating new mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8335
diff changeset
458 string_t *str = t_str_new(256);
bcf3a185bfc1 Enforce valid mUTF-7 names when creating new mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8335
diff changeset
459 ret = imap_utf7_to_utf8(name, str);
bcf3a185bfc1 Enforce valid mUTF-7 names when creating new mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8335
diff changeset
460 } T_END;
bcf3a185bfc1 Enforce valid mUTF-7 names when creating new mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8335
diff changeset
461 return ret < 0 ? FALSE :
bcf3a185bfc1 Enforce valid mUTF-7 names when creating new mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8335
diff changeset
462 list->v.is_valid_create_name(list, name);
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
463 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
464
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
465 const char *mailbox_list_get_path(struct mailbox_list *list, const char *name,
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
466 enum mailbox_list_path_type type)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
467 {
5470
402796d50c3e Moved some common code to mailbox-list.c
Timo Sirainen <tss@iki.fi>
parents: 5450
diff changeset
468 mailbox_list_clear_error(list);
402796d50c3e Moved some common code to mailbox-list.c
Timo Sirainen <tss@iki.fi>
parents: 5450
diff changeset
469
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
470 return list->v.get_path(list, name, type);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
471 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
472
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
473 const char *mailbox_list_get_temp_prefix(struct mailbox_list *list)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
474 {
6959
a1e271317eb2 Added mailbox_list_get_global_temp_prefix()
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
475 return list->v.get_temp_prefix(list, FALSE);
a1e271317eb2 Added mailbox_list_get_global_temp_prefix()
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
476 }
a1e271317eb2 Added mailbox_list_get_global_temp_prefix()
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
477
a1e271317eb2 Added mailbox_list_get_global_temp_prefix()
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
478 const char *mailbox_list_get_global_temp_prefix(struct mailbox_list *list)
a1e271317eb2 Added mailbox_list_get_global_temp_prefix()
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
479 {
a1e271317eb2 Added mailbox_list_get_global_temp_prefix()
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
480 return list->v.get_temp_prefix(list, TRUE);
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
481 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
482
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5807
diff changeset
483 const char *mailbox_list_join_refpattern(struct mailbox_list *list,
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5807
diff changeset
484 const char *ref, const char *pattern)
4848
967de900c73a Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents: 4814
diff changeset
485 {
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5807
diff changeset
486 if (list->v.join_refpattern != NULL)
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5807
diff changeset
487 return list->v.join_refpattern(list, ref, pattern);
5470
402796d50c3e Moved some common code to mailbox-list.c
Timo Sirainen <tss@iki.fi>
parents: 5450
diff changeset
488
402796d50c3e Moved some common code to mailbox-list.c
Timo Sirainen <tss@iki.fi>
parents: 5450
diff changeset
489 /* the default implementation: */
402796d50c3e Moved some common code to mailbox-list.c
Timo Sirainen <tss@iki.fi>
parents: 5450
diff changeset
490 if (*ref != '\0') {
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5807
diff changeset
491 /* merge reference and pattern */
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5807
diff changeset
492 pattern = t_strconcat(ref, pattern, NULL);
5470
402796d50c3e Moved some common code to mailbox-list.c
Timo Sirainen <tss@iki.fi>
parents: 5450
diff changeset
493 }
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5807
diff changeset
494 return pattern;
4848
967de900c73a Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents: 4814
diff changeset
495 }
967de900c73a Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents: 4814
diff changeset
496
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
497 int mailbox_list_get_mailbox_name_status(struct mailbox_list *list,
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
498 const char *name,
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
499 enum mailbox_name_status *status)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
500 {
5470
402796d50c3e Moved some common code to mailbox-list.c
Timo Sirainen <tss@iki.fi>
parents: 5450
diff changeset
501 mailbox_list_clear_error(list);
402796d50c3e Moved some common code to mailbox-list.c
Timo Sirainen <tss@iki.fi>
parents: 5450
diff changeset
502
402796d50c3e Moved some common code to mailbox-list.c
Timo Sirainen <tss@iki.fi>
parents: 5450
diff changeset
503 if (!mailbox_list_is_valid_existing_name(list, name)) {
402796d50c3e Moved some common code to mailbox-list.c
Timo Sirainen <tss@iki.fi>
parents: 5450
diff changeset
504 *status = MAILBOX_NAME_INVALID;
402796d50c3e Moved some common code to mailbox-list.c
Timo Sirainen <tss@iki.fi>
parents: 5450
diff changeset
505 return 0;
402796d50c3e Moved some common code to mailbox-list.c
Timo Sirainen <tss@iki.fi>
parents: 5450
diff changeset
506 }
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
507 return list->v.get_mailbox_name_status(list, name, status);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
508 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
509
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
510 struct mailbox_list_iterate_context *
5839
978722ad6184 s/mask/pattern/ for mailbox listing.
Timo Sirainen <tss@iki.fi>
parents: 5807
diff changeset
511 mailbox_list_iter_init(struct mailbox_list *list, const char *pattern,
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
512 enum mailbox_list_iter_flags flags)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
513 {
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5983
diff changeset
514 const char *patterns[2];
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5983
diff changeset
515
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5983
diff changeset
516 patterns[0] = pattern;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5983
diff changeset
517 patterns[1] = NULL;
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5983
diff changeset
518 return mailbox_list_iter_init_multiple(list, patterns, flags);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5983
diff changeset
519 }
5473
b5404d36494f cleanup
Timo Sirainen <tss@iki.fi>
parents: 5472
diff changeset
520
6007
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5983
diff changeset
521 struct mailbox_list_iterate_context *
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5983
diff changeset
522 mailbox_list_iter_init_multiple(struct mailbox_list *list,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5983
diff changeset
523 const char *const *patterns,
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5983
diff changeset
524 enum mailbox_list_iter_flags flags)
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5983
diff changeset
525 {
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5983
diff changeset
526 i_assert(*patterns != NULL);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5983
diff changeset
527
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5983
diff changeset
528 mailbox_list_clear_error(list);
cc1f4688a988 Added support for multiple mailbox list patterns.
Timo Sirainen <tss@iki.fi>
parents: 5983
diff changeset
529 return list->v.iter_init(list, patterns, flags);
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
530 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
531
8079
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
532 static const struct mailbox_info *
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
533 mailbox_list_ns_iter_next(struct mailbox_list_iterate_context *_ctx)
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
534 {
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
535 struct ns_list_iterate_context *ctx =
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
536 (struct ns_list_iterate_context *)_ctx;
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
537 const struct mailbox_info *info;
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
538
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
539 info = mailbox_list_iter_next(ctx->backend_ctx);
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
540 if (info == NULL && ctx->namespaces != NULL) {
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
541 /* go to the next namespace */
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
542 if (mailbox_list_iter_deinit(&ctx->backend_ctx) < 0)
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
543 _ctx->failed = TRUE;
8478
adf36d9cd338 Fixed crashing with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8473
diff changeset
544 ctx->ctx.list->ns = ctx->namespaces;
8079
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
545 ctx->backend_ctx =
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
546 mailbox_list_iter_init_multiple(ctx->namespaces->list,
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
547 ctx->patterns,
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
548 _ctx->flags);
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
549 ctx->namespaces = ctx->namespaces->next;
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
550 return mailbox_list_ns_iter_next(_ctx);
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
551 }
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
552 return info;
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
553 }
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
554
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
555 static int
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
556 mailbox_list_ns_iter_deinit(struct mailbox_list_iterate_context *_ctx)
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
557 {
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
558 struct ns_list_iterate_context *ctx =
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
559 (struct ns_list_iterate_context *)_ctx;
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
560 int ret;
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
561
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
562 if (mailbox_list_iter_deinit(&ctx->backend_ctx) < 0)
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
563 _ctx->failed = TRUE;
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
564 ret = _ctx->failed ? -1 : 0;
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
565 pool_unref(&ctx->pool);
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
566 return ret;
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
567 }
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
568
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
569 struct mailbox_list_iterate_context *
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
570 mailbox_list_iter_init_namespaces(struct mail_namespace *namespaces,
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
571 const char *const *patterns,
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
572 enum mailbox_list_iter_flags flags)
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
573 {
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
574 struct ns_list_iterate_context *ctx;
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
575 unsigned int i, count;
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
576 pool_t pool;
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
577
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
578 i_assert(namespaces != NULL);
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
579
9046
54686141353f Memory usage tweaks.
Timo Sirainen <tss@iki.fi>
parents: 8999
diff changeset
580 pool = pool_alloconly_create("mailbox list namespaces", 512);
8079
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
581 ctx = p_new(pool, struct ns_list_iterate_context, 1);
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
582 ctx->pool = pool;
8335
3f6fa7862843 Fixes to mailbox list iteration (fixes some issues with virtual mailboxes).
Timo Sirainen <tss@iki.fi>
parents: 8329
diff changeset
583 ctx->ctx.flags = flags;
8079
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
584 ctx->ctx.list = p_new(pool, struct mailbox_list, 1);
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
585 ctx->ctx.list->v.iter_next = mailbox_list_ns_iter_next;
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
586 ctx->ctx.list->v.iter_deinit = mailbox_list_ns_iter_deinit;
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
587
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
588 count = str_array_length(patterns);
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
589 ctx->patterns = p_new(pool, const char *, count + 1);
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
590 for (i = 0; i < count; i++)
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
591 ctx->patterns[i] = p_strdup(pool, patterns[i]);
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
592
8478
adf36d9cd338 Fixed crashing with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8473
diff changeset
593 ctx->ctx.list->ns = namespaces;
8079
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
594 ctx->backend_ctx = mailbox_list_iter_init_multiple(namespaces->list,
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
595 patterns, flags);
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
596 ctx->namespaces = namespaces->next;
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
597 return &ctx->ctx;
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
598 }
4e1b54eb7407 Added mailbox_list_iter_init_namespaces() for listing mailboxes from multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8048
diff changeset
599
5807
ec09ad1d017f mailbox_list_iter_next() returns now const pointer.
Timo Sirainen <tss@iki.fi>
parents: 5617
diff changeset
600 const struct mailbox_info *
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
601 mailbox_list_iter_next(struct mailbox_list_iterate_context *ctx)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
602 {
8448
4cf249042df6 When autocreating a new shared namespace, drop existing namespaces where we haven't seen any mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8417
diff changeset
603 const struct mailbox_info *info;
4cf249042df6 When autocreating a new shared namespace, drop existing namespaces where we haven't seen any mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8417
diff changeset
604
4cf249042df6 When autocreating a new shared namespace, drop existing namespaces where we haven't seen any mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8417
diff changeset
605 info = ctx->list->v.iter_next(ctx);
4cf249042df6 When autocreating a new shared namespace, drop existing namespaces where we haven't seen any mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8417
diff changeset
606 if (info != NULL)
4cf249042df6 When autocreating a new shared namespace, drop existing namespaces where we haven't seen any mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8417
diff changeset
607 ctx->list->ns->flags |= NAMESPACE_FLAG_USABLE;
4cf249042df6 When autocreating a new shared namespace, drop existing namespaces where we haven't seen any mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8417
diff changeset
608 return info;
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
609 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
610
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
611 int mailbox_list_iter_deinit(struct mailbox_list_iterate_context **_ctx)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
612 {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
613 struct mailbox_list_iterate_context *ctx = *_ctx;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
614
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
615 *_ctx = NULL;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
616
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
617 return ctx->list->v.iter_deinit(ctx);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
618 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
619
9276
13fa572535f0 Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents: 9204
diff changeset
620 int mailbox_list_mailbox(struct mailbox_list *list, const char *name,
13fa572535f0 Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents: 9204
diff changeset
621 enum mailbox_info_flags *flags_r)
13fa572535f0 Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents: 9204
diff changeset
622 {
13fa572535f0 Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents: 9204
diff changeset
623 struct mailbox_list_iterate_context ctx;
13fa572535f0 Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents: 9204
diff changeset
624 const char *path;
13fa572535f0 Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents: 9204
diff changeset
625
13fa572535f0 Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents: 9204
diff changeset
626 memset(&ctx, 0, sizeof(ctx));
13fa572535f0 Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents: 9204
diff changeset
627 ctx.list = list;
13fa572535f0 Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents: 9204
diff changeset
628
13fa572535f0 Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents: 9204
diff changeset
629 *flags_r = 0;
13fa572535f0 Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents: 9204
diff changeset
630 path = mailbox_list_get_path(list, name, MAILBOX_LIST_PATH_TYPE_DIR);
9303
9b62aa2132de Don't crash when listing shared namespace prefix.
Timo Sirainen <tss@iki.fi>
parents: 9289
diff changeset
631 return list->v.iter_is_mailbox == NULL ? 0 :
9b62aa2132de Don't crash when listing shared namespace prefix.
Timo Sirainen <tss@iki.fi>
parents: 9289
diff changeset
632 list->v.iter_is_mailbox(&ctx, path, "", "",
9b62aa2132de Don't crash when listing shared namespace prefix.
Timo Sirainen <tss@iki.fi>
parents: 9289
diff changeset
633 MAILBOX_LIST_FILE_TYPE_UNKNOWN,
9b62aa2132de Don't crash when listing shared namespace prefix.
Timo Sirainen <tss@iki.fi>
parents: 9289
diff changeset
634 flags_r);
9276
13fa572535f0 Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents: 9204
diff changeset
635 }
13fa572535f0 Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents: 9204
diff changeset
636
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
637 int mailbox_list_set_subscribed(struct mailbox_list *list,
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
638 const char *name, bool set)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
639 {
5470
402796d50c3e Moved some common code to mailbox-list.c
Timo Sirainen <tss@iki.fi>
parents: 5450
diff changeset
640 mailbox_list_clear_error(list);
402796d50c3e Moved some common code to mailbox-list.c
Timo Sirainen <tss@iki.fi>
parents: 5450
diff changeset
641
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
642 return list->v.set_subscribed(list, name, set);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
643 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
644
5448
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
645 int mailbox_list_delete_mailbox(struct mailbox_list *list, const char *name)
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
646 {
9276
13fa572535f0 Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents: 9204
diff changeset
647 if (!mailbox_list_is_valid_existing_name(list, name) || *name == '\0') {
5613
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
648 mailbox_list_set_error(list, MAIL_ERROR_PARAMS,
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
649 "Invalid mailbox name");
5471
7df495c556ff Verify that mailbox name is valid before deleting it.
Timo Sirainen <tss@iki.fi>
parents: 5470
diff changeset
650 return -1;
7df495c556ff Verify that mailbox name is valid before deleting it.
Timo Sirainen <tss@iki.fi>
parents: 5470
diff changeset
651 }
7113
d5dd0841b2db Fixes to handling INBOX with non-INBOX namespaces.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
652 if (strcmp(name, "INBOX") == 0 &&
d5dd0841b2db Fixes to handling INBOX with non-INBOX namespaces.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
653 (list->ns->flags & NAMESPACE_FLAG_INBOX) != 0) {
5613
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
654 mailbox_list_set_error(list, MAIL_ERROR_NOTPOSSIBLE,
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
655 "INBOX can't be deleted.");
5472
21ccc57946b8 cleanup
Timo Sirainen <tss@iki.fi>
parents: 5471
diff changeset
656 return -1;
21ccc57946b8 cleanup
Timo Sirainen <tss@iki.fi>
parents: 5471
diff changeset
657 }
5448
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
658 return list->v.delete_mailbox(list, name);
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
659 }
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
660
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
661 int mailbox_list_rename_mailbox(struct mailbox_list *list,
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
662 const char *oldname, const char *newname)
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
663 {
5470
402796d50c3e Moved some common code to mailbox-list.c
Timo Sirainen <tss@iki.fi>
parents: 5450
diff changeset
664 if (!mailbox_list_is_valid_existing_name(list, oldname) ||
9276
13fa572535f0 Allow namespace prefix to be opened as mailbox, if it already exists.
Timo Sirainen <tss@iki.fi>
parents: 9204
diff changeset
665 *oldname == '\0' ||
5470
402796d50c3e Moved some common code to mailbox-list.c
Timo Sirainen <tss@iki.fi>
parents: 5450
diff changeset
666 !mailbox_list_is_valid_create_name(list, newname)) {
5613
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
667 mailbox_list_set_error(list, MAIL_ERROR_PARAMS,
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
668 "Invalid mailbox name");
5470
402796d50c3e Moved some common code to mailbox-list.c
Timo Sirainen <tss@iki.fi>
parents: 5450
diff changeset
669 return -1;
402796d50c3e Moved some common code to mailbox-list.c
Timo Sirainen <tss@iki.fi>
parents: 5450
diff changeset
670 }
402796d50c3e Moved some common code to mailbox-list.c
Timo Sirainen <tss@iki.fi>
parents: 5450
diff changeset
671
5448
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
672 return list->v.rename_mailbox(list, oldname, newname);
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
673 }
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
674
6833
337e6a9a2959 If we can't delete the index or control directory, give a nice error message
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
675 static int mailbox_list_try_delete(struct mailbox_list *list, const char *dir)
337e6a9a2959 If we can't delete the index or control directory, give a nice error message
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
676 {
337e6a9a2959 If we can't delete the index or control directory, give a nice error message
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
677 if (unlink_directory(dir, TRUE) == 0 || errno == ENOENT)
337e6a9a2959 If we can't delete the index or control directory, give a nice error message
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
678 return 0;
337e6a9a2959 If we can't delete the index or control directory, give a nice error message
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
679
337e6a9a2959 If we can't delete the index or control directory, give a nice error message
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
680 if (errno == ENOTEMPTY) {
337e6a9a2959 If we can't delete the index or control directory, give a nice error message
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
681 /* We're most likely using NFS and we can't delete
337e6a9a2959 If we can't delete the index or control directory, give a nice error message
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
682 .nfs* files. */
8411
abd0ef855a33 Implemented imap-response-codes draft.
Timo Sirainen <tss@iki.fi>
parents: 8399
diff changeset
683 mailbox_list_set_error(list, MAIL_ERROR_INUSE,
6833
337e6a9a2959 If we can't delete the index or control directory, give a nice error message
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
684 "Mailbox is still open in another session, "
337e6a9a2959 If we can't delete the index or control directory, give a nice error message
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
685 "can't delete it.");
337e6a9a2959 If we can't delete the index or control directory, give a nice error message
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
686 } else {
337e6a9a2959 If we can't delete the index or control directory, give a nice error message
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
687 mailbox_list_set_critical(list,
337e6a9a2959 If we can't delete the index or control directory, give a nice error message
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
688 "unlink_directory(%s) failed: %m", dir);
337e6a9a2959 If we can't delete the index or control directory, give a nice error message
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
689 }
337e6a9a2959 If we can't delete the index or control directory, give a nice error message
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
690 return -1;
337e6a9a2959 If we can't delete the index or control directory, give a nice error message
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
691 }
337e6a9a2959 If we can't delete the index or control directory, give a nice error message
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
692
5448
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
693 int mailbox_list_delete_index_control(struct mailbox_list *list,
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
694 const char *name)
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
695 {
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
696 const char *path, *index_dir, *dir;
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
697
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
698 path = mailbox_list_get_path(list, name,
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
699 MAILBOX_LIST_PATH_TYPE_MAILBOX);
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
700
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
701 /* delete the index directory first, so that if we crash we don't
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
702 leave indexes for deleted mailboxes lying around */
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
703 index_dir = mailbox_list_get_path(list, name,
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
704 MAILBOX_LIST_PATH_TYPE_INDEX);
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
705 if (*index_dir != '\0' && strcmp(index_dir, path) != 0) {
6833
337e6a9a2959 If we can't delete the index or control directory, give a nice error message
Timo Sirainen <tss@iki.fi>
parents: 6829
diff changeset
706 if (mailbox_list_try_delete(list, index_dir) < 0)
5448
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
707 return -1;
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
708 }
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
709
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
710 /* control directory next */
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
711 dir = mailbox_list_get_path(list, name, MAILBOX_LIST_PATH_TYPE_CONTROL);
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
712 if (*dir != '\0' && strcmp(dir, path) != 0 &&
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
713 strcmp(dir, index_dir) != 0) {
8473
81bc28227b6c Fixed deleting control directory when it wasn't the same as index directory.
Timo Sirainen <tss@iki.fi>
parents: 8448
diff changeset
714 if (mailbox_list_try_delete(list, dir) < 0)
5448
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
715 return -1;
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
716 }
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
717 return 0;
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
718 }
beabd433cdae Moved delete/rename operations to mailbox_list API. Fixed mbox/maildir to
Timo Sirainen <tss@iki.fi>
parents: 5318
diff changeset
719
6639
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
720 static void node_fix_parents(struct mailbox_node *node)
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
721 {
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
722 /* If we happened to create any of the parents, we need to mark them
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
723 nonexistent. */
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
724 node = node->parent;
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
725 for (; node != NULL; node = node->parent) {
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
726 if ((node->flags & MAILBOX_MATCHED) == 0)
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
727 node->flags |= MAILBOX_NONEXISTENT;
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
728 }
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
729 }
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
730
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6833
diff changeset
731 static void
7494
2dd86c2f8efb mailbox_list_iter_update() was always setting subscribed flags to processed
Timo Sirainen <tss@iki.fi>
parents: 7245
diff changeset
732 mailbox_list_iter_update_real(struct mailbox_list_iter_update_context *ctx,
2dd86c2f8efb mailbox_list_iter_update() was always setting subscribed flags to processed
Timo Sirainen <tss@iki.fi>
parents: 7245
diff changeset
733 const char *name)
6639
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
734 {
7494
2dd86c2f8efb mailbox_list_iter_update() was always setting subscribed flags to processed
Timo Sirainen <tss@iki.fi>
parents: 7245
diff changeset
735 struct mail_namespace *ns = ctx->iter_ctx->list->ns;
6639
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
736 struct mailbox_node *node;
7494
2dd86c2f8efb mailbox_list_iter_update() was always setting subscribed flags to processed
Timo Sirainen <tss@iki.fi>
parents: 7245
diff changeset
737 enum mailbox_info_flags create_flags = 0, always_flags;
6639
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
738 enum imap_match_result match;
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
739 const char *p;
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
740 bool created, add_matched;
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
741
7494
2dd86c2f8efb mailbox_list_iter_update() was always setting subscribed flags to processed
Timo Sirainen <tss@iki.fi>
parents: 7245
diff changeset
742 if (ctx->update_only ||
2dd86c2f8efb mailbox_list_iter_update() was always setting subscribed flags to processed
Timo Sirainen <tss@iki.fi>
parents: 7245
diff changeset
743 (ctx->iter_ctx->flags & MAILBOX_LIST_ITER_RETURN_NO_FLAGS) == 0)
2dd86c2f8efb mailbox_list_iter_update() was always setting subscribed flags to processed
Timo Sirainen <tss@iki.fi>
parents: 7245
diff changeset
744 create_flags = MAILBOX_NONEXISTENT | MAILBOX_NOCHILDREN;
2dd86c2f8efb mailbox_list_iter_update() was always setting subscribed flags to processed
Timo Sirainen <tss@iki.fi>
parents: 7245
diff changeset
745 always_flags = ctx->leaf_flags;
6639
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
746 add_matched = TRUE;
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
747
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
748 for (;;) {
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
749 created = FALSE;
7494
2dd86c2f8efb mailbox_list_iter_update() was always setting subscribed flags to processed
Timo Sirainen <tss@iki.fi>
parents: 7245
diff changeset
750 match = imap_match(ctx->glob, name);
6639
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
751 if (match == IMAP_MATCH_YES) {
7494
2dd86c2f8efb mailbox_list_iter_update() was always setting subscribed flags to processed
Timo Sirainen <tss@iki.fi>
parents: 7245
diff changeset
752 node = ctx->update_only ?
2dd86c2f8efb mailbox_list_iter_update() was always setting subscribed flags to processed
Timo Sirainen <tss@iki.fi>
parents: 7245
diff changeset
753 mailbox_tree_lookup(ctx->tree_ctx, name) :
2dd86c2f8efb mailbox_list_iter_update() was always setting subscribed flags to processed
Timo Sirainen <tss@iki.fi>
parents: 7245
diff changeset
754 mailbox_tree_get(ctx->tree_ctx, name, &created);
6639
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
755 if (created) {
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
756 node->flags = create_flags;
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
757 if (create_flags != 0)
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
758 node_fix_parents(node);
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
759 }
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
760 if (node != NULL) {
7494
2dd86c2f8efb mailbox_list_iter_update() was always setting subscribed flags to processed
Timo Sirainen <tss@iki.fi>
parents: 7245
diff changeset
761 if (!ctx->update_only && add_matched)
6639
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
762 node->flags |= MAILBOX_MATCHED;
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
763 node->flags |= always_flags;
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
764 }
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
765 /* We don't want to show the parent mailboxes unless
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
766 something else matches them, but if they are matched
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
767 we want to show them having child subscriptions */
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
768 add_matched = FALSE;
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
769 } else {
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
770 if ((match & IMAP_MATCH_PARENT) == 0)
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
771 break;
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
772 /* We've a (possibly) non-subscribed parent mailbox
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
773 which has a subscribed child mailbox. Make sure we
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
774 return the parent mailbox. */
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
775 }
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
776
7494
2dd86c2f8efb mailbox_list_iter_update() was always setting subscribed flags to processed
Timo Sirainen <tss@iki.fi>
parents: 7245
diff changeset
777 if (!ctx->match_parents)
6639
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
778 break;
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
779
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
780 /* see if parent matches */
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
781 p = strrchr(name, ns->sep);
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
782 if (p == NULL)
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
783 break;
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
784
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
785 name = t_strdup_until(name, p);
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
786 create_flags &= ~MAILBOX_NOCHILDREN;
7494
2dd86c2f8efb mailbox_list_iter_update() was always setting subscribed flags to processed
Timo Sirainen <tss@iki.fi>
parents: 7245
diff changeset
787 always_flags = MAILBOX_CHILDREN | ctx->parent_flags;
6639
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
788 }
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6833
diff changeset
789 }
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6833
diff changeset
790
7494
2dd86c2f8efb mailbox_list_iter_update() was always setting subscribed flags to processed
Timo Sirainen <tss@iki.fi>
parents: 7245
diff changeset
791 void mailbox_list_iter_update(struct mailbox_list_iter_update_context *ctx,
2dd86c2f8efb mailbox_list_iter_update() was always setting subscribed flags to processed
Timo Sirainen <tss@iki.fi>
parents: 7245
diff changeset
792 const char *name)
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6833
diff changeset
793 {
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7113
diff changeset
794 T_BEGIN {
7494
2dd86c2f8efb mailbox_list_iter_update() was always setting subscribed flags to processed
Timo Sirainen <tss@iki.fi>
parents: 7245
diff changeset
795 mailbox_list_iter_update_real(ctx, name);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7113
diff changeset
796 } T_END;
6639
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
797 }
e1fde9940f7e Fixes to handling namespace prefixes and real!=virtual separator. Added a
Timo Sirainen <tss@iki.fi>
parents: 6434
diff changeset
798
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
799 bool mailbox_list_name_is_too_large(const char *name, char sep)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
800 {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
801 unsigned int levels = 1, level_len = 0;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
802
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
803 for (; *name != '\0'; name++) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
804 if (*name == sep) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
805 if (level_len > MAILBOX_MAX_HIERARCHY_NAME_LENGTH)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
806 return TRUE;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
807 levels++;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
808 level_len = 0;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
809 } else {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
810 level_len++;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
811 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
812 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
813
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
814 if (level_len > MAILBOX_MAX_HIERARCHY_NAME_LENGTH)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
815 return TRUE;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
816 if (levels > MAILBOX_MAX_HIERARCHY_LEVELS)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
817 return TRUE;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
818 return FALSE;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
819 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
820
5983
272796cfee66 compiler warning fixes
Timo Sirainen <tss@iki.fi>
parents: 5839
diff changeset
821 enum mailbox_list_file_type
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 6256
diff changeset
822 mailbox_list_get_file_type(const struct dirent *d ATTR_UNUSED)
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
823 {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
824 enum mailbox_list_file_type type;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
825
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
826 #ifdef HAVE_DIRENT_D_TYPE
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
827 switch (d->d_type) {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
828 case DT_UNKNOWN:
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
829 type = MAILBOX_LIST_FILE_TYPE_UNKNOWN;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
830 break;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
831 case DT_REG:
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
832 type = MAILBOX_LIST_FILE_TYPE_FILE;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
833 break;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
834 case DT_DIR:
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
835 type = MAILBOX_LIST_FILE_TYPE_DIR;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
836 break;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
837 case DT_LNK:
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
838 type = MAILBOX_LIST_FILE_TYPE_SYMLINK;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
839 break;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
840 default:
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
841 type = MAILBOX_LIST_FILE_TYPE_OTHER;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
842 break;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
843 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
844 #else
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
845 type = MAILBOX_LIST_FILE_TYPE_UNKNOWN;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
846 #endif
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
847 return type;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
848 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
849
8137
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
850 bool mailbox_list_try_get_absolute_path(struct mailbox_list *list,
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
851 const char **name)
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
852 {
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
853 if ((list->flags & MAILBOX_LIST_FLAG_FULL_FS_ACCESS) == 0)
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
854 return FALSE;
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
855
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
856 if (**name == '/')
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
857 return TRUE;
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
858 if (**name != '~')
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
859 return FALSE;
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
860
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
861 /* try to expand home directory */
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
862 if ((*name)[1] == '/') {
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
863 /* ~/dir - use the configured home directory */
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
864 if (mail_user_try_home_expand(list->ns->user, name) == 0)
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
865 return TRUE;
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
866 } else {
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
867 /* ~otheruser/dir - assume we're using system users */
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
868 if (home_try_expand(name) == 0)
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
869 return TRUE;
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
870 }
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
871 /* fallback to using ~dir */
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
872 return FALSE;
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
873 }
b2a258213ee0 Created mail_user_[try_]home_expand(). Used them for expanding mail directories.
Timo Sirainen <tss@iki.fi>
parents: 8079
diff changeset
874
9204
f3c6cabae3af Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
Timo Sirainen <tss@iki.fi>
parents: 9195
diff changeset
875 int mailbox_list_create_parent_dir(struct mailbox_list *list,
f3c6cabae3af Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
Timo Sirainen <tss@iki.fi>
parents: 9195
diff changeset
876 const char *mailbox, const char *path)
f3c6cabae3af Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
Timo Sirainen <tss@iki.fi>
parents: 9195
diff changeset
877 {
f3c6cabae3af Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
Timo Sirainen <tss@iki.fi>
parents: 9195
diff changeset
878 const char *p, *dir, *origin;
f3c6cabae3af Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
Timo Sirainen <tss@iki.fi>
parents: 9195
diff changeset
879 gid_t gid;
f3c6cabae3af Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
Timo Sirainen <tss@iki.fi>
parents: 9195
diff changeset
880 mode_t mode;
f3c6cabae3af Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
Timo Sirainen <tss@iki.fi>
parents: 9195
diff changeset
881
f3c6cabae3af Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
Timo Sirainen <tss@iki.fi>
parents: 9195
diff changeset
882 p = strrchr(path, '/');
f3c6cabae3af Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
Timo Sirainen <tss@iki.fi>
parents: 9195
diff changeset
883 if (p == NULL)
f3c6cabae3af Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
Timo Sirainen <tss@iki.fi>
parents: 9195
diff changeset
884 return 0;
f3c6cabae3af Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
Timo Sirainen <tss@iki.fi>
parents: 9195
diff changeset
885
f3c6cabae3af Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
Timo Sirainen <tss@iki.fi>
parents: 9195
diff changeset
886 dir = t_strdup_until(path, p);
f3c6cabae3af Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
Timo Sirainen <tss@iki.fi>
parents: 9195
diff changeset
887 mailbox_list_get_dir_permissions(list, mailbox, &mode, &gid, &origin);
f3c6cabae3af Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
Timo Sirainen <tss@iki.fi>
parents: 9195
diff changeset
888 if (mkdir_parents_chgrp(dir, mode, gid, origin) < 0 &&
f3c6cabae3af Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
Timo Sirainen <tss@iki.fi>
parents: 9195
diff changeset
889 errno != EEXIST) {
f3c6cabae3af Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
Timo Sirainen <tss@iki.fi>
parents: 9195
diff changeset
890 mailbox_list_set_critical(list, "mkdir_parents(%s) failed: %m",
f3c6cabae3af Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
Timo Sirainen <tss@iki.fi>
parents: 9195
diff changeset
891 dir);
f3c6cabae3af Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
Timo Sirainen <tss@iki.fi>
parents: 9195
diff changeset
892 return -1;
f3c6cabae3af Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
Timo Sirainen <tss@iki.fi>
parents: 9195
diff changeset
893 }
f3c6cabae3af Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
Timo Sirainen <tss@iki.fi>
parents: 9195
diff changeset
894 return 0;
f3c6cabae3af Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
Timo Sirainen <tss@iki.fi>
parents: 9195
diff changeset
895 }
f3c6cabae3af Added mailbox_list_create_parent_dir() and used it when creating subscriptions file.
Timo Sirainen <tss@iki.fi>
parents: 9195
diff changeset
896
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
897 const char *mailbox_list_get_last_error(struct mailbox_list *list,
5613
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
898 enum mail_error *error_r)
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
899 {
5613
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
900 *error_r = list->error;
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
901
5613
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
902 return list->error_string != NULL ? list->error_string :
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
903 "Unknown internal list error";
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
904 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
905
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
906 void mailbox_list_clear_error(struct mailbox_list *list)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
907 {
5613
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
908 i_free_and_null(list->error_string);
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
909
5613
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
910 list->error = MAIL_ERROR_NONE;
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
911 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
912
5613
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
913 void mailbox_list_set_error(struct mailbox_list *list,
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
914 enum mail_error error, const char *string)
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
915 {
5613
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
916 i_free(list->error_string);
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
917 list->error_string = i_strdup(string);
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
918
5613
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
919 list->error = error;
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
920 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
921
4848
967de900c73a Mailbox list indexing and related changes. Currently works only with
Timo Sirainen <tss@iki.fi>
parents: 4814
diff changeset
922 void mailbox_list_set_internal_error(struct mailbox_list *list)
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
923 {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
924 struct tm *tm;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
925 char str[256];
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
926
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
927 tm = localtime(&ioloop_time);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
928
5613
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
929 i_free(list->error_string);
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
930 list->error_string =
8417
106ad33091ca Made CRITICAL_MSG* public to MAIL_ERRSTR_CRITICAL_MSG* in mail-error.h.
Timo Sirainen <tss@iki.fi>
parents: 8411
diff changeset
931 strftime(str, sizeof(str),
106ad33091ca Made CRITICAL_MSG* public to MAIL_ERRSTR_CRITICAL_MSG* in mail-error.h.
Timo Sirainen <tss@iki.fi>
parents: 8411
diff changeset
932 MAIL_ERRSTR_CRITICAL_MSG_STAMP, tm) > 0 ?
106ad33091ca Made CRITICAL_MSG* public to MAIL_ERRSTR_CRITICAL_MSG* in mail-error.h.
Timo Sirainen <tss@iki.fi>
parents: 8411
diff changeset
933 i_strdup(str) : i_strdup(MAIL_ERRSTR_CRITICAL_MSG);
5613
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
934 list->error = MAIL_ERROR_TEMP;
4808
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
935 }
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
936
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
937 void mailbox_list_set_critical(struct mailbox_list *list, const char *fmt, ...)
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
938 {
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
939 va_list va;
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
940
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
941 va_start(va, fmt);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
942 i_error("%s", t_strdup_vprintf(fmt, va));
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
943 va_end(va);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
944
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
945 /* critical errors may contain sensitive data, so let user
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
946 see only "Internal error" with a timestamp to make it
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
947 easier to look from log files the actual error message. */
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
948 mailbox_list_set_internal_error(list);
93bc9770f938 Initial code for separation of mailbox accessing and directory layout
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
949 }
5613
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
950
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
951 bool mailbox_list_set_error_from_errno(struct mailbox_list *list)
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
952 {
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
953 const char *error_string;
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
954 enum mail_error error;
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
955
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
956 if (!mail_error_from_errno(&error, &error_string))
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
957 return FALSE;
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
958
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
959 mailbox_list_set_error(list, error, error_string);
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
960 return TRUE;
f717fb4b31c0 Error handling rewrite.
Timo Sirainen <tss@iki.fi>
parents: 5550
diff changeset
961 }