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

dovecot at dovecot.org dovecot at dovecot.org
Mon Jun 22 05:14:25 EEST 2009


details:   http://hg.dovecot.org/dovecot-1.2/rev/675f0df22f24
changeset: 9143:675f0df22f24
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Jun 21 22:22:57 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 (67 lines):

diff -r 5ee5def4f0ff -r 675f0df22f24 src/lib-storage/mailbox-list.c
--- a/src/lib-storage/mailbox-list.c	Wed Jun 17 13:05:40 2009 -0400
+++ b/src/lib-storage/mailbox-list.c	Sun Jun 21 22:22:57 2009 -0400
@@ -118,13 +118,32 @@ 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 **layout, const char **alt_dir_r,
 				const char **error_r)
 {
-	const char *const *tmp, *key, *value, **dest;
+	const char *const *tmp, *key, *value, **dest, *str;
 
 	i_assert(*data != '\0');
 
@@ -134,21 +153,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