main.c revision 67b785ce2485243c490f0a8b0753ac4a5d347265
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen/* Copyright (C) 2002-2003 Timo Sirainen */
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen#include "common.h"
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen#include "ioloop.h"
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen#include "lib-signals.h"
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen#include "restrict-access.h"
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen#include "fd-close-on-exec.h"
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen#include "process-title.h"
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen#include "mail-storage.h"
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen#include <stdlib.h>
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen#include <syslog.h>
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen#define IS_STANDALONE() \
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen (getenv("LOGGED_IN") == NULL)
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainenstruct ioloop *ioloop;
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainenstatic char log_prefix[128]; /* syslog() needs this to be permanent */
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainenstatic void sig_quit(int signo __attr_unused__)
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen{
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen io_loop_stop(ioloop);
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen}
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainenstatic void open_logfile(void)
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen{
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen const char *user;
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen user = getenv("USER");
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen if (user == NULL) user = "??";
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen if (strlen(user) >= sizeof(log_prefix)-6) {
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen /* quite a long user name, cut it */
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen user = t_strndup(user, sizeof(log_prefix)-6-2);
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen user = t_strconcat(user, "..", NULL);
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen }
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen i_snprintf(log_prefix, sizeof(log_prefix), "pop3(%s)", user);
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen if (getenv("USE_SYSLOG") != NULL)
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen i_set_failure_syslog(log_prefix, LOG_NDELAY, LOG_MAIL);
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen else {
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen /* log to file or stderr */
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen i_set_failure_file(getenv("LOGFILE"), log_prefix);
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen }
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen if (getenv("INFOLOGFILE") != NULL)
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen i_set_info_file(getenv("INFOLOGFILE"));
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen i_set_failure_timestamp_format(getenv("LOGSTAMP"));
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen}
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainenstatic void drop_privileges(void)
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen{
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen /* Log file or syslog opening probably requires roots */
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen open_logfile();
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen restrict_access_by_env(!IS_STANDALONE());
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen}
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
67b785ce2485243c490f0a8b0753ac4a5d347265Timo Sirainenstatic int main_init(void)
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen{
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen struct client *client;
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen struct mail_storage *storage;
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen const char *mail;
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen lib_init_signals(sig_quit);
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen if (getenv("USER") == NULL)
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen i_fatal("USER environment missing");
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen mail_storage_register_all();
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen clients_init();
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen mail = getenv("MAIL");
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen if (mail == NULL) {
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen /* support also maildir-specific environment */
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen mail = getenv("MAILDIR");
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen if (mail != NULL)
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen mail = t_strconcat("maildir:", mail, NULL);
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen }
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen storage = mail_storage_create_with_data(mail, getenv("USER"));
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen if (storage == NULL) {
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen /* failed */
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen if (mail != NULL && *mail != '\0')
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen i_fatal("Failed to create storage with data: %s", mail);
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen else {
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen const char *home;
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen home = getenv("HOME");
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen if (home == NULL) home = "not set";
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen i_fatal("MAIL environment missing and "
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen "autodetection failed (home %s)", home);
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen }
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen }
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
67b785ce2485243c490f0a8b0753ac4a5d347265Timo Sirainen client = client_create(0, 1, storage);
67b785ce2485243c490f0a8b0753ac4a5d347265Timo Sirainen return client != NULL;
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen}
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainenstatic void main_deinit(void)
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen{
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen /* warn about being killed because of some signal, except SIGINT (^C)
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen which is too common at least while testing :) */
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen if (lib_signal_kill != 0 && lib_signal_kill != 2)
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen i_warning("Killed with signal %d", lib_signal_kill);
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen clients_deinit();
18d788657cff0fc3905b6a484d33c8c9fc2b9ebaTimo Sirainen mail_storage_deinit();
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen closelog();
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen}
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainenint main(int argc __attr_unused__, char *argv[], char *envp[])
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen{
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen#ifdef DEBUG
4f2a24a029bf3e088cc2f804e051a1430bdb4db3Timo Sirainen if (getenv("LOGGED_IN") != NULL)
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen fd_debug_verify_leaks(3, 1024);
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen#endif
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen /* NOTE: we start rooted, so keep the code minimal until
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen restrict_access_by_env() is called */
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen lib_init();
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen drop_privileges();
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen process_title_init(argv, envp);
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen ioloop = io_loop_create(system_pool);
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
67b785ce2485243c490f0a8b0753ac4a5d347265Timo Sirainen if (main_init())
67b785ce2485243c490f0a8b0753ac4a5d347265Timo Sirainen io_loop_run(ioloop);
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen main_deinit();
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen io_loop_destroy(ioloop);
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen lib_deinit();
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen return 0;
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen}