]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-master: Added support for keeping config connection open and reusing it for later...
authorTimo Sirainen <tss@iki.fi>
Thu, 14 May 2009 22:52:54 +0000 (18:52 -0400)
committerTimo Sirainen <tss@iki.fi>
Thu, 14 May 2009 22:52:54 +0000 (18:52 -0400)
--HG--
branch : HEAD

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

index de5332ec79b649fb47f0c2a4068d59615e322679..7be39704dc18012dc727ac2861d5f8125d46cb1c 100644 (file)
@@ -22,8 +22,9 @@ struct master_service {
 
        const char *version_string;
        const char *config_path;
-       int syslog_facility;
        ARRAY_TYPE(const_string) config_overrides;
+       int config_fd;
+       int syslog_facility;
 
        unsigned int socket_count, ssl_socket_count;
         struct master_service_listener *listeners;
index a234ebed94b79a7409a81bf39121756cf8a4f0ca..421bc097c9d1f11d843a26a3d6f31c961e2f6dd8 100644 (file)
@@ -106,19 +106,24 @@ master_service_read_config(struct master_service *service,
        int fd, ret;
 
        path = master_service_get_config_path(service);
-       fd = net_connect_unix(path);
-       if (fd < 0) {
-               *error_r = t_strdup_printf("net_connect_unix(%s) failed: %m",
-                                          path);
-
-               if (stat(path, &st) == 0 && !S_ISFIFO(st.st_mode)) {
-                       /* it's a file, not a socket */
-                       master_service_exec_config(service,
-                                                  input->preserve_home);
+       if (service->config_fd != -1) {
+               fd = service->config_fd;
+               service->config_fd = -1;
+       } else {
+               fd = net_connect_unix(path);
+               if (fd < 0) {
+                       *error_r = t_strdup_printf(
+                               "net_connect_unix(%s) failed: %m", path);
+
+                       if (stat(path, &st) == 0 && !S_ISFIFO(st.st_mode)) {
+                               /* it's a file, not a socket */
+                               master_service_exec_config(service,
+                                                          input->preserve_home);
+                       }
+                       return -1;
                }
-               return -1;
+               net_set_nonblock(fd, FALSE);
        }
-       net_set_nonblock(fd, FALSE);
 
        T_BEGIN {
                string_t *str;
@@ -221,9 +226,16 @@ int master_service_settings_read(struct master_service *service,
                i_assert(ret <= 0);
                if (ret < 0) {
                        *error_r = settings_parser_get_error(parser);
+                       (void)close(fd);
                        return -1;
                }
        }
+
+       if ((service->flags & MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN) == 0)
+               (void)close(fd);
+       else
+               service->config_fd = fd;
+
        /* let environment override settings. especially useful for the
           settings from userdb. */
        if (settings_parse_environ(parser) < 0) {
index 01215a2c605f04574f754894b183ca34f166f291..4b88f1a66fc34a5378e74b9adeb754affeccde0e 100644 (file)
@@ -96,6 +96,7 @@ master_service_init(const char *name, enum master_service_flags flags,
        service->flags = flags;
        service->ioloop = io_loop_create();
        service->service_count_left = (unsigned int)-1;
+       service->config_fd = -1;
 
        service->config_path = getenv(MASTER_CONFIG_FILE_ENV);
        if (service->config_path == NULL)
index 129588148e5b4e99d79ae243b84103434e1859fd..6b53abd45b6c059beb7f7712c299322aa28799c4 100644 (file)
@@ -9,7 +9,10 @@ enum master_service_flags {
        /* this process is currently running standalone without a master */
        MASTER_SERVICE_FLAG_STANDALONE          = 0x02,
        /* Log to stderr instead of the configured log file */
-       MASTER_SERVICE_FLAG_LOG_TO_STDERR       = 0x04
+       MASTER_SERVICE_FLAG_LOG_TO_STDERR       = 0x04,
+       /* Service is going to do multiple configuration lookups,
+          keep the connection to config service open. */
+       MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN    = 0x08
 };
 
 struct master_service_connection {