dovecot-2.0-sslstream: master: Give a nicer error message if dup...

dovecot at dovecot.org dovecot at dovecot.org
Sat Feb 13 02:56:36 EET 2010


details:   http://hg.dovecot.org/dovecot-2.0-sslstream/rev/b21b3b373c74
changeset: 10376:b21b3b373c74
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Nov 19 18:18:31 2009 -0500
description:
master: Give a nicer error message if duplicate listeners exist.

diffstat:

1 file changed, 40 insertions(+), 4 deletions(-)
src/master/master-settings.c |   44 ++++++++++++++++++++++++++++++++++++++----

diffs (83 lines):

diff -r 17eac5a18ce4 -r b21b3b373c74 src/master/master-settings.c
--- a/src/master/master-settings.c	Thu Nov 19 18:00:08 2009 -0500
+++ b/src/master/master-settings.c	Thu Nov 19 18:18:31 2009 -0500
@@ -233,7 +233,8 @@ const struct setting_parser_info master_
 
 /* <settings checks> */
 static void fix_file_listener_paths(ARRAY_TYPE(file_listener_settings) *l,
-				    pool_t pool, const char *base_dir)
+				    pool_t pool, const char *base_dir,
+				    ARRAY_TYPE(const_string) *all_listeners)
 {
 	struct file_listener_settings *const *sets;
 	unsigned int i, count;
@@ -247,6 +248,24 @@ static void fix_file_listener_paths(ARRA
 			sets[i]->path = p_strconcat(pool, base_dir, "/",
 						    sets[i]->path, NULL);
 		}
+		array_append(all_listeners, &sets[i]->path, 1);
+	}
+}
+
+static void add_inet_listeners(ARRAY_TYPE(inet_listener_settings) *l,
+			       ARRAY_TYPE(const_string) *all_listeners)
+{
+	struct inet_listener_settings *const *sets;
+	unsigned int i, count;
+	const char *str;
+
+	if (!array_is_created(l))
+		return;
+
+	sets = array_get(l, &count);
+	for (i = 0; i < count; i++) {
+		str = t_strdup_printf("%d:%s", sets[i]->port, sets[i]->address);
+		array_append(all_listeners, &str, 1);
 	}
 }
 
@@ -288,6 +307,8 @@ master_settings_verify(void *_set, pool_
 {
 	struct master_settings *set = _set;
 	struct service_settings *const *services;
+	const char *const *strings;
+	ARRAY_TYPE(const_string) all_listeners;
 	unsigned int i, j, count;
 
 	if (set->last_valid_uid != 0 &&
@@ -329,6 +350,8 @@ master_settings_verify(void *_set, pool_
 		}
 		service_set_login_dump_core(service);
 	}
+
+	t_array_init(&all_listeners, 64);
 	for (i = 0; i < count; i++) {
 		struct service_settings *service = services[i];
 
@@ -356,10 +379,23 @@ master_settings_verify(void *_set, pool_
 			return FALSE;
 		}
 		fix_file_listener_paths(&service->unix_listeners,
-					pool, set->base_dir);
+					pool, set->base_dir, &all_listeners);
 		fix_file_listener_paths(&service->fifo_listeners,
-					pool, set->base_dir);
-	}
+					pool, set->base_dir, &all_listeners);
+		add_inet_listeners(&service->inet_listeners, &all_listeners);
+	}
+
+	/* check for duplicate listeners */
+	array_sort(&all_listeners, i_strcmp_p);
+	strings = array_get(&all_listeners, &count);
+	for (i = 1; i < count; i++) {
+		if (strcmp(strings[i-1], strings[i]) == 0) {
+			*error_r = t_strdup_printf("duplicate listener: %s",
+						   strings[i]);
+			return FALSE;
+		}
+	}
+
 	set->protocols_split = p_strsplit(pool, set->protocols, " ");
 	return TRUE;
 }


More information about the dovecot-cvs mailing list