static const char * maildir_list_get_absolute_path(struct mailbox_list *list, const char *name) { const char *p; if (!mailbox_list_try_get_absolute_path(list, &name)) { /* fallback to using as ~name */ return name; } p = strrchr(name, '/'); if (p == NULL) return name; return maildir_list_get_dirname_path(list, t_strdup_until(name, p), p+1); }
static int maildir_list_get_path(struct mailbox_list *_list, const char *name, enum mailbox_list_path_type type, const char **path_r) { const char *root_dir; if (name == NULL) { /* return root directories */ return mailbox_list_set_get_root_path(&_list->set, type, path_r) ? 1 : 0; } if (_list->mail_set->mail_full_filesystem_access && (*name == '/' || *name == '~')) { *path_r = maildir_list_get_absolute_path(_list, name); return 1; } root_dir = _list->set.root_dir; switch (type) { case MAILBOX_LIST_PATH_TYPE_DIR: case MAILBOX_LIST_PATH_TYPE_MAILBOX: break; case MAILBOX_LIST_PATH_TYPE_ALT_DIR: case MAILBOX_LIST_PATH_TYPE_ALT_MAILBOX: if (_list->set.alt_dir == NULL) return 0; root_dir = _list->set.alt_dir; break; case MAILBOX_LIST_PATH_TYPE_CONTROL: if (_list->set.control_dir != NULL) { *path_r = maildir_list_get_dirname_path(_list, _list->set.control_dir, name); return 1; } break; case MAILBOX_LIST_PATH_TYPE_INDEX: if (_list->set.index_dir != NULL) { if (*_list->set.index_dir == '\0') return 0; *path_r = maildir_list_get_dirname_path(_list, _list->set.index_dir, name); return 1; } break; case MAILBOX_LIST_PATH_TYPE_INDEX_PRIVATE: if (_list->set.index_pvt_dir == NULL) return 0; *path_r = maildir_list_get_dirname_path(_list, _list->set.index_pvt_dir, name); return 1; } if (type == MAILBOX_LIST_PATH_TYPE_ALT_DIR || type == MAILBOX_LIST_PATH_TYPE_ALT_MAILBOX) { /* don't use inbox_path */ } else if (strcmp(name, "INBOX") == 0 && _list->set.inbox_path != NULL) { *path_r = _list->set.inbox_path; return 1; } *path_r = maildir_list_get_dirname_path(_list, root_dir, name); return 1; }