dovecot-2.1: Listener names are now in struct master_service_con...

dovecot at dovecot.org dovecot at dovecot.org
Fri Dec 30 12:33:17 EET 2011


details:   http://hg.dovecot.org/dovecot-2.1/rev/cdf2c63ece6a
changeset: 13877:cdf2c63ece6a
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Dec 30 12:31:58 2011 +0200
description:
Listener names are now in struct master_service_connection.name
This allows service to use the names to figure out what type the listener
is.

diffstat:

 src/lib-master/master-service-private.h |   5 ++++-
 src/lib-master/master-service.c         |  11 +++++++++++
 src/lib-master/master-service.h         |   1 +
 src/master/service-process.c            |  12 ++++++++++++
 src/master/service.c                    |   6 ++++++
 src/master/service.h                    |   1 +
 6 files changed, 35 insertions(+), 1 deletions(-)

diffs (171 lines):

diff -r bc9217cb0193 -r cdf2c63ece6a src/lib-master/master-service-private.h
--- a/src/lib-master/master-service-private.h	Fri Dec 30 11:54:48 2011 +0200
+++ b/src/lib-master/master-service-private.h	Fri Dec 30 12:31:58 2011 +0200
@@ -9,6 +9,7 @@
 	int fd;
 	bool ssl;
 	struct io *io;
+	const char *name;
 };
 
 struct master_service {
@@ -28,7 +29,9 @@
 	int syslog_facility;
 
 	unsigned int socket_count, ssl_socket_count;
-        struct master_service_listener *listeners;
+	struct master_service_listener *listeners;
+	char **listener_names;
+	unsigned int listener_names_count;
 
 	struct io *io_status_write, *io_status_error;
 	unsigned int service_count_left;
diff -r bc9217cb0193 -r cdf2c63ece6a src/lib-master/master-service.c
--- a/src/lib-master/master-service.c	Fri Dec 30 11:54:48 2011 +0200
+++ b/src/lib-master/master-service.c	Fri Dec 30 12:31:58 2011 +0200
@@ -4,6 +4,7 @@
 #include "lib-signals.h"
 #include "ioloop.h"
 #include "array.h"
+#include "strescape.h"
 #include "env-util.h"
 #include "home-expand.h"
 #include "process-title.h"
@@ -172,6 +173,13 @@
 	value = getenv("SSL_SOCKET_COUNT");
 	if (value != NULL)
 		service->ssl_socket_count = atoi(value);
+	value = getenv("SOCKET_NAMES");
+	if (value != NULL) {
+		service->listener_names =
+			p_strsplit_tabescaped(default_pool, value);
+		service->listener_names_count =
+			str_array_length((void *)service->listener_names);
+	}
 
 	/* set up some kind of logging until we know exactly how and where
 	   we want to log */
@@ -746,6 +754,7 @@
 		l->fd = -1;
 	}
 	conn.ssl = l->ssl;
+	conn.name = l->name;
 	net_set_nonblock(conn.fd, TRUE);
 
 	master_service_client_connection_created(service);
@@ -779,6 +788,8 @@
 
 		l->service = service;
 		l->fd = MASTER_LISTEN_FD_FIRST + i;
+		l->name = i < service->listener_names_count ?
+			service->listener_names[i] : "";
 
 		if (i >= service->socket_count - service->ssl_socket_count)
 			l->ssl = TRUE;
diff -r bc9217cb0193 -r cdf2c63ece6a src/lib-master/master-service.h
--- a/src/lib-master/master-service.h	Fri Dec 30 11:54:48 2011 +0200
+++ b/src/lib-master/master-service.h	Fri Dec 30 12:31:58 2011 +0200
@@ -28,6 +28,7 @@
 struct master_service_connection {
 	int fd;
 	int listen_fd;
+	const char *name;
 
 	struct ip_addr remote_ip;
 	unsigned int remote_port;
diff -r bc9217cb0193 -r cdf2c63ece6a src/master/service-process.c
--- a/src/master/service-process.c	Fri Dec 30 11:54:48 2011 +0200
+++ b/src/master/service-process.c	Fri Dec 30 12:31:58 2011 +0200
@@ -10,6 +10,7 @@
 #include "base64.h"
 #include "hash.h"
 #include "str.h"
+#include "strescape.h"
 #include "llist.h"
 #include "hostpid.h"
 #include "env-util.h"
@@ -38,6 +39,7 @@
 {
 	struct service_listener *const *listeners;
 	ARRAY_TYPE(dup2) dups;
+	string_t *listener_names;
 	unsigned int i, count, n = 0, socket_listener_count, ssl_socket_count;
 
 	/* stdin/stdout is already redirected to /dev/null. Other master fds
@@ -50,6 +52,7 @@
         socket_listener_count = 0;
 	listeners = array_get(&service->listeners, &count);
 	t_array_init(&dups, count + 10);
+	listener_names = t_str_new(256);
 
 	switch (service->type) {
 	case SERVICE_TYPE_LOG:
@@ -73,11 +76,17 @@
 		break;
 	}
 
+	/* anvil/log fds have no names */
+	for (i = MASTER_LISTEN_FD_FIRST; i < n; i++)
+		str_append_c(listener_names, '\t');
+
 	/* first add non-ssl listeners */
 	for (i = 0; i < count; i++) {
 		if (listeners[i]->fd != -1 &&
 		    (listeners[i]->type != SERVICE_LISTENER_INET ||
 		     !listeners[i]->set.inetset.set->ssl)) {
+			str_tabescape_write(listener_names, listeners[i]->name);
+			str_append_c(listener_names, '\t');
 			dup2_append(&dups, listeners[i]->fd,
 				    MASTER_LISTEN_FD_FIRST + n);
 			n++; socket_listener_count++;
@@ -89,6 +98,8 @@
 		if (listeners[i]->fd != -1 &&
 		    listeners[i]->type == SERVICE_LISTENER_INET &&
 		    listeners[i]->set.inetset.set->ssl) {
+			str_tabescape_write(listener_names, listeners[i]->name);
+			str_append_c(listener_names, '\t');
 			dup2_append(&dups, listeners[i]->fd,
 				    MASTER_LISTEN_FD_FIRST + n);
 			n++; socket_listener_count++;
@@ -147,6 +158,7 @@
 
 	env_put(t_strdup_printf("SOCKET_COUNT=%d", socket_listener_count));
 	env_put(t_strdup_printf("SSL_SOCKET_COUNT=%d", ssl_socket_count));
+	env_put(t_strdup_printf("SOCKET_NAMES=%s", str_c(listener_names)));
 }
 
 static void
diff -r bc9217cb0193 -r cdf2c63ece6a src/master/service.c
--- a/src/master/service.c	Fri Dec 30 11:54:48 2011 +0200
+++ b/src/master/service.c	Fri Dec 30 12:31:58 2011 +0200
@@ -46,6 +46,11 @@
 	l->type = type;
 	l->fd = -1;
 	l->set.fileset.set = set;
+	l->name = strrchr(set->path, '/');
+	if (l->name != NULL)
+		l->name++;
+	else
+		l->name = set->path;
 
 	if (get_uidgid(set->user, &l->set.fileset.uid, &gid, error_r) < 0)
 		set_name = "user";
@@ -123,6 +128,7 @@
 	l->set.inetset.set = set;
 	l->set.inetset.ip = *ip;
 	l->inet_address = p_strdup(service->list->pool, address);
+	l->name = set->name;
 
 	if (set->port > 65535) {
 		*error_r = t_strdup_printf("Invalid port: %u", set->port);
diff -r bc9217cb0193 -r cdf2c63ece6a src/master/service.h
--- a/src/master/service.h	Fri Dec 30 11:54:48 2011 +0200
+++ b/src/master/service.h	Fri Dec 30 12:31:58 2011 +0200
@@ -21,6 +21,7 @@
 	int fd; /* may be -1 */
 	struct io *io;
 
+	const char *name;
 	const char *inet_address;
 
 	union {


More information about the dovecot-cvs mailing list