maildir-storage.c revision 8754bb7a1f24705ffa5434f9e10d57e0b3b88d6e
a8c5a86d183db25a57bf193c06b41e092ec2e151Timo Sirainen/* Copyright (C) 2002-2003 Timo Sirainen */
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainen#include "subscription-file/subscription-file.h"
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainen#define CREATE_MODE 0770 /* umask() should limit it more */
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainenstatic const char *maildirs[] = { "cur", "new", "tmp", NULL };
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainenstatic int verify_inbox(struct maildir_storage *storage);
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainenmaildir_create(const char *data, const char *user,
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainen int debug = (flags & MAIL_STORAGE_FLAG_DEBUG) != 0;
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainen const char *root_dir, *inbox_dir, *index_dir, *control_dir;
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainen inbox_dir = root_dir = index_dir = control_dir = NULL;
e169102fb38ce788b76c2a344bee7d77079dea05Timo Sirainen /* we'll need to figure out the maildir location ourself.
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainen It's $HOME/Maildir unless we are chrooted. */
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainen i_info("maildir: /cur exists, assuming chroot");
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainen /* <Maildir> [:INBOX=<dir>] [:INDEX=<dir>] [:CONTROL=<dir>] */
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainen } while (p != NULL);
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainen /* strip trailing '/' */
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainen i_info("maildir: root=%s, index=%s, control=%s, inbox=%s",
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainen storage = p_new(pool, struct maildir_storage, 1);
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainen storage->control_dir = p_strdup(pool, home_expand(control_dir));
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainen /* the default ".temp.xxx" prefix would be treated as directory */
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainen p_strconcat(pool, "temp.", my_hostname, ".", my_pid, ".", NULL);
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainen istorage->dir = p_strdup(pool, home_expand(root_dir));
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainen istorage->inbox_path = p_strdup(pool, home_expand(inbox_dir));
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainen istorage->index_dir = p_strdup(pool, home_expand(index_dir));
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainen istorage->callbacks = p_new(pool, struct mail_storage_callbacks, 1);
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainen index_storage_init(istorage, flags, lock_method);
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainenstatic void maildir_free(struct mail_storage *_storage)
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainen struct index_storage *storage = (struct index_storage *) _storage;
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainenstatic int maildir_autodetect(const char *data, enum mail_storage_flags flags)
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainen int debug = (flags & MAIL_STORAGE_FLAG_DEBUG) != 0;
8fcf84e6b7a55049a6d407b17af50d6ae8c6386fPhil Carmody i_info("maildir autodetect: stat(%s) failed: %m", path);
5550482ce58e51584f83c10a4c63d35b66431742Timo Sirainen i_info("maildir autodetect: %s not a directory", path);
const char *name)
return FALSE;
return TRUE;
return FALSE;
return TRUE;
const char *name)
return FALSE;
return TRUE;
return FALSE;
return TRUE;
if (p == NULL)
return name;
const char *name)
return NULL;
const char *name)
return default_path;
const char *dest_uidlist =
return path;
if (verify) {
const char *dir;
const char *dir;
const char *path;
static struct mailbox *
int shared;
if (shared)
return NULL;
if (!shared)
static struct mailbox *
const char *path;
return NULL;
return NULL;
return NULL;
return NULL;
name);
return NULL;
path);
return NULL;
int fd;
const char *name,
const char *name)
int count;
name);
count = 0;
count++;
int ret;
ret = 0;
t_push();
t_pop();
t_pop();
return ret;
if (ret < 0)
const char *path;
const char *name,
const char *path;
path);
int ret = 0;
return ret;