changeset 9783:252bb3d23fb9 HEAD

master: Allow inet_listener address to specify multiple addresses.
author Timo Sirainen <tss@iki.fi>
date Thu, 13 Aug 2009 14:17:57 -0400
parents e4235adb3044
children 3296870a8510
files dovecot-master-example.conf src/master/service.c
diffstat 2 files changed, 29 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
--- a/dovecot-master-example.conf	Thu Aug 13 13:31:27 2009 -0400
+++ b/dovecot-master-example.conf	Thu Aug 13 14:17:57 2009 -0400
@@ -63,22 +63,12 @@
   type = auth-source
   executable = imap-login
 
-  # IPv4
   inet_listener {
+    address = *, ::
     port = 143
   }
   inet_listener {
-    port = 993
-    ssl = yes
-  }
-
-  # IPv6
-  inet_listener {
-    address = ::
-    port = 143
-  }
-  inet_listener {
-    address = ::
+    address = *, ::
     port = 993
     ssl = yes
   }
@@ -98,22 +88,12 @@
   type = auth-source
   executable = pop3-login
 
-  # IPv4
   inet_listener {
+    address = *, ::
     port = 110
   }
   inet_listener {
-    port = 995
-    ssl = yes
-  }
-
-  # IPv6
-  inet_listener {
-    address = ::
-    port = 110
-  }
-  inet_listener {
-    address = ::
+    address = *, ::
     port = 995
     ssl = yes
   }
--- a/src/master/service.c	Thu Aug 13 13:31:27 2009 -0400
+++ b/src/master/service.c	Thu Aug 13 14:17:57 2009 -0400
@@ -88,9 +88,9 @@
 }
 
 static struct service_listener *
-service_create_inet_listener(struct service *service,
-			     const struct inet_listener_settings *set,
-			     const char **error_r)
+service_create_one_inet_listener(struct service *service,
+				 const struct inet_listener_settings *set,
+				 const char *address, const char **error_r)
 {
 	struct service_listener *l;
 
@@ -100,7 +100,7 @@
 	l->fd = -1;
 	l->set.inetset.set = set;
 
-	if (resolve_ip(set->address, &l->set.inetset.ip, error_r) < 0)
+	if (resolve_ip(address, &l->set.inetset.ip, error_r) < 0)
 		return NULL;
 
 	if (set->port == 0) {
@@ -115,6 +115,25 @@
 	return l;
 }
 
+static int
+service_create_inet_listeners(struct service *service,
+			      const struct inet_listener_settings *set,
+			      const char **error_r)
+{
+	static struct service_listener *l;
+	const char *const *tmp;
+
+	tmp = t_strsplit_spaces(set->address, ", ");
+	for (; *tmp != NULL; tmp++) {
+		l = service_create_one_inet_listener(service, set, *tmp,
+						     error_r);
+		if (l == NULL)
+			return -1;
+		array_append(&service->listeners, &l, 1);
+	}
+	return 0;
+}
+
 static struct service *
 service_create(pool_t pool, const struct service_settings *set,
 	       struct service_list *service_list, const char **error_r)
@@ -255,11 +274,9 @@
 		array_append(&service->listeners, &l, 1);
 	}
 	for (i = 0; i < inet_count; i++) {
-		l = service_create_inet_listener(service, inet_listeners[i],
-						 error_r);
-		if (l == NULL)
+		if (service_create_inet_listeners(service, inet_listeners[i],
+						  error_r) < 0)
 			return NULL;
-		array_append(&service->listeners, &l, 1);
 	}
 
 	return service;