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,
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,
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;
_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,