mailbox-list-maildir.c revision b5a084602a3dc2c118345f6d2990f47c1ff66264
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen/* Copyright (C) 2006 Timo Sirainen */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenextern struct mailbox_list maildir_mailbox_list;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic struct mailbox_list *maildir_list_alloc(void)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen pool = pool_alloconly_create("maildir++ list", 1024);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen list = p_new(pool, struct maildir_mailbox_list, 1);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen p_strconcat(pool, "temp.", my_hostname, ".", my_pid, ".", NULL);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic void maildir_list_deinit(struct mailbox_list *_list)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic const char *
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenmaildir_list_get_absolute_path(struct mailbox_list *list, const char *name)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen const char *p;
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* fallback to using as ~name */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return t_strdup_printf("%s/%c%s", t_strdup_until(name, p),
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenmaildir_list_is_valid_common(struct mailbox_list *list, const char *name,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* check that there are no adjacent hierarchy separators */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic bool maildir_list_is_valid_common_nonfs(const char *name)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (*name == '~' || strchr(name, '/') != NULL)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* "." and ".." aren't allowed. */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenmaildir_is_valid_mask(struct mailbox_list *list __attr_unused__,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenmaildir_is_valid_existing_name(struct mailbox_list *list, const char *name)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (!maildir_list_is_valid_common(list, name, &len))
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if ((list->flags & MAILBOX_LIST_FLAG_FULL_FS_ACCESS) != 0)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return maildir_list_is_valid_common_nonfs(name);
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenmaildir_is_valid_create_name(struct mailbox_list *list, const char *name)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (!maildir_list_is_valid_common(list, name, &len))
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (len > MAILDIR_MAX_CREATE_MAILBOX_NAME_LENGTH)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if ((list->flags & MAILBOX_LIST_FLAG_FULL_FS_ACCESS) != 0)
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (!maildir_list_is_valid_common_nonfs(name))
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if (mailbox_list_name_is_too_large(name, list->hierarchy_sep))
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenstatic const char *
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenmaildir_list_get_path(struct mailbox_list *_list, const char *name,
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen /* return root directories */
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen i_assert(mailbox_list_is_valid_existing_name(_list, name));
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen if ((list->list.flags & MAILBOX_LIST_FLAG_FULL_FS_ACCESS) != 0 &&
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainen return maildir_list_get_absolute_path(_list, name);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return t_strdup_printf("%s/%c%s", _list->set.index_dir,
b7b81543899e306c71e6152516d8698416162bcbTimo Sirainen return t_strdup_printf("%s/%c%s", _list->set.root_dir,
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainenmaildir_list_get_mailbox_name_status(struct mailbox_list *_list,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (!mailbox_list_is_valid_existing_name(_list, name)) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (strcmp(name, "INBOX") == 0 || stat(path, &st) == 0) {
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (!mailbox_list_is_valid_create_name(_list, name)) {
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainen mailbox_list_set_critical(_list, "stat(%s) failed: %m", path);
d8b77aef97e89f1ccc5cbdaef77be9052279e35fTimo Sirainenstatic const char *
0c17af9d3f9323136a94e66605776ed4462a172dTimo Sirainenmaildir_list_get_temp_prefix(struct mailbox_list *_list)
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainenstatic const char *
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainenmaildir_list_join_refmask(struct mailbox_list *_list __attr_unused__,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen /* merge reference and mask */
fd3d711f219fd6813492acbe051e04327f0ca0f0Timo Sirainenstatic int maildir_list_set_subscribed(struct mailbox_list *_list,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen path = t_strconcat(_list->set.control_dir != NULL ?