]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Listener names are now in struct master_service_connection.name
authorTimo Sirainen <tss@iki.fi>
Fri, 30 Dec 2011 10:31:58 +0000 (12:31 +0200)
committerTimo Sirainen <tss@iki.fi>
Fri, 30 Dec 2011 10:31:58 +0000 (12:31 +0200)
This allows service to use the names to figure out what type the listener
is.

src/lib-master/master-service-private.h
src/lib-master/master-service.c
src/lib-master/master-service.h
src/master/service-process.c
src/master/service.c
src/master/service.h

index 003d81563f13d02645c1dff2544307cf716ea664..eac23d11c478a4e3a569ce4f55414e2812456dfb 100644 (file)
@@ -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;
index d0dfd3315bfe7d2c22eed2fc387315feec99ba28..985251716a2c3e0dc563162aa0b07789314b2a4d 100644 (file)
@@ -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;
index c8b15a7b6854c8926b197a82806ca6a67d9339ff..7965b33fa06005de0d647d62ed2597f723f1eb80 100644 (file)
@@ -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;
index eaa30d3d859f10c33fd86c2f33009bc1277c7e35..edf0029632927675b36b1defdecb00a935977c87 100644 (file)
@@ -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
index 11cd6bc5e547c916c879345ca713deb4030314e8..022f92a5add5f875dada3f402135ea1c91d5e0e3 100644 (file)
@@ -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);
index 15eeb0c6e16e0e557ad314aa1ae9f5f0480ae879..3fd663dce0d5cb1181fa1c07c4960717613c33a5 100644 (file)
@@ -21,6 +21,7 @@ struct service_listener {
        int fd; /* may be -1 */
        struct io *io;
 
+       const char *name;
        const char *inet_address;
 
        union {