static int mbox_list_get_path(struct mailbox_list *list, const char *name, enum mailbox_list_path_type type, const char **path_r) { struct mbox_mailbox_list *mlist = MBOX_LIST_CONTEXT(list); const char *path, *p; int ret; *path_r = NULL; ret = mlist->module_ctx.super.get_path(list, name, type, &path); if (ret <= 0) return ret; switch (type) { case MAILBOX_LIST_PATH_TYPE_CONTROL: case MAILBOX_LIST_PATH_TYPE_INDEX: case MAILBOX_LIST_PATH_TYPE_INDEX_CACHE: case MAILBOX_LIST_PATH_TYPE_LIST_INDEX: if (name == NULL && type == MAILBOX_LIST_PATH_TYPE_CONTROL && list->set.control_dir != NULL) { /* kind of a kludge for backwards compatibility: the subscriptions file is in the root control_dir without .imap/ suffix */ *path_r = path; return 1; } if (name == NULL) { *path_r = t_strconcat(path, "/"MBOX_INDEX_DIR_NAME, NULL); return 1; } p = strrchr(path, '/'); if (p == NULL) return 0; *path_r = t_strconcat(t_strdup_until(path, p), "/"MBOX_INDEX_DIR_NAME"/", p+1, NULL); break; case MAILBOX_LIST_PATH_TYPE_DIR: case MAILBOX_LIST_PATH_TYPE_ALT_DIR: case MAILBOX_LIST_PATH_TYPE_MAILBOX: case MAILBOX_LIST_PATH_TYPE_ALT_MAILBOX: case MAILBOX_LIST_PATH_TYPE_INDEX_PRIVATE: *path_r = path; break; } return 1; }
static const char * mbox_list_get_path(struct mailbox_list *list, const char *name, enum mailbox_list_path_type type) { struct mbox_mailbox_list *mlist = MBOX_LIST_CONTEXT(list); const char *path, *p; path = mlist->module_ctx.super.get_path(list, name, type); if (type == MAILBOX_LIST_PATH_TYPE_CONTROL || type == MAILBOX_LIST_PATH_TYPE_INDEX) { if (name == NULL) return t_strconcat(path, "/"MBOX_INDEX_DIR_NAME, NULL); p = strrchr(path, '/'); if (p == NULL) return ""; return t_strconcat(t_strdup_until(path, p), "/"MBOX_INDEX_DIR_NAME"/", p+1, NULL); } return path; }