main.c revision 861f53be0cc2fa5665f3c107a7576e2a53bb2eb0
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainenstatic char *auth_socket_path, *userdb_socket_path;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainenstatic int director_client_connected(int fd, const struct ip_addr *ip)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen if (director_host_lookup_ip(director, ip) == NULL) {
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen i_warning("Connection from %s: Server not listed in "
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen "director_servers, dropping", net_ip2addr(ip));
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen director_connection_init_in(director, fd, ip);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainenstatic void client_connected(struct master_service_connection *conn)
62c05ba0290a0bf9c2b0ab4ce117f9a736907c21Timo Sirainen i_error("Received another proxy-notify connection");
62c05ba0290a0bf9c2b0ab4ce117f9a736907c21Timo Sirainen master_service_client_connection_accept(conn);
62c05ba0290a0bf9c2b0ab4ce117f9a736907c21Timo Sirainen notify_conn = notify_connection_init(director, conn->fd);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen if (net_getpeername(conn->fd, &ip, &port) == 0 &&
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen /* TCP/IP connection */
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen if (port == director->set->director_doveadm_port) {
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen master_service_client_connection_accept(conn);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen (void)doveadm_connection_init(director, conn->fd);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen if (director_client_connected(conn->fd, &ip) == 0)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen master_service_client_connection_accept(conn);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen if (net_getunixname(conn->listen_fd, &path) < 0)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen i_fatal("getunixname(%d) failed: %m", conn->listen_fd);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen if (len > 6 && strcmp(name + len - 6, "-admin") == 0) {
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen /* doveadm connection */
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen master_service_client_connection_accept(conn);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen (void)doveadm_connection_init(director, conn->fd);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen /* a) userdb connection, probably for lmtp proxy
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen b) login connection
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen Both of them are handled exactly the same, except for which
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen auth socket they connect to. */
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen userdb = len > 7 && strcmp(name + len - 7, "-userdb") == 0;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen socket_path = userdb ? userdb_socket_path : auth_socket_path;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen master_service_client_connection_accept(conn);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen login_connection_init(director, conn->fd, auth, userdb);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainenstatic unsigned int find_inet_listener_port(struct ip_addr *ip_r)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen socket_count = master_service_get_socket_count(master_service);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen for (i = 0; i < socket_count; i++) {
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen if (net_getsockname(fd, ip_r, &port) == 0 && port > 0)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainenstatic void director_state_changed(struct director *dir)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen mail_host_get_by_hash(dir->mail_hosts, 0) == NULL)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen /* if there are any pending client requests, finish them now */
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen array_foreach(&dir->pending_requests, requestp) {
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainenstatic void main_init(void)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen set = master_service_settings_get_others(master_service)[0];
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen userdb_socket_path = i_strconcat(set->base_dir,
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen listen_port = find_inet_listener_port(&listen_ip);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen if (listen_port == 0 && *set->director_servers != '\0') {
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen i_fatal("No inet_listeners defined for director service "
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen "(for standalone keep director_servers empty)");
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen director = director_init(set, &listen_ip, listen_port,
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen director_host_add_from_string(director, set->director_servers);
62c05ba0290a0bf9c2b0ab4ce117f9a736907c21Timo Sirainen if (mail_hosts_parse_and_add(director->mail_hosts,
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen i_fatal("Invalid value for director_mail_servers setting");
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen director->orig_config_hosts = mail_hosts_dup(director->mail_hosts);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainenstatic void main_deinit(void)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen const struct setting_parser_info *set_roots[] = {
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen unsigned int test_port = 0;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen master_service = master_service_init("director",
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen while ((c = master_getopt(master_service)) > 0) {
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen if (master_service_settings_read_simple(master_service, set_roots,
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen i_fatal("Error reading configuration: %s", error);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen master_service_init_log(master_service, "director: ");
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen /* we're testing, possibly writing to same log file.
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen make it clear which director we are. */