maildir-storage.c revision 5f5870385cff47efd2f58e7892f251cf13761528
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina/* Copyright (c) 2002-2012 Dovecot authors, see the included COPYING file */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina MODULE_CONTEXT(obj, maildir_mailbox_list_module)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastatic MODULE_CONTEXT_DEFINE_INIT(maildir_mailbox_list_module,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastatic const char *maildir_subdirs[] = { "cur", "new", "tmp" };
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastatic struct mail_storage *maildir_storage_alloc(void)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina pool = pool_alloconly_create("maildir storage", 512+256);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina storage = p_new(pool, struct maildir_storage, 1);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinamaildir_storage_create(struct mail_storage *_storage, struct mail_namespace *ns,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct maildir_storage *storage = (struct maildir_storage *)_storage;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *dir;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina storage->set = mail_storage_get_driver_settings(_storage);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina storage->temp_prefix = p_strdup(_storage->pool,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (list->set.control_dir == NULL && list->set.inbox_path == NULL &&
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina (ns->flags & NAMESPACE_FLAG_INBOX_ANY) != 0) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* put the temp files into tmp/ directory preferrably */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina storage->temp_prefix = p_strconcat(_storage->pool, "tmp/",
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* control dir should also be writable */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina _storage->temp_path_prefix = p_strconcat(_storage->pool, dir, "/",
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastatic void maildir_storage_get_list_settings(const struct mail_namespace *ns,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina set->layout = MAILBOX_LIST_NAME_MAILDIRPLUSPLUS;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina set->subscription_fname = MAILDIR_SUBSCRIPTION_FILE_NAME;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (set->inbox_path == NULL && *set->maildir_name == '\0' &&
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina (strcmp(set->layout, MAILBOX_LIST_NAME_MAILDIRPLUSPLUS) == 0 ||
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina strcmp(set->layout, MAILBOX_LIST_NAME_FS) == 0) &&
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina (ns->flags & NAMESPACE_FLAG_INBOX_ANY) != 0) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Maildir++ INBOX is the Maildir base itself */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastatic const char *
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinamaildir_storage_find_root_dir(const struct mail_namespace *ns)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* we'll need to figure out the maildir location ourself.
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina It's ~/Maildir unless we are chrooted. */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (mail_user_get_home(ns->owner, &home) > 0) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina i_debug("maildir: access(%s, rwx): failed: %m", path);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina i_debug("maildir: /cur exists, assuming chroot");
35fa5a83ce8badf6bc868937047f44c3f32b7c28Sumit Bosestatic bool maildir_storage_autodetect(const struct mail_namespace *ns,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina i_debug("maildir autodetect: stat(%s) failed: %m", path);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina i_debug("maildir autodetect: %s not a directory", path);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinamkdir_verify(struct mail_storage *storage, struct mail_namespace *ns,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *dir, mode_t mode, gid_t gid, const char *gid_origin,
if (verify)
const char *path;
const char *path;
int ret = 0;
return ret;
static struct mailbox *
mbox);
return TRUE;
return TRUE;
return FALSE;
const char *root_dir;
int ret;
if (ret > 0) {
if (ret < 0)
const char *path;
int fd;
path);
int ret;
FALSE);
if (ret == 0)
return ret;
bool directory)
int ret;
if (directory &&
if (ret > 0) {
if (ret < 0)
const char *name)
const char *path;
NULL,
NULL,