master-service-settings.c revision 4970e8dfcb18c1353e44b82e4ec836d165b7de82
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2005-2009 Dovecot authors, see the included COPYING file */
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen#define DOVECOT_CONFIG_BIN_PATH BINDIR"/doveconf"
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen { type, #name, offsetof(struct master_service_settings, name), NULL }
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainenstatic struct setting_define master_service_setting_defines[] = {
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainenstatic struct master_service_settings master_service_default_settings = {
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen MEMBER(log_timestamp) DEFAULT_FAILURE_STAMP_FORMAT,
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainenstruct setting_parser_info master_service_setting_parser_info = {
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen MEMBER(defines) master_service_setting_defines,
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen MEMBER(defaults) &master_service_default_settings,
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen MEMBER(struct_size) sizeof(struct master_service_settings)
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainenmaster_service_exec_config(struct master_service *service, bool preserve_home)
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen const char **conf_argv, *path, *const *paths, *binary_path;
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen /* already have the path */
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen } else if (strchr(service->argv[0], '/') != NULL) {
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen /* relative to current directory */
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen if (realpath(service->argv[0], full_path) == NULL)
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen i_fatal("realpath(%s) failed: %m", service->argv[0]);
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen /* we have to find our executable from path */
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi path = t_strconcat(*paths, "/", binary_path, NULL);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi conf_argv = t_new(const char *, 6 + (service->argc + 1) + 1);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi conf_argv[2] = t_strconcat("service=", service->name, NULL);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi i_fatal("execv(%s) failed: %m", conf_argv[0]);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvimaster_service_read_config(struct master_service *service, const char *path,
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi const struct master_service_settings_input *input,
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi "net_connect_unix(%s) failed: %m", path);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi if (stat(path, &st) == 0 && !S_ISFIFO(st.st_mode)) {
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi /* it's a file, not a socket */
bc6a872cc6cecb4e3f8d0a99236c4ab484f2f754Timo Sirainen str_printfa(str, "\tmodule=%s", input->module);
9983cbb4cef92d68ffde87dcc91913cc2fed3da5Martti Rannanjärvi str_printfa(str, "\tservice=%s", input->service);
} T_END;
if (ret < 0) {
return fd;
const char **error_r)
const char *const *overrides;
unsigned int i, count;
for (i = 0; i < count; i++) {
const char **error_r)
void **sets;
if (ret < 0) {
keys);
} T_END;
error_r) < 0)
const char **error_r)
return pool;
const struct master_service_settings *
void **sets;
return sets[0];