From: Timo Sirainen Date: Fri, 30 Dec 2011 10:31:58 +0000 (+0200) Subject: Listener names are now in struct master_service_connection.name X-Git-Tag: 2.1.rc2~23 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f7423cbbd9dea363a5df18ebb96da055a977ae79;p=thirdparty%2Fdovecot%2Fcore.git 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. --- diff --git a/src/lib-master/master-service-private.h b/src/lib-master/master-service-private.h index 003d81563f..eac23d11c4 100644 --- a/src/lib-master/master-service-private.h +++ b/src/lib-master/master-service-private.h @@ -9,6 +9,7 @@ struct master_service_listener { int fd; bool ssl; struct io *io; + const char *name; }; struct master_service { @@ -28,7 +29,9 @@ struct master_service { 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 --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index d0dfd3315b..985251716a 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -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 @@ master_service_init(const char *name, enum master_service_flags flags, 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 @@ static void master_service_listen(struct master_service_listener *l) 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 @@ static void io_listeners_init(struct master_service *service) 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 --git a/src/lib-master/master-service.h b/src/lib-master/master-service.h index c8b15a7b68..7965b33fa0 100644 --- a/src/lib-master/master-service.h +++ b/src/lib-master/master-service.h @@ -28,6 +28,7 @@ enum master_service_flags { struct master_service_connection { int fd; int listen_fd; + const char *name; struct ip_addr remote_ip; unsigned int remote_port; diff --git a/src/master/service-process.c b/src/master/service-process.c index eaa30d3d85..edf0029632 100644 --- a/src/master/service-process.c +++ b/src/master/service-process.c @@ -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 @@ service_dup_fds(struct service *service) { 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 @@ service_dup_fds(struct service *service) 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 @@ service_dup_fds(struct service *service) 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 @@ service_dup_fds(struct service *service) 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 @@ service_dup_fds(struct service *service) 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 --git a/src/master/service.c b/src/master/service.c index 11cd6bc5e5..022f92a5ad 100644 --- a/src/master/service.c +++ b/src/master/service.c @@ -46,6 +46,11 @@ service_create_file_listener(struct service *service, 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 @@ service_create_one_inet_listener(struct service *service, 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 --git a/src/master/service.h b/src/master/service.h index 15eeb0c6e1..3fd663dce0 100644 --- a/src/master/service.h +++ b/src/master/service.h @@ -21,6 +21,7 @@ struct service_listener { int fd; /* may be -1 */ struct io *io; + const char *name; const char *inet_address; union {