main.c revision ab8e7c30442b7f625d074336430ea44bbf2b2978
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen/* Copyright (C) 2002-2003 Timo Sirainen */
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen (getenv("LOGGED_IN") == NULL && getenv("IMAPLOGINTAG") == NULL)
542e28b384a6b26695f3e8de38fd5727d06f3333Timo Sirainenstruct client_workaround_list client_workaround_list[] = {
542e28b384a6b26695f3e8de38fd5727d06f3333Timo Sirainen { "delay-newmail", WORKAROUND_DELAY_NEWMAIL },
13b063ba3ea51256fd97d7fa883f14cb08842b0dTimo Sirainenenum client_workarounds client_workarounds = 0;
13b063ba3ea51256fd97d7fa883f14cb08842b0dTimo Sirainenstatic char log_prefix[128]; /* syslog() needs this to be permanent */
13b063ba3ea51256fd97d7fa883f14cb08842b0dTimo Sirainenvoid (*hook_mail_storage_created)(struct mail_storage *storage) = NULL;
13b063ba3ea51256fd97d7fa883f14cb08842b0dTimo Sirainenvoid (*hook_client_created)(struct client **client) = NULL;
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenstatic void sig_quit(int signo __attr_unused__)
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainenstatic void parse_workarounds(void)
4da8c6cdefabd31262318c32da3c13de1d9ea953Timo Sirainen for (str = t_strsplit_spaces(env, " "); *str != NULL; str++) {
b9b841558c5f91db7f5fc71c0ac62aad1bbf6418Timo Sirainen i_fatal("Unknown client workaround: %s", *str);
1388b590dbd85245b591346f860bc1319953318aTimo Sirainenstatic void open_logfile(void)
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen /* quite a long user name, cut it */
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen user = t_strndup(user, sizeof(log_prefix)-6-2);
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen i_snprintf(log_prefix, sizeof(log_prefix), "imap(%s)", user);
2eb2cf8eeb763bd5ca9b6848dce32f0303e88ec1Timo Sirainen i_set_failure_syslog(log_prefix, LOG_NDELAY, LOG_MAIL);
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen /* log to file or stderr */
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen i_set_failure_file(getenv("LOGFILE"), log_prefix);
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen i_set_failure_timestamp_format(getenv("LOGSTAMP"));
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainenstatic void drop_privileges(void)
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen /* Log file or syslog opening probably requires roots */
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen /* Most likely needed. Have to open /dev/urandom before possible
367e28a16854ee9f7247b2518f36f5e9163fcc10Timo Sirainen chrooting. */
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainenstatic void main_init(void)
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen capability_string = str_new(default_pool, sizeof(CAPABILITY_STRING)+32);
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen str_append(capability_string, CAPABILITY_STRING);
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen modules = getenv("MODULE_DIR") == NULL ? NULL :
1f5597beba229acd914e30a6da3c0e62d83b6e8fTimo Sirainen namespace_pool = pool_alloconly_create("namespaces", 1024);
1f5597beba229acd914e30a6da3c0e62d83b6e8fTimo Sirainen client = client_create(0, 1, namespace_init(namespace_pool, user));
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen /* Support for mailfront */
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen client_send_line(client, t_strconcat(getenv("IMAPLOGINTAG"),
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainenstatic void main_deinit(void)
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen /* warn about being killed because of some signal, except SIGINT (^C)
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen which is too common at least while testing :) */
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen if (lib_signal_kill != 0 && lib_signal_kill != 2)
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen i_warning("Killed with signal %d", lib_signal_kill);
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainenint main(int argc __attr_unused__, char *argv[], char *envp[])
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen if (getenv("LOGGED_IN") != NULL && getenv("GDB") == NULL)
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen printf("* BAD [ALERT] imap binary must not be started from "
c07d7eb3ca9754367697c98f5e66a3982a45d142Timo Sirainen "inetd, use imap-login instead.\n");
8d3278a82b964217d95c340ec6f82037cdc59d19Timo Sirainen /* NOTE: we start rooted, so keep the code minimal until
002179a890bf4f1942cad6463787719eaa9fd6c0Timo Sirainen restrict_access_by_env() is called */