main.c revision 578ef2538ccf42e2a48234c24a8b709397101d88
45312f52ff3a3d4c137447be4c7556500c2f8bf2Timo Sirainen/* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainenstatic const struct setting_parser_info *set_roots[] = {
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainenstatic struct master_login *master_login = NULL;
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainenstatic enum mail_storage_service_flags storage_service_flags = 0;
8f1d14e3ada93a6d6ee64f73c6e6ae2364d8eba1Timo Sirainenvoid (*hook_client_created)(struct client **client) = NULL;
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainenstatic void client_add_input(struct client *client, const buffer_t *buf)
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen if (!i_stream_add_data(client->input, buf->data, buf->used))
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen i_panic("Couldn't add client input to stream");
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainenmain_stdio_init_user(const struct pop3_settings *set, struct mail_user *user)
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen client = client_create(STDIN_FILENO, STDOUT_FILENO, user, set);
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainenstatic void main_stdio_run(void)
cef2be5fb553b05f421f86c1ef497f0dc29d069eTimo Sirainen if (input.username == NULL && IS_STANDALONE())
4d4d6d4745682790c20d759ba93dbea46b812c5dTimo Sirainen mail_user = mail_storage_service_init_user(master_service,
4d4d6d4745682790c20d759ba93dbea46b812c5dTimo Sirainen set = mail_storage_service_get_settings(master_service);
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen master_service_set_die_with_master(master_service, TRUE);
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen /* fake that we're running, so we know if client was destroyed
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen while handling its initial input */
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainenlogin_client_connected(const struct master_login_client *client,
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen const char *username, const char *const *extra_fields)
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen i_error("Can't handle more than one connection currently");
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen i_error("login client: Username missing from auth reply");
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen mail_user = mail_storage_service_init_user(master_service,
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen set = mail_storage_service_get_settings(master_service);
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen master_service_set_die_with_master(master_service, TRUE);
1b04762685272a53643ac2179939537a44c7c044Timo Sirainen /* fake that we're running, so we know if client was destroyed
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen while handling its initial input */
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen buffer_create_const_data(&input_buf, client->data,
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen pop3_client = client_create(client->fd, client->fd, mail_user, set);
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainenstatic void client_connected(const struct master_service_connection *conn)
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen /* running standalone, we shouldn't even get here */
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen printf("-ERR pop3 binary must not be started from "
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen "inetd, use pop3-login instead.\n");
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen service_flags |= MASTER_SERVICE_FLAG_STANDALONE |
578ef2538ccf42e2a48234c24a8b709397101d88Timo Sirainen master_service = master_service_init("pop3", service_flags,
cf0ad1a0bddb0787f3d7b408a96d721a8b2a98a3Timo Sirainen master_login = master_login_init("auth-master",