main.c revision 812883e7758a86f615b9508ef10df1339123da83
45312f52ff3a3d4c137447be4c7556500c2f8bf2Timo Sirainen/* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */
ab0d9eecd85f74acae18fe88529302e0776cc500Timo Sirainenstatic struct client_workaround_list client_workaround_list[] = {
fa45f3f1ad423381ba07056e415ffc4d6449f089Timo Sirainen { "outlook-no-nuls", WORKAROUND_OUTLOOK_NO_NULS },
8f1d14e3ada93a6d6ee64f73c6e6ae2364d8eba1Timo Sirainenvoid (*hook_client_created)(struct client **client) = NULL;
43d32cbe60fdaef2699d99f1ca259053e9350411Timo Sirainenstatic void log_error_callback(void *context ATTR_UNUSED)
2421fd34d51fed6da985c62b5e078d7e96640653Timo Sirainen /* the log fd is closed, don't die when trying to log later */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenparse_workarounds(const struct pop3_settings *set)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen enum client_workarounds client_workarounds = 0;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen const char *const *str;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen str = t_strsplit_spaces(set->pop3_client_workarounds, " ,");
fa45f3f1ad423381ba07056e415ffc4d6449f089Timo Sirainen i_fatal("Unknown client workaround: %s", *str);
00f5efa3156ab6a0b4f21e8c703d0eb816cf3091Timo Sirainenstatic enum uidl_keys parse_uidl_keymask(const char *format)
1b04762685272a53643ac2179939537a44c7c044Timo Sirainenstatic bool main_init(const struct pop3_settings *set, struct mail_user *user)
1b04762685272a53643ac2179939537a44c7c044Timo Sirainen const char *str;
f9ef36afc131626754716d6f4874a2ad04da0ac4Timo Sirainen /* If master dies, the log fd gets closed and we'll quit */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen client->uidl_keymask = parse_uidl_keymask(set->pop3_uidl_format);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen i_fatal("pop3_uidl_format setting doesn't contain any "
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen "%% variables.");
cd94aeaa294f7cc507206b4b2075852f00e14d61Timo Sirainen if (!i_stream_add_data(client->input, buf->data,
cd94aeaa294f7cc507206b4b2075852f00e14d61Timo Sirainen i_panic("Couldn't add client input to stream");
548f87789cf9865572b7b86f7be5a9bbfa132f3fTimo Sirainenstatic void main_deinit(void)
812883e7758a86f615b9508ef10df1339123da83Timo Sirainen const struct setting_parser_info *set_roots[] = {
1b04762685272a53643ac2179939537a44c7c044Timo Sirainen enum mail_storage_service_flags storage_service_flags =
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if (!IS_STANDALONE() && getenv("GDB") == NULL)
4dbe08e1f7f1271299ada9338ff5015367efd0b7Timo Sirainen printf("-ERR pop3 binary must not be started from "
4dbe08e1f7f1271299ada9338ff5015367efd0b7Timo Sirainen "inetd, use pop3-login instead.\n");
1b04762685272a53643ac2179939537a44c7c044Timo Sirainen service_flags |= MASTER_SERVICE_FLAG_STANDALONE;
1b04762685272a53643ac2179939537a44c7c044Timo Sirainen service_flags |= MAIL_STORAGE_SERVICE_FLAG_DISALLOW_ROOT;
1b04762685272a53643ac2179939537a44c7c044Timo Sirainen service = master_service_init("pop3", service_flags, argc, argv);
1b04762685272a53643ac2179939537a44c7c044Timo Sirainen while ((c = getopt(argc, argv, master_service_getopt_string())) > 0) {
1b04762685272a53643ac2179939537a44c7c044Timo Sirainen if (!master_service_parse_option(service, c, optarg))
812883e7758a86f615b9508ef10df1339123da83Timo Sirainen mail_user = mail_storage_service_init_user(service, user, set_roots,
1b04762685272a53643ac2179939537a44c7c044Timo Sirainen set = mail_storage_service_get_settings(service);
1b04762685272a53643ac2179939537a44c7c044Timo Sirainen /* fake that we're running, so we know if client was destroyed
1b04762685272a53643ac2179939537a44c7c044Timo Sirainen while initializing */