maildir-storage.c revision e0965ef0a118013e7ff47efa3d2c01084fcf31c8
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen/* Copyright (C) 2002-2003 Timo Sirainen */
3e0bae44b65f5c46989fcef3d1e07203f496327eTimo Sirainen#include "subscription-file/subscription-file.h"
296dca49e4fe6046e0328c67ef1cf4b8077dec9cTimo Sirainen#define CREATE_MODE 0770 /* umask() should limit it more */
eb64c3586d854cddd693f0b811d897399076a441Timo Sirainenstatic const char *maildirs[] = { "cur", "new", "tmp", NULL };
eb64c3586d854cddd693f0b811d897399076a441Timo Sirainenstatic int verify_inbox(struct index_storage *storage);
32e1554df9abca74fef0af2ba2e4c37e90a06cd0Timo Sirainenmaildir_create(const char *data, const char *user,
b337d3b6871b878d6467d7d8ed600433af5da5a1Timo Sirainen const char *root_dir, *inbox_dir, *index_dir, *control_dir;
16db188cfddce117500a161302f17ae691b4500eTimo Sirainen inbox_dir = root_dir = index_dir = control_dir = NULL;
16db188cfddce117500a161302f17ae691b4500eTimo Sirainen /* we'll need to figure out the maildir location ourself.
296dca49e4fe6046e0328c67ef1cf4b8077dec9cTimo Sirainen it's either root dir if we've already chroot()ed, or
296dca49e4fe6046e0328c67ef1cf4b8077dec9cTimo Sirainen $HOME/Maildir otherwise */
af3f857bb3166ed99595e11a9d18e5b5cc670e1aTimo Sirainen /* <Maildir> [:INBOX=<dir>] [:INDEX=<dir>] [:CONTROL=<dir>] */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen } while (p != NULL);
d9250ee7e2815bb2116134b58f7c860578148d6cTimo Sirainen /* strip trailing '/' */
90804278df6586cceaf1b1b07a44713c01694048Timo Sirainen storage->storage.hierarchy_sep = hierarchy_sep;
6145bd3b17b9135b77b0b42409a0cc3fa0d1b946Timo Sirainen storage->storage.namespace = i_strdup(namespace);
6145bd3b17b9135b77b0b42409a0cc3fa0d1b946Timo Sirainen /* the default ".temp.xxx" prefix would be treated as directory */
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen i_strconcat("temp.", my_hostname, ".", my_pid, ".", NULL);
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen storage->dir = i_strdup(home_expand(root_dir));
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen storage->inbox_path = i_strdup(home_expand(inbox_dir));
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen storage->index_dir = i_strdup(home_expand(index_dir));
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainen storage->control_dir = i_strdup(home_expand(control_dir));
c8cf8a605e0ddea7cb36fe04551aeca5090e684bTimo Sirainen storage->callbacks = i_new(struct mail_storage_callbacks, 1);
c0a87e5f3316a57e6f915882fa1951d0fbb74a61Timo Sirainenstatic void maildir_free(struct mail_storage *_storage)
14376e0584c178306c400750352869cf2aaf6feeTimo Sirainen struct index_storage *storage = (struct index_storage *) _storage;
9b706b345064ce8e8a657f54633f009a101298eaTimo Sirainenstatic int maildir_autodetect(const char *data)
9b706b345064ce8e8a657f54633f009a101298eaTimo Sirainen return stat(t_strconcat(data, "/cur", NULL), &st) == 0 &&
9b706b345064ce8e8a657f54633f009a101298eaTimo Sirainenstatic int maildir_is_valid_create_name(const char *name)
957d09e495c33ad1180f82152e5e87e6b51ab04bTimo Sirainen strchr(name, '*') != NULL || strchr(name, '%') != NULL)
957d09e495c33ad1180f82152e5e87e6b51ab04bTimo Sirainen if (*name == '~' || strchr(name, '/') != NULL)
2615df45a8027948a474abe5e817b34b0499c171Timo Sirainenstatic int maildir_is_valid_existing_name(const char *name)
14b551180cb4ac7acac8b048d8d6d7278541d1f6Timo Sirainen if (name[0] == '\0' || name[strlen(name)-1] == '/')
return FALSE;
return TRUE;
if (p == NULL)
return name;
return name;
return name;
return name;
if (*p == sep)
*p = MAILDIR_FS_SEP;
return dup;
const char *name)
return NULL;
const char *name)
if (verify) {
const char *dir;
const char *dir;
const char *inbox;
static struct mailbox *
return NULL;
static struct mailbox *
const char *path;
return NULL;
return NULL;
return NULL;
name);
return NULL;
path);
return NULL;
const char *name,
const char *path;
const char *name)
int count;
name);
count = 0;
count++;
int ret;
ret = 0;
const char *list_name;
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;
unsigned int min_newmail_notify_interval)
if (flags == 0) {
NULL,