main.c revision 97db4761382024093f441e4bc78ba8b6a056504d
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenconst struct login_settings *global_login_settings;
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenstatic void client_connected(const struct master_service_connection *conn)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen if (net_getsockname(conn->fd, &local_ip, &local_port) < 0) {
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen pool = pool_alloconly_create("login client", 1024);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen set = login_settings_read(service, pool, &local_ip, &conn->remote_ip);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen client = client_create(conn->fd, FALSE, pool, set, &local_ip,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen fd_ssl = ssl_proxy_new(conn->fd, &conn->remote_ip, set, &proxy);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen client = client_create(fd_ssl, TRUE, pool, set,
c59b9c273b41f7bcf51f6803110b67813879ff05Timo Sirainenstatic void auth_connect_notify(struct auth_client *client ATTR_UNUSED,
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenstatic int anvil_connect(void)
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainen i_fatal("net_connect_unix(anvil) failed: %m");
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen if (write(fd, ANVIL_HANDSHAKE, strlen(ANVIL_HANDSHAKE)) < 0)
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainenstatic void main_preinit(void)
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen unsigned int max_fds;
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen /* Initialize SSL proxy so it can read certificate and private
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen /* set the number of fds we want to use. it may get increased or
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen decreased. leave a couple of extra fds for auth sockets and such.
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen normal connections each use one fd, but SSL connections use two */
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen global_login_settings->login_max_connections*2;
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen io_loop_set_max_fd_count(current_ioloop, max_fds);
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen i_assert(strcmp(global_login_settings->ssl, "no") == 0 ||
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen if (global_login_settings->mail_max_userip_connections > 0)
e3e5ca6aec3efe6ef7419f411d934a5350f06df9Timo Sirainenstatic void main_init(void)
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen /* make sure we can't fork() */
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen if (restrict_access_get_current_chroot() == NULL) {
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen auth_client = auth_client_new((unsigned int)getpid());
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen auth_client_set_connect_notify(auth_client, auth_connect_notify, NULL);
b9f564d00b7a115f465ffd6840341c7b8f9bfc8aTimo Sirainenstatic void main_deinit(void)
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen //FIXME:is_inetd = getenv("DOVECOT_MASTER") == NULL;
90e39174d397567c101dbf694761371af3682928Timo Sirainen service = master_service_init(login_process_name,
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen master_service_init_log(service, t_strconcat(login_process_name, ": ",
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen getopt_str = t_strconcat("DS", master_service_getopt_string(), NULL);
e8762c2b4914db7997fa9eb644a91586952d1876Timo Sirainen while ((c = getopt(argc, argv, getopt_str)) > 0) {
if (is_inetd) {
main_preinit();
main_init();
main_deinit();