dovecot-2.0: mail_location: Allow using ":" characters in dir na...

dovecot at dovecot.org dovecot at dovecot.org
Mon Jun 22 05:13:11 EEST 2009


details:   http://hg.dovecot.org/dovecot-2.0/rev/1769b18aea5b
changeset: 9497:1769b18aea5b
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Jun 21 22:21:38 2009 -0400
description:
mail_location: Allow using ":" characters in dir names by escaping it as "::".

diffstat:

1 file changed, 28 insertions(+), 8 deletions(-)
src/lib-storage/mailbox-list.c |   36 ++++++++++++++++++++++++++++--------

diffs (65 lines):

diff -r 4fd624e60da1 -r 1769b18aea5b src/lib-storage/mailbox-list.c
--- a/src/lib-storage/mailbox-list.c	Sun Jun 21 21:46:46 2009 -0400
+++ b/src/lib-storage/mailbox-list.c	Sun Jun 21 22:21:38 2009 -0400
@@ -177,11 +177,30 @@ static int fix_path(struct mail_namespac
 	return 0;
 }
 
+static const char *split_next_arg(const char *const **_args)
+{
+	const char *const *args = *_args;
+	const char *str = args[0];
+
+	args++;
+	while (*args != NULL && **args == '\0') {
+		args++;
+		if (*args == NULL) {
+			str = t_strconcat(str, ":", NULL);
+			break;
+		}
+		str = t_strconcat(str, ":", *args, NULL);
+		args++;
+	}
+	*_args = args;
+	return str;
+}
+
 int mailbox_list_settings_parse(const char *data,
 				struct mailbox_list_settings *set,
 				struct mail_namespace *ns, const char **error_r)
 {
-	const char *const *tmp, *key, *value, **dest;
+	const char *const *tmp, *key, *value, **dest, *str;
 
 	*error_r = NULL;
 
@@ -190,21 +209,22 @@ int mailbox_list_settings_parse(const ch
 
 	/* <root dir> */
 	tmp = t_strsplit(data, ":");
-	if (fix_path(ns, *tmp, &set->root_dir) < 0) {
+	str = split_next_arg(&tmp);
+	if (fix_path(ns, str, &set->root_dir) < 0) {
 		*error_r = t_strdup_printf(
 			"Home directory not set, can't expand ~/ for "
 			"mail root dir in: %s", data);
 		return -1;
 	}
-	tmp++;
-
-	for (; *tmp != NULL; tmp++) {
-		value = strchr(*tmp, '=');
+
+	while (*tmp != NULL) {
+		str = split_next_arg(&tmp);
+		value = strchr(str, '=');
 		if (value == NULL) {
-			key = *tmp;
+			key = str;
 			value = "";
 		} else {
-			key = t_strdup_until(*tmp, value);
+			key = t_strdup_until(str, value);
 			value++;
 		}
 


More information about the dovecot-cvs mailing list