master-service.c revision 0c22bef8f5b35c645de8affd8746307fc53bd222
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (C) 2005-2009 Timo Sirainen */
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen#define DEFAULT_CONFIG_FILE_PATH SYSCONFDIR"/dovecot.conf"
04ab375449dd97eed50ada88dd0df2abab01cfeeTimo Sirainen/* getenv(MASTER_CONFIG_FILE_ENV) provides path to configuration file/socket */
04ab375449dd97eed50ada88dd0df2abab01cfeeTimo Sirainen/* getenv(MASTER_DOVECOT_VERSION_ENV) provides master's version number */
04ab375449dd97eed50ada88dd0df2abab01cfeeTimo Sirainen#define MASTER_DOVECOT_VERSION_ENV "DOVECOT_VERSION"
c000c8eca8f24b2a0c76393ec4bbf76a505a4983Timo Sirainenstatic void io_listeners_add(struct master_service *service);
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainenstatic void io_listeners_remove(struct master_service *service);
3f190f4cbb9233a3a6830956cb5c7ae56a577b79Timo Sirainenstatic void master_status_update(struct master_service *service);
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen return "c:ko:Os:L";
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainenstatic void sig_die(const siginfo_t *si, void *context)
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen /* warn about being killed because of some signal, except SIGINT (^C)
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen which is too common at least while testing :) */
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen i_warning("Killed with signal %d (by pid=%s uid=%s code=%s)",
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen lib_signal_code_to_str(si->si_signo, si->si_code));
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainenstatic void master_service_verify_version(struct master_service *service)
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainen strcmp(service->version_string, PACKAGE_VERSION) != 0) {
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen "(if you don't care, set version_ignore=yes)",
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainenmaster_service_init(const char *name, enum master_service_flags flags,
c000c8eca8f24b2a0c76393ec4bbf76a505a4983Timo Sirainen const char *str;
04ab375449dd97eed50ada88dd0df2abab01cfeeTimo Sirainen (flags & MASTER_SERVICE_FLAG_STANDALONE) == 0) {
8ed8c821ba8aab0b4ed0375f87d48737ef0e0d8eTimo Sirainen fd_debug_verify_leaks(MASTER_LISTEN_FD_FIRST + count, 1024);
d42eb03b3a4e79a2da22a1be2de59b95660af2beTimo Sirainen /* NOTE: we start rooted, so keep the code minimal until
573f0491a5733fe21fa062a455acb4790b4e0499Timo Sirainen restrict_access_by_env() is called */
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen /* Set a logging prefix temporarily. This will be ignored once the log
ca98892a6b8a30ffc1fe26fcf02c7d59e3204e7eTimo Sirainen is properly initialized */
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen i_set_failure_prefix(t_strdup_printf("%s(init): ", name));
0a601ada15c7fe82f0db895fc2068b71b3a5243cTimo Sirainen service->service_count_left = (unsigned int)-1;
d22301419109ed4a38351715e6760011421dadecTimo Sirainen service->config_path = getenv(MASTER_CONFIG_FILE_ENV);
c000c8eca8f24b2a0c76393ec4bbf76a505a4983Timo Sirainen service->config_path = DEFAULT_CONFIG_FILE_PATH;
0a601ada15c7fe82f0db895fc2068b71b3a5243cTimo Sirainen if ((flags & MASTER_SERVICE_FLAG_STANDALONE) == 0) {
0a601ada15c7fe82f0db895fc2068b71b3a5243cTimo Sirainen service->version_string = getenv(MASTER_DOVECOT_VERSION_ENV);
0a601ada15c7fe82f0db895fc2068b71b3a5243cTimo Sirainen /* set up some kind of logging until we know exactly how and where
0a601ada15c7fe82f0db895fc2068b71b3a5243cTimo Sirainen we want to log */
0a601ada15c7fe82f0db895fc2068b71b3a5243cTimo Sirainen i_set_failure_prefix(t_strdup_printf("%s(%s): ",
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen i_set_failure_prefix(t_strdup_printf("%s: ", name));
424236b2b88a5a7bbde5cf6a6b32189ca3437629Timo Sirainenvoid master_service_init_log(struct master_service *service, const char *prefix,
8fcff4c5b52f24d9c681805fdf06b486f1d0fcbeTimo Sirainen if ((service->flags & MASTER_SERVICE_FLAG_STANDALONE) != 0 &&
f1901fd21906911f7be075c965ac882f6a87b4c3Timo Sirainen (service->flags & MASTER_SERVICE_FLAG_DONT_LOG_TO_STDERR) == 0) {
f1901fd21906911f7be075c965ac882f6a87b4c3Timo Sirainen if (getenv("LOG_SERVICE") != NULL && !service->log_directly) {
1b5366b2234892f8930a29351da06b193e385150Timo Sirainen /* logging via log service */
6060b7c8edf8fce73470d0df6a2479b69b01c537Timo Sirainen /* log to syslog */
1b5366b2234892f8930a29351da06b193e385150Timo Sirainen if (!syslog_facility_find(service->set->syslog_facility,
1b5366b2234892f8930a29351da06b193e385150Timo Sirainen i_set_failure_syslog("dovecot", LOG_NDELAY, facility);
1b5366b2234892f8930a29351da06b193e385150Timo Sirainen /* log to file or stderr */
1b5366b2234892f8930a29351da06b193e385150Timo Sirainen path = home_expand(service->set->info_log_path);
1b5366b2234892f8930a29351da06b193e385150Timo Sirainen i_set_failure_timestamp_format(service->set->log_timestamp);
b5e6f6f27c1461f0f9f202615eeb738a645188c3Timo Sirainenbool master_service_parse_option(struct master_service *service,
f1901fd21906911f7be075c965ac882f6a87b4c3Timo Sirainen if (!array_is_created(&service->config_overrides))
690bafa70767e3f6e98bbfd62ad4a26be2387ea9Timo Sirainen array_append(&service->config_overrides, &arg, 1);
return TRUE;
const char *value;
unsigned int count;
if (count == 0)
#ifdef DEBUG
env_clean();
#ifdef DEBUG
unsigned int client_limit)
unsigned int count)
unsigned int used;
if (ret < 0)
else if (ret == 0)
lib_deinit();
return TRUE;
return TRUE;
return FALSE;
if (ret > 0) {
} else if (ret == 0) {