From: Timo Sirainen Date: Thu, 1 Aug 2013 10:42:51 +0000 (+0300) Subject: lib-master: If MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN is set, open the config socket... X-Git-Tag: 2.2.5~32 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b7b9d4be2a1ff399026a5d6feeffd3a048f22be0;p=thirdparty%2Fdovecot%2Fcore.git lib-master: If MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN is set, open the config socket before dropping privileges. --- diff --git a/src/lib-master/master-service-settings.c b/src/lib-master/master-service-settings.c index 2a83fbfb75..fe028e26bd 100644 --- a/src/lib-master/master-service-settings.c +++ b/src/lib-master/master-service-settings.c @@ -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, diff --git a/src/lib-master/master-service-settings.h b/src/lib-master/master-service-settings.h index 5566a96919..ad7d6ea79a 100644 --- a/src/lib-master/master-service-settings.h +++ b/src/lib-master/master-service-settings.h @@ -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, diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index 4ea8b98e17..476b37d07d 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -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; diff --git a/src/lib-master/master-service.h b/src/lib-master/master-service.h index c29b994928..c2a45b1c2a 100644 --- a/src/lib-master/master-service.h +++ b/src/lib-master/master-service.h @@ -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,