mailbox-list-maildir.c revision b5a084602a3dc2c118345f6d2990f47c1ff66264
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen/* Copyright (C) 2006 Timo Sirainen */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "lib.h"
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen#include "hostpid.h"
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen#include "home-expand.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "subscription-file.h"
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen#include "mailbox-list-maildir.h"
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen#include <sys/stat.h>
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenextern struct mailbox_list maildir_mailbox_list;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic struct mailbox_list *maildir_list_alloc(void)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct maildir_mailbox_list *list;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen pool_t pool;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen pool = pool_alloconly_create("maildir++ list", 1024);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen list = p_new(pool, struct maildir_mailbox_list, 1);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen list->list = maildir_mailbox_list;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen list->list.pool = pool;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen list->temp_prefix =
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen p_strconcat(pool, "temp.", my_hostname, ".", my_pid, ".", NULL);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return &list->list;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic void maildir_list_deinit(struct mailbox_list *_list)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct maildir_mailbox_list *list =
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen (struct maildir_mailbox_list *)_list;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen pool_unref(list->list.pool);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic const char *
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenmaildir_list_get_absolute_path(struct mailbox_list *list, const char *name)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen const char *p;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (home_try_expand(&name) < 0) {
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* fallback to using as ~name */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return name;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen }
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen p = strrchr(name, '/');
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (p == NULL)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return name;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return t_strdup_printf("%s/%c%s", t_strdup_until(name, p),
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen list->hierarchy_sep, p+1);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic bool
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenmaildir_list_is_valid_common(struct mailbox_list *list, const char *name,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen size_t *len_r)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen size_t len;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* check that there are no adjacent hierarchy separators */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen for (len = 0; name[len] != '\0'; len++) {
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (name[len] == list->hierarchy_sep &&
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen name[len+1] == list->hierarchy_sep)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return FALSE;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen }
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (len == 0 || name[len-1] == '/')
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return FALSE;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (name[0] == list->hierarchy_sep ||
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen name[len-1] == list->hierarchy_sep)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return FALSE;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen *len_r = len;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return TRUE;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic bool maildir_list_is_valid_common_nonfs(const char *name)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (*name == '~' || strchr(name, '/') != NULL)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return FALSE;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (name[0] == '.' && (name[1] == '\0' ||
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen (name[1] == '.' && name[2] == '\0'))) {
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* "." and ".." aren't allowed. */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return FALSE;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen }
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return TRUE;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic bool __attr_noreturn__
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenmaildir_is_valid_mask(struct mailbox_list *list __attr_unused__,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen const char *mask __attr_unused__)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen i_unreached();
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen#ifndef __attrs_used__
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return FALSE;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen#endif
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic bool
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenmaildir_is_valid_existing_name(struct mailbox_list *list, const char *name)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen size_t len;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (!maildir_list_is_valid_common(list, name, &len))
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return FALSE;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if ((list->flags & MAILBOX_LIST_FLAG_FULL_FS_ACCESS) != 0)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return TRUE;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return maildir_list_is_valid_common_nonfs(name);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic bool
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenmaildir_is_valid_create_name(struct mailbox_list *list, const char *name)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen size_t len;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (!maildir_list_is_valid_common(list, name, &len))
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return FALSE;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (len > MAILDIR_MAX_CREATE_MAILBOX_NAME_LENGTH)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return FALSE;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if ((list->flags & MAILBOX_LIST_FLAG_FULL_FS_ACCESS) != 0)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return TRUE;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (!maildir_list_is_valid_common_nonfs(name))
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return FALSE;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (mailbox_list_name_is_too_large(name, list->hierarchy_sep))
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return FALSE;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return TRUE;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen}
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic const char *
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenmaildir_list_get_path(struct mailbox_list *_list, const char *name,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen enum mailbox_list_path_type type)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen struct maildir_mailbox_list *list =
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen (struct maildir_mailbox_list *)_list;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen mailbox_list_clear_error(&list->list);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (name == NULL) {
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* return root directories */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen switch (type) {
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen case MAILBOX_LIST_PATH_TYPE_DIR:
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen case MAILBOX_LIST_PATH_TYPE_MAILBOX:
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return _list->set.root_dir;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen case MAILBOX_LIST_PATH_TYPE_CONTROL:
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return _list->set.control_dir != NULL ?
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen _list->set.control_dir : _list->set.root_dir;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen case MAILBOX_LIST_PATH_TYPE_INDEX:
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return _list->set.index_dir != NULL ?
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen _list->set.index_dir : _list->set.root_dir;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen }
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen i_unreached();
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen }
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen i_assert(mailbox_list_is_valid_existing_name(_list, name));
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if ((list->list.flags & MAILBOX_LIST_FLAG_FULL_FS_ACCESS) != 0 &&
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen (*name == '/' || *name == '~'))
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return maildir_list_get_absolute_path(_list, name);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen switch (type) {
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen case MAILBOX_LIST_PATH_TYPE_DIR:
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen case MAILBOX_LIST_PATH_TYPE_MAILBOX:
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen break;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen case MAILBOX_LIST_PATH_TYPE_CONTROL:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (_list->set.control_dir != NULL) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return t_strdup_printf("%s/%c%s",
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen _list->set.control_dir,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen _list->hierarchy_sep, name);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen break;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen case MAILBOX_LIST_PATH_TYPE_INDEX:
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (_list->set.index_dir != NULL) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (*_list->set.index_dir == '\0')
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return "";
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return t_strdup_printf("%s/%c%s", _list->set.index_dir,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen _list->hierarchy_sep, name);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen break;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (strcmp(name, "INBOX") == 0) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return _list->set.inbox_path != NULL ?
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen _list->set.inbox_path : _list->set.root_dir;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen return t_strdup_printf("%s/%c%s", _list->set.root_dir,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen _list->hierarchy_sep, name);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic int
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainenmaildir_list_get_mailbox_name_status(struct mailbox_list *_list,
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen const char *name,
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen enum mailbox_name_status *status)
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen{
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen struct maildir_mailbox_list *list =
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen (struct maildir_mailbox_list *)_list;
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen struct stat st;
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen const char *path;
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mailbox_list_clear_error(&list->list);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (!mailbox_list_is_valid_existing_name(_list, name)) {
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen *status = MAILBOX_NAME_INVALID;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return 0;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen path = mailbox_list_get_path(_list, name,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen MAILBOX_LIST_PATH_TYPE_MAILBOX);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (strcmp(name, "INBOX") == 0 || stat(path, &st) == 0) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen *status = MAILBOX_NAME_EXISTS;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return 0;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (!mailbox_list_is_valid_create_name(_list, name)) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen *status = MAILBOX_NAME_INVALID;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return 0;
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (ENOTFOUND(errno) || errno == EACCES) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen *status = MAILBOX_NAME_VALID;
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen return 0;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen } else {
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen mailbox_list_set_critical(_list, "stat(%s) failed: %m", path);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return -1;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainenstatic const char *
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenmaildir_list_get_temp_prefix(struct mailbox_list *_list)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct maildir_mailbox_list *list =
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen (struct maildir_mailbox_list *)_list;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return list->temp_prefix;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainenstatic const char *
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainenmaildir_list_join_refmask(struct mailbox_list *_list __attr_unused__,
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen const char *ref, const char *mask)
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen{
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen if (*ref != '\0') {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* merge reference and mask */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mask = t_strconcat(ref, mask, NULL);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return mask;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainenstatic int maildir_list_set_subscribed(struct mailbox_list *_list,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *name, bool set)
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen{
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen struct maildir_mailbox_list *list =
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen (struct maildir_mailbox_list *)_list;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen const char *path;
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mailbox_list_clear_error(&list->list);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen path = t_strconcat(_list->set.control_dir != NULL ?
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen _list->set.control_dir : _list->set.root_dir,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen "/", _list->set.subscription_fname, NULL);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return subsfile_set_subscribed(_list, path, list->temp_prefix,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen name, set);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstruct mailbox_list maildir_mailbox_list = {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen MEMBER(name) "maildir++",
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen MEMBER(hierarchy_sep) '.',
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen MEMBER(mailbox_name_max_length) PATH_MAX,
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen maildir_list_alloc,
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen maildir_list_deinit,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen maildir_is_valid_mask,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen maildir_is_valid_existing_name,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen maildir_is_valid_create_name,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen maildir_list_get_path,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen maildir_list_get_mailbox_name_status,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen maildir_list_get_temp_prefix,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen maildir_list_join_refmask,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen maildir_list_iter_init,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen maildir_list_iter_next,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen maildir_list_iter_deinit,
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainen maildir_list_set_subscribed
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen};
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen