main.c revision 4307c886579381dbb1897ea1388ae6978c96f560
183bea41fa640dc8117f3eb45ff935cd81377a84Timo Sirainen/* Copyright (c) 2002-2012 Dovecot authors, see the included COPYING file */
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen#include "pop3-common.h"
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen#include "ioloop.h"
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen#include "buffer.h"
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen#include "istream.h"
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen#include "ostream.h"
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen#include "abspath.h"
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen#include "base64.h"
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen#include "str.h"
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen#include "process-title.h"
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen#include "restrict-access.h"
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen#include "master-service.h"
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen#include "master-login.h"
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen#include "master-interface.h"
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen#include "var-expand.h"
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen#include "mail-error.h"
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen#include "mail-user.h"
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen#include "mail-storage-service.h"
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen#include <stdio.h>
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen#include <stdlib.h>
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen#include <unistd.h>
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen#define IS_STANDALONE() \
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen (getenv(MASTER_IS_PARENT_ENV) == NULL)
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainenstatic bool verbose_proctitle = FALSE;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainenstatic struct mail_storage_service_ctx *storage_service;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainenstatic struct master_login *master_login = NULL;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainenpop3_client_created_func_t *hook_client_created = NULL;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainenpop3_client_created_func_t *
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainenpop3_client_created_hook_set(pop3_client_created_func_t *new_hook)
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen{
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen pop3_client_created_func_t *old_hook = hook_client_created;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen hook_client_created = new_hook;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen return old_hook;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen}
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainenvoid pop3_refresh_proctitle(void)
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen{
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen struct client *client;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen string_t *title = t_str_new(128);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen if (!verbose_proctitle)
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen return;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen str_append_c(title, '[');
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen switch (pop3_client_count) {
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen case 0:
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen str_append(title, "idling");
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen break;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen case 1:
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen client = pop3_clients;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen str_append(title, client->user->username);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen if (client->user->remote_ip != NULL) {
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen str_append_c(title, ' ');
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen str_append(title, net_ip2addr(client->user->remote_ip));
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen }
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen break;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen default:
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen str_printfa(title, "%u connections", pop3_client_count);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen break;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen }
75113e5fa7532ef628f273caac2feec6008992c6Timo Sirainen str_append_c(title, ']');
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen process_title_set(str_c(title));
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen}
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainenstatic void pop3_die(void)
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen{
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen /* do nothing. pop3 connections typically die pretty quick anyway. */
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen}
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainenstatic void client_add_input(struct client *client, const buffer_t *buf)
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen{
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen struct ostream *output;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen if (buf != NULL && buf->used > 0) {
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen if (!i_stream_add_data(client->input, buf->data, buf->used))
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen i_panic("Couldn't add client input to stream");
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen }
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen output = client->output;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen o_stream_ref(output);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen o_stream_cork(output);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen if (!IS_STANDALONE())
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen client_send_line(client, "+OK Logged in.");
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen (void)client_handle_input(client);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen o_stream_uncork(output);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen o_stream_unref(&output);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen}
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainenstatic int
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainenclient_create_from_input(const struct mail_storage_service_input *input,
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen int fd_in, int fd_out, const buffer_t *input_buf,
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen const char **error_r)
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen{
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen const char *lookup_error_str =
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen "-ERR [IN-USE] "MAIL_ERRSTR_CRITICAL_MSG"\r\n";
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen struct mail_storage_service_user *user;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen struct mail_user *mail_user;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen struct client *client;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen const struct pop3_settings *set;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen if (mail_storage_service_lookup_next(storage_service, input,
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen &user, &mail_user, error_r) <= 0) {
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen (void)write(fd_out, lookup_error_str, strlen(lookup_error_str));
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen return -1;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen }
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen restrict_access_allow_coredumps(TRUE);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen set = mail_storage_service_user_get_set(user)[1];
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen if (set->verbose_proctitle)
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen verbose_proctitle = TRUE;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen client = client_create(fd_in, fd_out, input->session_id,
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen mail_user, user, set);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen if (client != NULL) T_BEGIN {
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen client_add_input(client, input_buf);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen } T_END;
75113e5fa7532ef628f273caac2feec6008992c6Timo Sirainen return 0;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen}
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainenstatic void main_stdio_run(const char *username)
75113e5fa7532ef628f273caac2feec6008992c6Timo Sirainen{
75113e5fa7532ef628f273caac2feec6008992c6Timo Sirainen struct mail_storage_service_input input;
75113e5fa7532ef628f273caac2feec6008992c6Timo Sirainen buffer_t *input_buf;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen const char *value, *error, *input_base64;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
75113e5fa7532ef628f273caac2feec6008992c6Timo Sirainen memset(&input, 0, sizeof(input));
75113e5fa7532ef628f273caac2feec6008992c6Timo Sirainen input.module = input.service = "pop3";
75113e5fa7532ef628f273caac2feec6008992c6Timo Sirainen input.username = username != NULL ? username : getenv("USER");
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen if (input.username == NULL && IS_STANDALONE())
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen input.username = getlogin();
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen if (input.username == NULL)
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen i_fatal("USER environment missing");
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen if ((value = getenv("IP")) != NULL)
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen (void)net_addr2ip(value, &input.remote_ip);
75113e5fa7532ef628f273caac2feec6008992c6Timo Sirainen if ((value = getenv("LOCAL_IP")) != NULL)
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen (void)net_addr2ip(value, &input.local_ip);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
75113e5fa7532ef628f273caac2feec6008992c6Timo Sirainen input_base64 = getenv("CLIENT_INPUT");
75113e5fa7532ef628f273caac2feec6008992c6Timo Sirainen input_buf = input_base64 == NULL ? NULL :
75113e5fa7532ef628f273caac2feec6008992c6Timo Sirainen t_base64_decode_str(input_base64);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen if (client_create_from_input(&input, STDIN_FILENO, STDOUT_FILENO,
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen input_buf, &error) < 0)
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen i_fatal("%s", error);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen}
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainenstatic void
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainenlogin_client_connected(const struct master_login_client *client,
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen const char *username, const char *const *extra_fields)
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen{
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen struct mail_storage_service_input input;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen const char *error;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen buffer_t input_buf;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen memset(&input, 0, sizeof(input));
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen input.module = input.service = "pop3";
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen input.local_ip = client->auth_req.local_ip;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen input.remote_ip = client->auth_req.remote_ip;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen input.username = username;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen input.userdb_fields = extra_fields;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen input.session_id = client->session_id;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen buffer_create_const_data(&input_buf, client->data,
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen client->auth_req.data_size);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen if (client_create_from_input(&input, client->fd, client->fd,
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen &input_buf, &error) < 0) {
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen int fd = client->fd;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen i_error("%s", error);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen i_close_fd(&fd);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen master_service_client_connection_destroyed(master_service);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen }
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen}
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainenstatic void login_client_failed(const struct master_login_client *client,
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen const char *errormsg)
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen{
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen const char *msg;
902acc26200957a1f04da3cc947211f0b9ffce05Timo Sirainen
902acc26200957a1f04da3cc947211f0b9ffce05Timo Sirainen msg = t_strdup_printf("-ERR [IN-USE] %s\r\n", errormsg);
902acc26200957a1f04da3cc947211f0b9ffce05Timo Sirainen if (write(client->fd, msg, strlen(msg)) < 0) {
902acc26200957a1f04da3cc947211f0b9ffce05Timo Sirainen /* ignored */
902acc26200957a1f04da3cc947211f0b9ffce05Timo Sirainen }
902acc26200957a1f04da3cc947211f0b9ffce05Timo Sirainen}
902acc26200957a1f04da3cc947211f0b9ffce05Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainenstatic void client_connected(struct master_service_connection *conn)
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen{
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen /* when running standalone, we shouldn't even get here */
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen i_assert(master_login != NULL);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen master_service_client_connection_accept(conn);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen master_login_add(master_login, conn->fd);
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen}
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainenint main(int argc, char *argv[])
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen{
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen static const struct setting_parser_info *set_roots[] = {
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen &pop3_setting_parser_info,
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen NULL
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen };
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen struct master_login_settings login_set;
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen enum master_service_flags service_flags = 0;
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen enum mail_storage_service_flags storage_service_flags = 0;
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen const char *username = NULL;
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen int c;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen memset(&login_set, 0, sizeof(login_set));
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen login_set.postlogin_timeout_secs = MASTER_POSTLOGIN_TIMEOUT_DEFAULT;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen if (IS_STANDALONE() && getuid() == 0 &&
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen net_getpeername(1, NULL, NULL) == 0) {
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen printf("-ERR pop3 binary must not be started from "
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen "inetd, use pop3-login instead.\n");
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen return 1;
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen }
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen if (IS_STANDALONE()) {
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen service_flags |= MASTER_SERVICE_FLAG_STANDALONE |
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen MASTER_SERVICE_FLAG_STD_CLIENT;
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen } else {
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen service_flags |= MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN;
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen storage_service_flags |=
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen MAIL_STORAGE_SERVICE_FLAG_DISALLOW_ROOT;
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen }
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen master_service = master_service_init("pop3", service_flags,
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen &argc, &argv, "t:u:");
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen while ((c = master_getopt(master_service)) > 0) {
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen switch (c) {
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen case 't':
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen if (str_to_uint(optarg, &login_set.postlogin_timeout_secs) < 0 ||
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen login_set.postlogin_timeout_secs == 0)
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen i_fatal("Invalid -t parameter: %s", optarg);
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen break;
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen case 'u':
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen storage_service_flags |=
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen username = optarg;
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen break;
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen default:
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen return FATAL_DEFAULT;
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen }
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen }
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen login_set.auth_socket_path = t_abspath("auth-master");
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen if (argv[optind] != NULL)
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen login_set.postlogin_socket_path = t_abspath(argv[optind]);
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen login_set.callback = login_client_connected;
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen login_set.failure_callback = login_client_failed;
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen master_service_init_finish(master_service);
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen master_service_set_die_callback(master_service, pop3_die);
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen storage_service =
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen mail_storage_service_init(master_service,
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen set_roots, storage_service_flags);
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen /* fake that we're running, so we know if client was destroyed
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen while handling its initial input */
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen io_loop_set_running(current_ioloop);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen if (IS_STANDALONE()) {
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen T_BEGIN {
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen main_stdio_run(username);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen } T_END;
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen } else {
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen master_login = master_login_init(master_service, &login_set);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen io_loop_set_running(current_ioloop);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen }
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen if (io_loop_is_running(current_ioloop))
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen master_service_run(master_service, client_connected);
6b2738c39a868ff9291867138c55029fc40cf105Timo Sirainen clients_destroy_all();
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen if (master_login != NULL)
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen master_login_deinit(&master_login);
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen mail_storage_service_deinit(&storage_service);
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen master_service_deinit(&master_service);
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen return 0;
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen}
73bc59c2a56ff351ae7c4d9f52de76b1b0173995Timo Sirainen