To avoid collision with storage name escape character, use an
alternative char ('^') if hierarchy separator for list index is the same char.
static char index_list_get_hierarchy_sep(struct mailbox_list *list)
{
- return *list->ns->set->separator != '\0' ? *list->ns->set->separator :
- MAILBOX_LIST_INDEX_HIERARCHY_SEP;
+ char sep = list->ns->set->separator[0];
+
+ if (sep == '\0')
+ sep = MAILBOX_LIST_INDEX_HIERARCHY_SEP;
+ if (sep == list->set.storage_name_escape_char) {
+ /* Separator conflicts with the escape character.
+ Use something else. */
+ if (sep != MAILBOX_LIST_INDEX_HIERARCHY_SEP)
+ sep = MAILBOX_LIST_INDEX_HIERARCHY_SEP;
+ else
+ sep = MAILBOX_LIST_INDEX_HIERARCHY_ALT_SEP;
+ }
+ return sep;
}
static int
#include <sys/time.h>
#define MAILBOX_LIST_INDEX_HIERARCHY_SEP '~'
+#define MAILBOX_LIST_INDEX_HIERARCHY_ALT_SEP '^'
#define INDEX_LIST_CONTEXT(obj) \
MODULE_CONTEXT(obj, mailbox_list_index_module)