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);
}
示例#2
0
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;
}