]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-master: If MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN is set, open the config socket...
authorTimo Sirainen <tss@iki.fi>
Thu, 1 Aug 2013 10:42:51 +0000 (13:42 +0300)
committerTimo Sirainen <tss@iki.fi>
Thu, 1 Aug 2013 10:42:51 +0000 (13:42 +0300)
src/lib-master/master-service-settings.c
src/lib-master/master-service-settings.h
src/lib-master/master-service.c
src/lib-master/master-service.h

index 2a83fbfb7572e4b92e45c9c50364ef2fd9f67a81..fe028e26bd71432d14676af6b62f26495f5dec8e 100644 (file)
@@ -336,6 +336,23 @@ config_read_reply_header(struct istream *istream, const char *path, pool_t pool,
        return 0;
 }
 
+void master_service_config_socket_try_open(struct master_service *service)
+{
+       struct master_service_settings_input input;
+       const char *path, *error;
+       int fd;
+
+       if (getenv("DOVECONF_ENV") != NULL ||
+           (service->flags & MASTER_SERVICE_FLAG_NO_CONFIG_SETTINGS) != 0)
+               return;
+
+       memset(&input, 0, sizeof(input));
+       input.never_exec = TRUE;
+       fd = master_service_open_config(service, &input, &path, &error);
+       if (fd != -1)
+               service->config_fd = fd;
+}
+
 int master_service_settings_read(struct master_service *service,
                                 const struct master_service_settings_input *input,
                                 struct master_service_settings_output *output_r,
index 5566a969191cb92afb76fb3bd0b421988d4d0823..ad7d6ea79ad813253939d05c7a76e29805ed5e94 100644 (file)
@@ -56,6 +56,9 @@ struct master_service_settings_output {
 
 extern const struct setting_parser_info master_service_setting_parser_info;
 
+/* Try to open the config socket if it's going to be needed later by
+   master_service_settings_read*() */
+void master_service_config_socket_try_open(struct master_service *service);
 int master_service_settings_read(struct master_service *service,
                                 const struct master_service_settings_input *input,
                                 struct master_service_settings_output *output_r,
index 4ea8b98e17435529b60e38501ba4b5435bdca699..476b37d07d2de4e953f6f3b8513eab216f502362 100644 (file)
@@ -236,6 +236,12 @@ master_service_init(const char *name, enum master_service_flags flags,
                master_service_set_client_limit(service, 1);
                master_service_set_service_count(service, 1);
        }
+       if ((flags & MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN) != 0) {
+               /* since we're going to keep the config socket open anyway,
+                  open it now so we can read settings even after privileges
+                  are dropped. */
+               master_service_config_socket_try_open(service);
+       }
 
        master_service_verify_version_string(service);
        return service;
index c29b994928d59327dc3e17be4b5e26cf9dde2383..c2a45b1c2a83cae2a46546f43ae7d1d5ecd806df 100644 (file)
@@ -15,7 +15,8 @@ enum master_service_flags {
           _FLAG_STANDALONE is set, logging is done to stderr. */
        MASTER_SERVICE_FLAG_DONT_LOG_TO_STDERR  = 0x04,
        /* Service is going to do multiple configuration lookups,
-          keep the connection to config service open. */
+          keep the connection to config service open. Also opens the config
+          socket before dropping privileges. */
        MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN    = 0x08,
        /* Don't read settings, but use whatever is in environment */
        MASTER_SERVICE_FLAG_NO_CONFIG_SETTINGS  = 0x10,