main.c revision ecdbe05ac696695432b580c3792e996c5e411261
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* Copyright (C) 2002 Timo Sirainen */
b4ddb5b3c3722620a8fef387dd8c47bb411a5643Timo Sirainenconst char *process_names[PROCESS_TYPE_MAX] = {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "auth-worker",
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "ssl-build-param",
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic const char *configfile = SYSCONFDIR "/" PACKAGE ".conf";
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic const char *env_tz;
300e4e43ed1ca46d0614459161ca2fb460ef661aTimo Sirainenstatic void listen_fds_close(struct server_settings *server);
300e4e43ed1ca46d0614459161ca2fb460ef661aTimo Sirainenbool validate_str(const char *str, size_t max_len)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen for (i = 0; i < max_len; i++) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* remove all environment, we don't need them */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* we'll log through master process */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen !syslog_facility_find(settings_root->defaults->syslog_facility,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen env_put(t_strdup_printf("SYSLOG_FACILITY=%d", facility));
b4ddb5b3c3722620a8fef387dd8c47bb411a5643Timo Sirainenvoid client_process_exec(const char *cmd, const char *title)
b4ddb5b3c3722620a8fef387dd8c47bb411a5643Timo Sirainen /* very simple argument splitting. */
b4ddb5b3c3722620a8fef387dd8c47bb411a5643Timo Sirainen argv = t_strsplit(t_strconcat(cmd, " ", title, NULL), " ");
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* hide the path, it's ugly */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (!syslog_facility_find(set->syslog_facility, &facility))
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen i_set_failure_syslog("dovecot", LOG_NDELAY, facility);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* log to file or stderr */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen i_set_failure_timestamp_format(set->log_timestamp);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic void settings_reload(void)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen struct server_settings *old_set = settings_root;
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen i_warning("SIGHUP received - reloading configuration");
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* restart auth and login processes */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen i_warning("Invalid configuration, keeping old one");
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic void sig_die(int signo, void *context __attr_unused__)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* warn about being killed because of some signal, except SIGINT (^C)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen which is too common at least while testing :) */
cf9d67e4a9bfee31cf3be05244555d51a3d1b9feTimo Sirainenstatic void sig_reload_settings(int signo __attr_unused__,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic void sig_reopen_logs(int signo __attr_unused__,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic const char *get_exit_status_message(enum fatal_exit_status status)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen return "Can't open log file";
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen return "Can't write to log file";
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen return "Internal logging error";
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen return "Out of memory";
0a53eb0283d7ec28c6105f61e118b96fce8ecb95Timo Sirainen return "exec() failed";
00e7c3010f7da4a49881a7feb05e413af353af0aTimo Sirainenstatic void timeout_handler(void *context __attr_unused__)
00e7c3010f7da4a49881a7feb05e413af353af0aTimo Sirainen while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
00e7c3010f7da4a49881a7feb05e413af353af0aTimo Sirainen /* get the type and remove from hash */
00e7c3010f7da4a49881a7feb05e413af353af0aTimo Sirainen /* write errors to syslog */
00e7c3010f7da4a49881a7feb05e413af353af0aTimo Sirainen process_type_name = process_names[process_type];
if (p == NULL)
p = NULL;
if (p != NULL)
if (p != NULL) {
if (ret != 0) {
const char *proto)
const char *const *proto;
unsigned int port;
int *fd, i;
#ifdef HAVE_SSL
if (port == 0)
if (!retry)
return TRUE;
return TRUE;
return FALSE;
return TRUE;
return TRUE;
return FALSE;
static void open_fds(void)
if (!IS_INETD())
const char *pid;
int fd;
static void main_init(void)
log_init();
ssl_init();
static void main_deinit(void)
ssl_deinit();
log_deinit();
closelog();
if (pid < 0)
if (pid != 0)
_exit(0);
if (setsid() < 0)
static void print_help(void)
static void print_build_options(void)
#ifdef IOLOOP_EPOLL
#ifdef IOLOOP_KQUEUE
#ifdef IOLOOP_POLL
#ifdef IOLOOP_SELECT
#ifdef IOLOOP_NOTIFY_DNOTIFY
#ifdef IOLOOP_NOTIFY_INOTIFY
#ifdef IOLOOP_NOTIFY_KQUEUE
#ifdef HAVE_IPV6
#ifdef HAVE_GNUTLS
#ifdef HAVE_OPENSSL
#ifdef BUILD_MYSQL
#ifdef BUILD_PGSQL
#ifdef BUILD_SQLITE
#ifdef PASSDB_BSDAUTH
#ifdef PASSDB_CHECKPASSWORD
#ifdef PASSDB_LDAP
#ifdef PASSDB_PAM
#ifdef PASSDB_PASSWD
#ifdef PASSDB_PASSWD_FILE
#ifdef PASSDB_SHADOW
#ifdef PASSDB_SQL
#ifdef PASSDB_VPOPMAIL
#ifdef USERDB_CHECKPASSWORD
#ifdef USERDB_LDAP
#ifdef USERDB_PASSWD
#ifdef USERDB_PREFETCH
#ifdef USERDB_PASSWD_FILE
#ifdef USERDB_SQL
#ifdef USERDB_STATIC
#ifdef USERDB_VPOPMAIL
#ifdef DEBUG
lib_init();
print_help();
t_push();
t_pop();
if (ask_key_pass) {
const char *prompt;
t_push();
sizeof(ssl_manual_key_password));
t_pop();
env_clean();
open_fds();
if (!foreground)
main_init();
main_deinit();
lib_deinit();