maildir-storage.c revision 228a8ec0216964c7418a9a0f7ace07da4092f729
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (C) 2002-2006 Timo Sirainen */
6610dc505a7053e6d52e79cc865e845f44901f4cTimo Sirainen#define CREATE_MODE 0777 /* umask() should limit it more */
6610dc505a7053e6d52e79cc865e845f44901f4cTimo Sirainen/* How often to touch the uidlist lock file when using KEEP_LOCKED flag */
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainen#define MAILDIR_PLUSPLUS_DRIVER_NAME "maildir++"
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainen#define MAILDIR_SUBFOLDER_FILENAME "maildirfolder"
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainenstatic int verify_inbox(struct mail_storage *storage);
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainenstatic const char *strip_tail_slash(const char *path)
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainenstatic const char *strip_tail_slash_and_cut(const char *path)
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainenmaildir_get_list_settings(struct mailbox_list_settings *list_set,
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainen const char *data, enum mail_storage_flags flags)
fe7a56906e8bdf6e42cc981b4a62e31bac4a30f4Timo Sirainen bool debug = (flags & MAIL_STORAGE_FLAG_DEBUG) != 0;
fe7a56906e8bdf6e42cc981b4a62e31bac4a30f4Timo Sirainen list_set->subscription_fname = MAILDIR_SUBSCRIPTION_FILE_NAME;
fe7a56906e8bdf6e42cc981b4a62e31bac4a30f4Timo Sirainen if ((flags & MAIL_STORAGE_FLAG_NO_AUTODETECTION) != 0) {
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainen /* we'll need to figure out the maildir location ourself.
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainen It's $HOME/Maildir unless we are chrooted. */
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainen i_info("maildir: /cur exists, assuming chroot");
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainen /* <Maildir> [:INBOX=<dir>] [:INDEX=<dir>] [:CONTROL=<dir>] */
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainen } while (p != NULL);
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainen list_set->root_dir = strip_tail_slash(list_set->root_dir);
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainenmaildir_create(const char *data, const char *user,
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainen if (maildir_get_list_settings(&list_set, data, flags) < 0)
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainen /* normally the maildir is created in verify_inbox() */
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainen if ((flags & MAIL_STORAGE_FLAG_NO_AUTOCREATE) != 0) {
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainen pool = pool_alloconly_create("storage", 512+256);
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainen storage = p_new(pool, struct maildir_storage, 1);
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainen getenv("MAILDIR_COPY_WITH_HARDLINKS") != NULL;
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainen getenv("MAILDIR_COPY_PRESERVE_FILENAME") != NULL;
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainen storage->stat_dirs = getenv("MAILDIR_STAT_DIRS") != NULL;
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainen storage->temp_prefix = mailbox_list_get_temp_prefix(list);
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainen /* put the temp files into tmp/ directory preferrably */
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainen p_strconcat(pool, "tmp/", storage->temp_prefix, NULL);
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainen index_storage_init(istorage, list, flags, lock_method);
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainenstatic void maildir_free(struct mail_storage *_storage)
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainen struct index_storage *storage = (struct index_storage *) _storage;
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainenstatic bool maildir_autodetect(const char *data, enum mail_storage_flags flags)
55ca77c6ae6a081cdf6cc4dd515959afb9840da9Timo Sirainen bool debug = (flags & MAIL_STORAGE_FLAG_DEBUG) != 0;
const char *path;
if (debug)
return FALSE;
if (debug)
return FALSE;
return TRUE;
const char *root_dir;
return NULL;
MAILDIR_PLUSPLUS_DRIVER_NAME) != 0) {
return NULL;
if (verify) {
if (!verify)
const char *path;
name);
name);
const char *path;
static struct mailbox *
int shared;
if (shared)
if (!shared) {
return NULL;
mbox);
static struct mailbox *
const char *path;
return NULL;
return NULL;
return NULL;
return NULL;
return NULL;
return NULL;
path);
return NULL;
const char *path;
int fd;
const char *name,
int fd;
const char *name)
int count;
count = 0;
dest);
count++;
const char *const *names;
unsigned int i, count;
int ret;
ret = 0;
const char *name;
for (i = 0; i < count; i++) {
t_push();
t_pop();
t_pop();
return ret;
int ret;
bool found;
if (ret < 0)
int ret = 0;
return ret;
int ret;
MAILDIR_PLUSPLUS_DRIVER_NAME) == 0) {
const char *path;
t_push();
t_pop();
switch (type) {
const char *path;
t_push();
t_pop();
if (ret == 0)
return ret;
static void maildir_class_init(void)
static void maildir_class_deinit(void)