*_name = str_c(str);
}
-static void
+static bool
mailbox_list_vname_prepare(struct mailbox_list *list, const char **_vname)
{
struct mail_namespace *ns = list->ns;
vname = "INBOX";
} else if (ns->prefix_len > 0) {
/* skip namespace prefix, except if this is INBOX */
- if (strncmp(ns->prefix, vname, ns->prefix_len) == 0)
+ if (strncmp(ns->prefix, vname, ns->prefix_len) == 0) {
vname += ns->prefix_len;
- else if (strncmp(ns->prefix, vname, ns->prefix_len-1) == 0 &&
+ if (strcmp(vname, "INBOX") == 0 &&
+ (list->ns->flags & NAMESPACE_FLAG_INBOX_USER) != 0 &&
+ list->set.storage_name_escape_char != '\0') {
+ /* prefix/INBOX - this is troublesome, because
+ it ends up conflicting with the INBOX name.
+ Handle this in a bit kludgy way by escaping
+ the initial "I" character. */
+ *_vname = t_strdup_printf("%c49NBOX",
+ list->set.storage_name_escape_char);
+ return TRUE;
+ }
+ } else if (strncmp(ns->prefix, vname, ns->prefix_len-1) == 0 &&
strlen(vname) == ns->prefix_len-1 &&
ns->prefix[ns->prefix_len-1] == mail_namespace_get_sep(ns)) {
/* trying to access the namespace prefix itself */
vname = "INBOX";
}
*_vname = vname;
+ return FALSE;
}
static const char *
{
const char *prepared_name = vname;
- mailbox_list_vname_prepare(list, &prepared_name);
+ if (mailbox_list_vname_prepare(list, &prepared_name))
+ return prepared_name;
if (list->ns->type == MAIL_NAMESPACE_TYPE_SHARED &&
(list->ns->flags & NAMESPACE_FLAG_AUTOCREATED) == 0) {
/* Accessing shared namespace root. This is just the initial
.storage_name = "inBox",
.ns_flags = NAMESPACE_FLAG_INBOX_USER,
.ns_prefix = "prefix/", .ns_sep = '/', .list_sep = '.' },
+ { .vname = "prefix/INBOX",
+ .storage_name = "+49NBOX",
+ .ns_flags = NAMESPACE_FLAG_INBOX_USER,
+ .ns_prefix = "prefix/", .ns_sep = '/', .list_sep = '.',
+ .storage_name_escape_char = '+' },
/* Problematic cases - not reversible: */
{ .vname = "parent.child",