mbox-storage.c revision 2dd39e478269d6fb0bb26d12b394aa30ee965e38
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (C) 2002-2003 Timo Sirainen */
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen#define CREATE_MODE 0770 /* umask() should limit it more */
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen/* How often to touch the dotlock file when using KEEP_LOCKED flag */
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen/* Assume that if atime < mtime, there are new mails. If it's good enough for
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen UW-IMAP, it's good enough for us. */
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen (st).st_atime < (st).st_mtime ? MAILBOX_MARKED : MAILBOX_UNMARKED)
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen/* NOTE: must be sorted for istream-header-filter. Note that it's not such
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen a good idea to change this list, as the messages will then change from
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen client's point of view. So if you do it, change all mailboxes' UIDVALIDITY
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen so all caches are reset. */
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainenconst char *mbox_hide_headers[] = {
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen "Content-Length",
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen "X-IMAPbase",
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen "X-Keywords",
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen sizeof(mbox_hide_headers) / sizeof(mbox_hide_headers[0]);
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen/* A bit ugly duplification of the above list. It's safe to modify this list
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen without bad side effects, just keep the list sorted. */
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen "Content-Length",
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen "X-Delivery-ID"
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen "X-IMAPbase",
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen "X-Keywords",
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen sizeof(mbox_save_drop_headers) / sizeof(mbox_save_drop_headers[0]);
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainenstatic MODULE_CONTEXT_DEFINE_INIT(mbox_mailbox_list_module,
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainenstatic int mbox_list_iter_is_mailbox(struct mailbox_list_iterate_context *ctx,
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainenstatic int mbox_list_delete_mailbox(struct mailbox_list *list,
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen const char *name);
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainenint mbox_set_syscall_error(struct mbox_mailbox *mbox, const char *function)
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen mail_storage_set_error(&mbox->storage->storage,
bf333c7645b8ddb6eedd6834db2fd908888793e1Timo Sirainen mail_storage_set_critical(&mbox->storage->storage,
169b1488b6eea7a968021afa4f929b2e26d75d98Timo Sirainen "%s failed with mbox file %s: %m",
c7713320cd35e77543f1bdc7229988a160dae322Timo Sirainenstatic bool mbox_is_file(const char *path, const char *name, bool debug)
7237f2f0a577413e12662228ee2039425fd2f5b0Timo Sirainen i_info("mbox autodetect: %s: stat(%s) failed: %m",
27bb267255b36d34c638c34a1ade611962f00772Timo Sirainen i_info("mbox autodetect: %s: is a directory (%s)",
27bb267255b36d34c638c34a1ade611962f00772Timo Sirainen i_info("mbox autodetect: %s: no R/W access (%s)",
27bb267255b36d34c638c34a1ade611962f00772Timo Sirainen i_info("mbox autodetect: %s: yes (%s)", name, path);
7237f2f0a577413e12662228ee2039425fd2f5b0Timo Sirainenstatic bool mbox_is_dir(const char *path, const char *name, bool debug)
c7713320cd35e77543f1bdc7229988a160dae322Timo Sirainen i_info("mbox autodetect: %s: stat(%s) failed: %m",
c7713320cd35e77543f1bdc7229988a160dae322Timo Sirainen i_info("mbox autodetect: %s: is not a directory (%s)",
c7713320cd35e77543f1bdc7229988a160dae322Timo Sirainen i_info("mbox autodetect: %s: no R/W/X access (%s)",
eba7f36feec8d02c4c394e55ff4effd47e33d311Timo Sirainen i_info("mbox autodetect: %s: yes (%s)", name, path);
eba7f36feec8d02c4c394e55ff4effd47e33d311Timo Sirainenstatic bool mbox_autodetect(const char *data, enum mail_storage_flags flags)
eba7f36feec8d02c4c394e55ff4effd47e33d311Timo Sirainen bool debug = (flags & MAIL_STORAGE_FLAG_DEBUG) != 0;
eba7f36feec8d02c4c394e55ff4effd47e33d311Timo Sirainen i_info("mbox autodetect: data=%s, splitting ':' -> %s",
eba7f36feec8d02c4c394e55ff4effd47e33d311Timo Sirainen if (*path != '\0' && mbox_is_file(path, "INBOX file", debug))
eba7f36feec8d02c4c394e55ff4effd47e33d311Timo Sirainen if (mbox_is_dir(t_strconcat(path, "/"MBOX_INDEX_DIR_NAME, NULL),
eba7f36feec8d02c4c394e55ff4effd47e33d311Timo Sirainen if (mbox_is_file(t_strconcat(path, "/inbox", NULL), "has inbox", debug))
eba7f36feec8d02c4c394e55ff4effd47e33d311Timo Sirainen if (mbox_is_file(t_strconcat(path, "/mbox", NULL), "has mbox", debug))
eba7f36feec8d02c4c394e55ff4effd47e33d311Timo Sirainenstatic const char *get_root_dir(enum mail_storage_flags flags)
eba7f36feec8d02c4c394e55ff4effd47e33d311Timo Sirainen bool debug = (flags & MAIL_STORAGE_FLAG_DEBUG) != 0;
d78f1ac9dc0f3e6c64cebe9ee331ec6b3c160e89Timo Sirainen i_info("mbox: root: access(%s, rwx) failed: %m", path);
d78f1ac9dc0f3e6c64cebe9ee331ec6b3c160e89Timo Sirainen i_info("mbox: root: access(%s, rwx) failed: %m", path);
d78f1ac9dc0f3e6c64cebe9ee331ec6b3c160e89Timo Sirainen i_info("mbox: root mail directory not found");
d78f1ac9dc0f3e6c64cebe9ee331ec6b3c160e89Timo Sirainenstatic const char *
d78f1ac9dc0f3e6c64cebe9ee331ec6b3c160e89Timo Sirainenget_inbox_file(const char *root_dir, bool only_root, bool debug)
d78f1ac9dc0f3e6c64cebe9ee331ec6b3c160e89Timo Sirainen if (!only_root && (user = getenv("USER")) != NULL) {
68cc278710182485b6c09e9a9ff8db90a727f343Aki Tuomi i_info("mbox: INBOX: access(%s, rw) failed: %m", path);
68cc278710182485b6c09e9a9ff8db90a727f343Aki Tuomi path = t_strconcat("/var/spool/mail/", user, NULL);
68cc278710182485b6c09e9a9ff8db90a727f343Aki Tuomi i_info("mbox: INBOX: access(%s, rw) failed: %m", path);
c7713320cd35e77543f1bdc7229988a160dae322Timo Sirainenstatic const char *create_root_dir(bool debug, const char **error_r)
eba7f36feec8d02c4c394e55ff4effd47e33d311Timo Sirainen "home directory is missing";
eba7f36feec8d02c4c394e55ff4effd47e33d311Timo Sirainen *error_r = t_strdup_printf("mkdir(%s) failed: %m", path);
d78f1ac9dc0f3e6c64cebe9ee331ec6b3c160e89Timo Sirainen i_info("mbox: root directory created: %s", path);
d78f1ac9dc0f3e6c64cebe9ee331ec6b3c160e89Timo Sirainenmbox_get_list_settings(struct mailbox_list_settings *list_set,
bool autodetect;
if (autodetect) {
if (debug)
if (p == NULL) {
} while (p != NULL);
const char *path, *p;
if (p == NULL)
return path;
const char **error_r)
const char *layout;
int fd;
rootdir);
const char *env;
unsigned int min_size;
return FALSE;
if (min_size == 0)
return FALSE;
return FALSE;
static struct mbox_mailbox *
return NULL;
return mbox;
static struct mailbox *
const char *path;
static struct mailbox *
const char *path;
return NULL;
static struct mailbox *
const char *path;
return NULL;
name));
return NULL;
path);
return NULL;
bool directory)
const char *path, *p;
int fd;
if (p != NULL) {
if (directory) {
int ret = 0;
const char *inbox_path;
return FALSE;
t_push();
ret = 0;
t_pop();
return ret;
const char *name)
static void mbox_class_init(void)
static void mbox_class_deinit(void)
NULL,
NULL,