main.c revision c86392a82185a4854ae1e69a857daa7f2f201e90
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen/* Copyright (C) 2002-2003 Timo Sirainen */
fa45f3f1ad423381ba07056e415ffc4d6449f089Timo Sirainenstruct client_workaround_list client_workaround_list[] = {
fa45f3f1ad423381ba07056e415ffc4d6449f089Timo Sirainen { "outlook-no-nuls", WORKAROUND_OUTLOOK_NO_NULS },
2be6f5fae2e5081e601be05c41acb059a6c60e98Timo Sirainenvoid (*hook_mail_storage_created)(struct mail_storage *storage) = NULL;
8f1d14e3ada93a6d6ee64f73c6e6ae2364d8eba1Timo Sirainenvoid (*hook_client_created)(struct client **client) = NULL;
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainenstatic char log_prefix[128]; /* syslog() needs this to be permanent */
fa45f3f1ad423381ba07056e415ffc4d6449f089Timo Sirainenenum client_workarounds client_workarounds = 0;
321221ddc2dedc4ad79839770765adc40d311a0dTimo Sirainenstatic void sig_die(int signo, void *context __attr_unused__)
321221ddc2dedc4ad79839770765adc40d311a0dTimo Sirainen /* warn about being killed because of some signal, except SIGINT (^C)
321221ddc2dedc4ad79839770765adc40d311a0dTimo Sirainen which is too common at least while testing :) */
f9ef36afc131626754716d6f4874a2ad04da0ac4Timo Sirainenstatic void log_error_callback(void *context __attr_unused__)
fa45f3f1ad423381ba07056e415ffc4d6449f089Timo Sirainenstatic void parse_workarounds(void)
8b63896feaef40e8c85fa00acdcc123b508e8d42Timo Sirainen for (str = t_strsplit_spaces(env, " ,"); *str != NULL; str++) {
fa45f3f1ad423381ba07056e415ffc4d6449f089Timo Sirainen i_fatal("Unknown client workaround: %s", *str);
00f5efa3156ab6a0b4f21e8c703d0eb816cf3091Timo Sirainenstatic enum uidl_keys parse_uidl_keymask(const char *format)
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainenstatic void open_logfile(void)
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen /* quite a long user name, cut it */
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen user = t_strndup(user, sizeof(log_prefix)-6-2);
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen i_snprintf(log_prefix, sizeof(log_prefix), "pop3(%s)", user);
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen /* log to file or stderr */
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen i_set_failure_file(getenv("LOGFILE"), log_prefix);
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen i_set_failure_timestamp_format(getenv("LOGSTAMP"));
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainenstatic void drop_privileges(void)
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen /* Log file or syslog opening probably requires roots */
aa78a2506ee69a6bd58cc706210ee79b62ec0954Timo Sirainen /* Most likely needed. Have to open /dev/urandom before possible
aa78a2506ee69a6bd58cc706210ee79b62ec0954Timo Sirainen chrooting. */
67b785ce2485243c490f0a8b0753ac4a5d347265Timo Sirainenstatic int main_init(void)
321221ddc2dedc4ad79839770765adc40d311a0dTimo Sirainen lib_signals_set_handler(SIGINT, TRUE, sig_die, NULL);
321221ddc2dedc4ad79839770765adc40d311a0dTimo Sirainen lib_signals_set_handler(SIGTERM, TRUE, sig_die, NULL);
130191cd9b8dfaf988fd28f9a7d52c1bddc24045Timo Sirainen lib_signals_set_handler(SIGALRM, FALSE, NULL, NULL);
b725e5503d72a29a3eb18f93c1cbe597c4c31dcdTimo Sirainen if (getenv("STDERR_CLOSE_SHUTDOWN") != NULL) {
f9ef36afc131626754716d6f4874a2ad04da0ac4Timo Sirainen /* If master dies, the log fd gets closed and we'll quit */
457cafc9e72edb81eacfe88b35f14a75a96cf00aTimo Sirainen const char *plugin_dir = getenv("MAIL_PLUGIN_DIR");
457cafc9e72edb81eacfe88b35f14a75a96cf00aTimo Sirainen modules = module_dir_load(plugin_dir, getenv("MAIL_PLUGINS"),
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen /* support also maildir-specific environment */
63d6d0218e5945ad3a7d3fa02e6dc1be2982e257Timo Sirainen enable_last_command = getenv("POP3_ENABLE_LAST") != NULL;
f99fab9747beba303a64e7db9026e3185425833dTimo Sirainen no_flag_updates = getenv("POP3_NO_FLAG_UPDATES") != NULL;
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen reuse_xuidl = getenv("POP3_REUSE_XUIDL") != NULL;
00f5efa3156ab6a0b4f21e8c703d0eb816cf3091Timo Sirainen lock_session = getenv("POP3_LOCK_SESSION") != NULL;
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen if (uidl_format == NULL || *uidl_format == '\0')
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen i_fatal("pop3_uidl_format setting is missing from config file");
afccb70aad7b6609144971e9db9ece96a5ed8dc9Timo Sirainen logout_format = "top=%t/%p, retr=%r/%b, del=%d/%m, size=%s";
afccb70aad7b6609144971e9db9ece96a5ed8dc9Timo Sirainen uidl_keymask = parse_uidl_keymask(uidl_format);
00f5efa3156ab6a0b4f21e8c703d0eb816cf3091Timo Sirainen i_fatal("pop3_uidl_format setting doesn't contain any "
6303fb1055fd85c3e3ca9320bc5754186dbd3a5aTimo Sirainen "%% variables.");
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen storage = mail_storage_create_with_data(mail, getenv("USER"),
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen i_fatal("Failed to create storage with data: %s", mail);
f9ef36afc131626754716d6f4874a2ad04da0ac4Timo Sirainenstatic void main_deinit(void)
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainenint main(int argc __attr_unused__, char *argv[], char *envp[])
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen if (getenv("LOGGED_IN") != NULL && getenv("GDB") == NULL)
4dbe08e1f7f1271299ada9338ff5015367efd0b7Timo Sirainen printf("-ERR pop3 binary must not be started from "
4dbe08e1f7f1271299ada9338ff5015367efd0b7Timo Sirainen "inetd, use pop3-login instead.\n");
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen /* NOTE: we start rooted, so keep the code minimal until
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen restrict_access_by_env() is called */