main.c revision e959e240bb8975cba293a94dbc61712b232904f6
76b43e4417bab52e913da39b5f5bc2a130d3f149Timo Sirainen/* Copyright (c) 2002-2008 Dovecot authors, see the included COPYING file */
fa45f3f1ad423381ba07056e415ffc4d6449f089Timo Sirainenstruct client_workaround_list client_workaround_list[] = {
fa45f3f1ad423381ba07056e415ffc4d6449f089Timo Sirainen { "outlook-no-nuls", WORKAROUND_OUTLOOK_NO_NULS },
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainenvoid (*hook_client_created)(struct client **client) = NULL;
4449ad85fcbd4f6fedbaa9a5bdfe58a9ae60f8aeTimo Sirainenstatic char log_prefix[128]; /* syslog() needs this to be permanent */
f9ef36afc131626754716d6f4874a2ad04da0ac4Timo Sirainenenum client_workarounds client_workarounds = 0;
00f5efa3156ab6a0b4f21e8c703d0eb816cf3091Timo Sirainenstatic void sig_die(int signo, void *context ATTR_UNUSED)
43d32cbe60fdaef2699d99f1ca259053e9350411Timo Sirainen /* warn about being killed because of some signal, except SIGINT (^C)
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen which is too common at least while testing :) */
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainenstatic void log_error_callback(void *context ATTR_UNUSED)
f9ef36afc131626754716d6f4874a2ad04da0ac4Timo Sirainenstatic void parse_workarounds(void)
fa45f3f1ad423381ba07056e415ffc4d6449f089Timo Sirainen for (str = t_strsplit_spaces(env, " ,"); *str != NULL; str++) {
fa45f3f1ad423381ba07056e415ffc4d6449f089Timo Sirainen i_fatal("Unknown client workaround: %s", *str);
fa45f3f1ad423381ba07056e415ffc4d6449f089Timo Sirainenstatic enum uidl_keys parse_uidl_keymask(const char *format)
00f5efa3156ab6a0b4f21e8c703d0eb816cf3091Timo Sirainenstatic void open_logfile(void)
316dad8277db6575354eba30d3fc7a1c0447c513Timo Sirainen i_strocpy(log_prefix, getenv("LOG_PREFIX"), sizeof(log_prefix));
174a54c74848b8668acd72ddf36d9b4745e1ad5eTimo Sirainen /* quite a long user name, cut it */
174a54c74848b8668acd72ddf36d9b4745e1ad5eTimo Sirainen user = t_strndup(user, sizeof(log_prefix)-6-2);
174a54c74848b8668acd72ddf36d9b4745e1ad5eTimo Sirainen i_snprintf(log_prefix, sizeof(log_prefix), "pop3(%s): ", user);
38a72d61d3a114816771f3045f374d56e2194232Timo Sirainen /* log to file or stderr */
38a72d61d3a114816771f3045f374d56e2194232Timo Sirainen i_set_failure_file(getenv("LOGFILE"), log_prefix);
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen i_set_failure_timestamp_format(getenv("LOGSTAMP"));
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainenstatic void drop_privileges(void)
41590df9f518459d66a9f7b9be2126f2e31fb221Timo Sirainen if (version != NULL && strcmp(version, PACKAGE_VERSION) != 0) {
41590df9f518459d66a9f7b9be2126f2e31fb221Timo Sirainen "(if you don't care, set version_ignore=yes)", version);
41590df9f518459d66a9f7b9be2126f2e31fb221Timo Sirainen /* Log file or syslog opening probably requires roots */
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen /* Most likely needed. Have to open /dev/urandom before possible
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen chrooting. */
4449ad85fcbd4f6fedbaa9a5bdfe58a9ae60f8aeTimo Sirainen /* Load the plugins before chrooting. Their init() is called later. */
4449ad85fcbd4f6fedbaa9a5bdfe58a9ae60f8aeTimo Sirainen const char *plugin_dir = getenv("MAIL_PLUGIN_DIR");
4449ad85fcbd4f6fedbaa9a5bdfe58a9ae60f8aeTimo Sirainen modules = module_dir_load(plugin_dir, getenv("MAIL_PLUGINS"),
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo 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);
5ffb4d27772d2ad19d5e1e8136bbac4b7cdc0706Timo Sirainen if (getenv("STDERR_CLOSE_SHUTDOWN") != NULL) {
b725e5503d72a29a3eb18f93c1cbe597c4c31dcdTimo Sirainen /* If master dies, the log fd gets closed and we'll quit */
a1fa538bac7e5f18d507446e84be49a163c6697dTimo Sirainen enable_last_command = getenv("POP3_ENABLE_LAST") != NULL;
a1fa538bac7e5f18d507446e84be49a163c6697dTimo Sirainen no_flag_updates = getenv("POP3_NO_FLAG_UPDATES") != NULL;
9beca5d6e1f018a7851a57117c036540d823957fTimo Sirainen reuse_xuidl = getenv("POP3_REUSE_XUIDL") != NULL;
63d6d0218e5945ad3a7d3fa02e6dc1be2982e257Timo Sirainen lock_session = getenv("POP3_LOCK_SESSION") != NULL;
00f5efa3156ab6a0b4f21e8c703d0eb816cf3091Timo Sirainen if (uidl_format == NULL || *uidl_format == '\0')
9439bed2f07d6475febd8a247cd2f0990fb32a13Timo Sirainen logout_format = "top=%t/%p, retr=%r/%b, del=%d/%m, size=%s";
9dd0fae306efb630d9b0dc1e4517cccbc8447164Timo Sirainen uidl_keymask = parse_uidl_keymask(uidl_format);
afccb70aad7b6609144971e9db9ece96a5ed8dc9Timo Sirainen i_fatal("pop3_uidl_format setting doesn't contain any "
afccb70aad7b6609144971e9db9ece96a5ed8dc9Timo Sirainen "%% variables.");
00f5efa3156ab6a0b4f21e8c703d0eb816cf3091Timo Sirainen namespace_pool = pool_alloconly_create("namespaces", 1024);
e8490a52a1bc71bc53034e68f464435684ad810fTimo Sirainen if (mail_namespaces_init(namespace_pool, getenv("USER"), &ns) < 0)
d23c747de9d33966483fbdd41f08ad7766da7c5cTimo Sirainenstatic void main_deinit(void)
cd94aeaa294f7cc507206b4b2075852f00e14d61Timo Sirainenint main(int argc ATTR_UNUSED, char *argv[], char *envp[])
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen if (getenv("LOGGED_IN") != NULL && getenv("GDB") == NULL)
f9ef36afc131626754716d6f4874a2ad04da0ac4Timo Sirainen printf("-ERR pop3 binary must not be started from "
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen "inetd, use pop3-login instead.\n");
419cf63077e755935ce105747d6ebc67b7d38a7fTimo Sirainen /* NOTE: we start rooted, so keep the code minimal until
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainen restrict_access_by_env() is called */