master-service.c revision 6c2ce1d5bf17b21e804a079eb0f973b7ab83e0d8
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen/* Copyright (C) 2005-2009 Timo Sirainen */
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen#define DEFAULT_CONFIG_FILE_PATH SYSCONFDIR"/dovecot.conf"
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen/* getenv(MASTER_CONFIG_FILE_ENV) provides path to configuration file/socket */
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen/* getenv(MASTER_DOVECOT_VERSION_ENV) provides master's version number */
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen#define MASTER_DOVECOT_VERSION_ENV "DOVECOT_VERSION"
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainenstatic void io_listeners_add(struct master_service *service);
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainenstatic void io_listeners_remove(struct master_service *service);
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainenstatic void master_status_update(struct master_service *service);
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen return "c:ks:L";
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainenstatic void sig_die(const siginfo_t *si, void *context)
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen /* warn about being killed because of some signal, except SIGINT (^C)
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen which is too common at least while testing :) */
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen i_warning("Killed with signal %d (by pid=%s uid=%s code=%s)",
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen lib_signal_code_to_str(si->si_signo, si->si_code));
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainenstatic void master_service_verify_version(struct master_service *service)
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen strcmp(service->version_string, PACKAGE_VERSION) != 0) {
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen "(if you don't care, set version_ignore=yes)",
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainenmaster_service_init(const char *name, enum master_service_flags flags,
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen const char *str;
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen fd_debug_verify_leaks(MASTER_LISTEN_FD_FIRST + count, 1024);
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen /* NOTE: we start rooted, so keep the code minimal until
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen restrict_access_by_env() is called */
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen /* Set a logging prefix temporarily. This will be ignored once the log
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen is properly initialized */
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen i_set_failure_prefix(t_strdup_printf("%s(init): ", name));
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen service->service_count_left = (unsigned int)-1;
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen service->config_path = getenv(MASTER_CONFIG_FILE_ENV);
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen service->config_path = DEFAULT_CONFIG_FILE_PATH;
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen if ((flags & MASTER_SERVICE_FLAG_STANDALONE) == 0) {
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen service->version_string = getenv(MASTER_DOVECOT_VERSION_ENV);
44cf91b7a701a9b4d9f59a990552eab4f7f64fbcTimo Sirainen /* set up some kind of logging until we know exactly how and where
return service;
unsigned int max_lines_per_sec)
const char *path;
int facility;
&facility))
switch (opt) {
return FALSE;
return TRUE;
const char *value;
unsigned int count;
if (count == 0)
env_clean();
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) {