main.c revision 007d354a674fb3ddf49db160cf050cf61270a1a0
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen/* Copyright (C) 2002 Timo Sirainen */
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen#include "common.h"
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen#include "ioloop.h"
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen#include "network.h"
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen#include "lib-signals.h"
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen#include "restrict-access.h"
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen#include "fd-close-on-exec.h"
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen#include "randgen.h"
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen#include "mech.h"
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen#include "userdb.h"
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen#include "passdb.h"
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen#include "master-connection.h"
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen#include "login-connection.h"
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen#include <stdlib.h>
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen#include <syslog.h>
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainenstruct ioloop *ioloop;
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainenint verbose = FALSE, verbose_debug = FALSE;
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainenstatic struct io *io_listen;
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainenstatic void sig_quit(int signo __attr_unused__)
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen{
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen io_loop_stop(ioloop);
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen}
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainenstatic void auth_accept(void *context __attr_unused__)
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen{
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen int fd;
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen fd = net_accept(LOGIN_LISTEN_FD, NULL, NULL);
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen if (fd < 0) {
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen if (fd < -1)
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen i_fatal("accept() failed: %m");
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen } else {
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen net_set_nonblock(fd, TRUE);
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen (void)login_connection_create(fd);
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen }
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen}
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainenstatic void open_logfile(void)
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen{
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen if (getenv("USE_SYSLOG") != NULL)
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen i_set_failure_syslog("dovecot-auth", LOG_NDELAY, LOG_MAIL);
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen else {
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen /* log to file or stderr */
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen i_set_failure_file(getenv("LOGFILE"), "dovecot-auth");
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen }
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen if (getenv("INFOLOGFILE") != NULL)
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen i_set_info_file(getenv("INFOLOGFILE"));
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen i_set_failure_timestamp_format(getenv("LOGSTAMP"));
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen}
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainenstatic void drop_privileges(void)
7c424aa51c956c628e3512055841aa2f9eef4833Timo Sirainen{
f923659c0e5298263d80622c99f4dc4132b4675bTimo Sirainen /* Log file or syslog opening probably requires roots */
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen open_logfile();
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen /* Open /dev/urandom before chrooting */
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen random_init();
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen /* Password lookups etc. may require roots, allow it. */
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen restrict_access_by_env(FALSE);
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen}
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainenstatic void main_init(void)
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen{
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen lib_init_signals(sig_quit);
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen verbose = getenv("VERBOSE") != NULL;
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen verbose_debug = getenv("VERBOSE_DEBUG") != NULL;
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen mech_init();
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen userdb_init();
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen passdb_init();
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen login_connections_init();
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen io_listen = io_add(LOGIN_LISTEN_FD, IO_READ, auth_accept, NULL);
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen /* initialize master last - it sends the "we're ok" notification */
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen master_connection_init();
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen}
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainenstatic void main_deinit(void)
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen{
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen if (lib_signal_kill != 0)
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen i_warning("Killed with signal %d", lib_signal_kill);
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen io_remove(io_listen);
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen login_connections_deinit();
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen passdb_deinit();
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen userdb_deinit();
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen mech_deinit();
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen master_connection_deinit();
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen random_deinit();
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen closelog();
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen}
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainenint main(int argc __attr_unused__, char *argv[] __attr_unused__)
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen{
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen#ifdef DEBUG
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen fd_debug_verify_leaks(4, 1024);
d65a556a5ec078cd7f1d0060adb16fc860d66b27Timo Sirainen#endif
d65a556a5ec078cd7f1d0060adb16fc860d66b27Timo Sirainen /* NOTE: we start rooted, so keep the code minimal until
d65a556a5ec078cd7f1d0060adb16fc860d66b27Timo Sirainen restrict_access_by_env() is called */
812ac1e2570c600a086c09b24d250224a822a97dTimo Sirainen lib_init();
847aeef259d42e2f14cf126699e28291e6e1fb53Timo Sirainen drop_privileges();
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen ioloop = io_loop_create(system_pool);
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen main_init();
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen io_loop_run(ioloop);
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen main_deinit();
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen io_loop_destroy(ioloop);
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen lib_deinit();
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen return 0;
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen}
72388282bf6718c39af34cfcf51438910f9d62daTimo Sirainen