main.c revision 34c52d6d4f55de604f08c0bfbc11ab1266827af5
4506N/A/* Copyright (C) 2002 Timo Sirainen */
4506N/A
4506N/A#include "common.h"
4506N/A#include "ioloop.h"
4506N/A#include "lib-signals.h"
4506N/A#include "rawlog.h"
4506N/A#include "restrict-access.h"
4506N/A
4506N/A#include <stdlib.h>
4506N/A#include <syslog.h>
4506N/A
4506N/AIOLoop ioloop;
4506N/Astatic char log_prefix[64];
4506N/A
4506N/Astatic void sig_quit(int signo __attr_unused__)
4506N/A{
4506N/A io_loop_stop(ioloop);
4506N/A}
4506N/A
4506N/Astatic void main_init(int use_syslog)
4506N/A{
4506N/A Client *client;
6033N/A MailStorage *storage;
4506N/A const char *logfile, *mail, *tag;
4506N/A int hin, hout;
4506N/A
4506N/A hin = 0; hout = 1;
4506N/A
6033N/A lib_init_signals(sig_quit);
6033N/A
6033N/A i_snprintf(log_prefix, sizeof(log_prefix), "imap(%s)", getenv("USER"));
4506N/A
4506N/A logfile = getenv("IMAP_LOGFILE");
4506N/A if (logfile != NULL) {
6033N/A /* log failures into specified log file */
4506N/A i_set_failure_file(logfile, log_prefix);
4506N/A i_set_failure_timestamp_format(getenv("IMAP_LOGSTAMP"));
4506N/A } else if (use_syslog) {
4506N/A /* prefix with imapd(user) */
4506N/A openlog(log_prefix, 0, LOG_MAIL);
6033N/A
4506N/A i_set_panic_handler(i_syslog_panic_handler);
4506N/A i_set_fatal_handler(i_syslog_fatal_handler);
4506N/A i_set_error_handler(i_syslog_error_handler);
4506N/A i_set_warning_handler(i_syslog_warning_handler);
4506N/A }
4506N/A
4506N/A /* do the chrooting etc. */
4506N/A restrict_access_by_env();
4506N/A
4623N/A rawlog_open(&hin, &hout);
4506N/A
4506N/A mail_storage_register_all();
4506N/A clients_init();
4506N/A
4506N/A mail = getenv("MAIL");
4506N/A if (mail == NULL) {
6033N/A /* support also maildir-specific environment */
6033N/A mail = getenv("MAILDIR");
6033N/A if (mail != NULL)
4506N/A mail = t_strconcat("maildir:", mail, NULL);
4506N/A }
6033N/A
6033N/A storage = mail_storage_create_with_data(mail, getenv("USER"));
6033N/A if (storage == NULL) {
6033N/A /* failed */
6033N/A if (mail != NULL && *mail != '\0')
6033N/A i_fatal("Failed to create storage with data: %s", mail);
6033N/A else {
6033N/A const char *home;
6033N/A
6033N/A home = getenv("HOME");
6033N/A if (home == NULL) home = "not set";
6033N/A
6033N/A i_fatal("MAIL environment missing and "
6033N/A "autodetection failed (home %s)", home);
6033N/A }
4506N/A } else {
4506N/A client = client_create(hin, hout, storage);
4506N/A
4506N/A tag = getenv("LOGIN_TAG");
4506N/A if (tag == NULL || *tag == '\0')
4506N/A tag = "*";
4506N/A
4506N/A client_send_line(client, t_strconcat(tag, " OK Logged in.",
4506N/A NULL));
4506N/A }
4506N/A}
4506N/A
4506N/Astatic void main_deinit(void)
4506N/A{
4506N/A /* warn about being killed because of some signal, except SIGINT (^C)
4506N/A which is too common at least while testing :) */
6033N/A if (lib_signal_kill != 0 && lib_signal_kill != 2)
4506N/A i_warning("Killed with signal %d", lib_signal_kill);
6033N/A
4506N/A clients_deinit();
4506N/A
4506N/A closelog();
4506N/A}
6033N/A
4506N/Aint main(int argc, char *argv[])
4506N/A{
/* NOTE: we start rooted, so keep the code minimal until
restrict_access_by_env() is called */
lib_init();
ioloop = io_loop_create(system_pool);
main_init(argc >= 2 && strcmp(argv[1], "-s") == 0);
io_loop_run(ioloop);
main_deinit();
io_loop_destroy(ioloop);
lib_deinit();
return 0;
}