mailbox-list.c revision fd8b93ca5cbeba64fe6fa5dc98a3e580fb046791
76b43e4417bab52e913da39b5f5bc2a130d3f149Timo Sirainen/* Copyright (c) 2006-2017 Dovecot authors, see the included COPYING file */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstruct mailbox_list_module_register mailbox_list_module_register = { 0 };
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstatic ARRAY(const struct mailbox_list *) mailbox_list_drivers;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstatic MODULE_CONTEXT_DEFINE_INIT(mailbox_list_fs_module,
1060afdc2fcdf647dbb3bc11647401f1b44a3a8aTimo Sirainenstatic bool mailbox_list_driver_find(const char *name, unsigned int *idx_r)
8edc373587d75f8040e3c4416e50638aa2a32188Timo Sirainen unsigned int i, count;
8edc373587d75f8040e3c4416e50638aa2a32188Timo Sirainen drivers = array_get(&mailbox_list_drivers, &count);
8edc373587d75f8040e3c4416e50638aa2a32188Timo Sirainen for (i = 0; i < count; i++) {
c06f4017027263cf3a08becc551f5126409e2a83Timo Sirainen if (strcasecmp(drivers[i]->name, name) == 0) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenvoid mailbox_list_register(const struct mailbox_list *list)
8edc373587d75f8040e3c4416e50638aa2a32188Timo Sirainen unsigned int idx;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (mailbox_list_driver_find(list->name, &idx)) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen i_fatal("mailbox_list_register(%s): duplicate driver",
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen array_append(&mailbox_list_drivers, &list, 1);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenvoid mailbox_list_unregister(const struct mailbox_list *list)
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen unsigned int idx;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen if (!mailbox_list_driver_find(list->name, &idx)) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen i_fatal("mailbox_list_unregister(%s): unknown driver",
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen unsigned int idx;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen class_p = array_idx(&mailbox_list_drivers, idx);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenint mailbox_list_create(const char *driver, struct mail_namespace *ns,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct mailbox_list **list_r, const char **error_r)
143cb2e0744e647f8fc637bbdea1106c1587a4bfTimo Sirainen if ((class = mailbox_list_find_class(driver)) == NULL) {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen if ((class->props & MAILBOX_LIST_PROP_NO_MAILDIR_NAME) != 0 &&
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen *error_r = "maildir_name not supported by this driver";
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen if ((class->props & MAILBOX_LIST_PROP_NO_ALT_DIR) != 0 &&
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen *error_r = "alt_dir not supported by this driver";
7d207b1e77a7b5e3fda640e353acfc86d261fedfTimo Sirainen i_assert(set->root_dir == NULL || *set->root_dir != '\0' ||
a94936bafd127680184da114c6a177b37ff656e5Timo Sirainen (class->props & MAILBOX_LIST_PROP_NO_ROOT) != 0);
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen array_create(&list->module_contexts, list->pool, sizeof(void *), 5);
cd1eef2109b4476842b7757f1d69b104196d5941Timo Sirainen list->root_permissions.file_create_mode = (mode_t)-1;
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen list->root_permissions.dir_create_mode = (mode_t)-1;
07e4875d250e7a7157cd99132aafc773cf3cdf83Timo Sirainen list->root_permissions.file_create_gid = (gid_t)-1;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen /* copy settings */
2526d52441ef368215ab6bf04fd0356d3b09d235Timo Sirainen list->set.root_dir = p_strdup(list->pool, set->root_dir);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen list->set.index_dir = set->index_dir == NULL ||
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen strcmp(set->index_dir, set->root_dir) == 0 ? NULL :
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen list->set.index_pvt_dir = set->index_pvt_dir == NULL ||
fe363b433b8038a69b55169da9dca27892ad7d18Timo Sirainen strcmp(set->index_pvt_dir, set->root_dir) == 0 ? NULL :
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen list->set.control_dir = set->control_dir == NULL ||
a94936bafd127680184da114c6a177b37ff656e5Timo Sirainen strcmp(set->control_dir, set->root_dir) == 0 ? NULL :
a94936bafd127680184da114c6a177b37ff656e5Timo Sirainen list->set.inbox_path = p_strdup(list->pool, set->inbox_path);
a94936bafd127680184da114c6a177b37ff656e5Timo Sirainen p_strdup(list->pool, set->subscription_fname);
411d6baa37f31d90730e90c4a28c43e1974bbe58Timo Sirainen list->set.alt_dir = p_strdup(list->pool, set->alt_dir);
411d6baa37f31d90730e90c4a28c43e1974bbe58Timo Sirainen list->set.alt_dir_nocheck = set->alt_dir_nocheck;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen list->set.volatile_dir = p_strdup(list->pool, set->volatile_dir);
if (!expand_home) {
args++;
args++;
args++;
return str;
bool expand_home,
const char **error_r)
value++;
const char **error_r)
location++;
location++;
if (p == NULL)
return path;
return FALSE;
const char *maildir_name)
vname++;
(dirstart &&
unsigned char chr;
char *ret, *p;
if (*p == src)
*p = dest;
return ret;
const char *vname)
return storage_name;
return storage_name;
return ret;
const char *vname)
unsigned int num;
(unsigned char)*vname);
const char *storage_name)
return vname;
for (i = 0; i < name_len; i++) {
return vname;
const struct mailbox_list_settings *
struct mail_namespace *
return mode;
struct mail_user *
const char *name,
&path) < 0)
&path);
path);
if (p == NULL) {
const char *expanded_full)
const char *ret;
slash_count++;
slash2_count++;
if (slash_count == 0)
slash_count--;
if (slash_count != 0)
if (slash2_count == 0)
slash2_count--;
if (slash2_count != 0)
return ret;
const char **error_r)
i_unreached();
} else if (p == NULL) {
if (p == unexpanded)
i_unreached();
if (!home) {
const char **error_r)
const char *root_dir;
i_unreached();
const char *error;
const char **error_r)
return TRUE;
return FALSE;
return FALSE;
T_BEGIN {
const char *const *names;
const char *n = *names;
if (!allow_internal_dirs &&
} T_END;
return ret;
return TRUE;
return FALSE;
return FALSE;
const char **path_r)
int ret;
return ret;
const char **path_r)
int ret;
i_unreached();
if (ret == 0)
return ret > 0;
const char *path;
i_unreached();
return path;
const char **path_r)
switch (type) {
return pattern;
const char *pattern;
int ret;
return ret;
*flags_r = 0;
int ret;
if (ret < 0) {
const char *errstr;
if (ret < 0)
switch (existence) {
case MAILBOX_EXISTENCE_NONE:
case MAILBOX_EXISTENCE_SELECT:
const char *vname;
i_unreached();
fname++;
&inbox) <= 0)
i_unreached();
flags_r);
const char *path;
return TRUE;
return FALSE;
return TRUE;
&index_dir))
&root_dir))
int ret;
return ret;
const char *error;
const char *error;
#ifdef HAVE_DIRENT_D_TYPE
switch (d->d_type) {
case DT_UNKNOWN:
case DT_REG:
case DT_DIR:
case DT_LNK:
return type;
const char *dir_path,
const struct dirent *d)
int ret;
T_BEGIN {
ret = 0;
} T_END;
return ret;
return FALSE;
return FALSE;
return TRUE;
const char **name)
return FALSE;
return FALSE;
return FALSE;
&path) <= 0)
return FALSE;
return FALSE;
return TRUE;
const char *str;
const char *error_string;
return FALSE;
return TRUE;