main.c revision e34d170f8f0e084bd94bfbc1a7085ece67e508df
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2010-2012 Dovecot authors, see the included COPYING file */
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainenstatic int director_client_connected(int fd, const struct ip_addr *ip)
f89eb8f2cda0bd6d40a9f96db1c92517f0593871Martti Rannanjärvi i_warning("Connection from %s: Server not listed in "
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen "director_servers, dropping", net_ip2addr(ip));
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen (void)director_connection_init_in(director, fd, ip);
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainenstatic void client_connected(struct master_service_connection *conn)
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen i_error("Received another proxy-notify connection");
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen master_service_client_connection_accept(conn);
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen notify_conn = notify_connection_init(director, conn->fd);
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen if (net_getpeername(conn->fd, &ip, NULL) == 0 &&
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen net_getsockname(conn->fd, NULL, &local_port) == 0 &&
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen /* TCP/IP connection */
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen if (local_port == director->set->director_doveadm_port) {
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen master_service_client_connection_accept(conn);
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen (void)doveadm_connection_init(director, conn->fd);
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen if (director_client_connected(conn->fd, &ip) == 0)
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen master_service_client_connection_accept(conn);
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen if (len > 6 && strcmp(conn->name + len - 6, "-admin") == 0) {
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen /* doveadm connection */
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen master_service_client_connection_accept(conn);
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen (void)doveadm_connection_init(director, conn->fd);
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen /* a) userdb connection, probably for lmtp proxy
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen b) login connection
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen Both of them are handled exactly the same, except for which
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen auth socket they connect to. */
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen userdb = len > 7 && strcmp(conn->name + len - 7, "-userdb") == 0;
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen socket_path = userdb ? AUTH_USERDB_SOCKET_PATH : AUTH_SOCKET_PATH;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen master_service_client_connection_accept(conn);
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen (void)login_connection_init(director, conn->fd, auth, userdb);
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainenstatic unsigned int
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen socket_count = master_service_get_socket_count(master_service);
4c05697a4f3958c836e23e1eff5b4b7c49ef6617Timo Sirainen for (i = 0; i < socket_count; i++) {
4c05697a4f3958c836e23e1eff5b4b7c49ef6617Timo Sirainen if (net_getsockname(fd, ip_r, &port) == 0 && port > 0 &&
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainenstatic void director_state_changed(struct director *dir)
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen ARRAY_DEFINE(new_requests, struct director_request *);
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen mail_host_get_by_hash(dir->mail_hosts, 0) == NULL)
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen /* if there are any pending client requests, finish them now */
d1ba8ecbb936ace90179d2292952546708d68f71Timo Sirainen array_foreach(&dir->pending_requests, requestp) {
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen /* a) request for a user being killed
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen b) user is weak */
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen array_append_array(&dir->pending_requests, &new_requests);
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainenstatic void main_preinit(void)
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen set = master_service_settings_get_others(master_service)[0];
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen listen_port = find_inet_listener_port(&listen_ip, set);
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen if (listen_port == 0 && *set->director_servers != '\0') {
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen i_fatal("No inet_listeners defined for director service "
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen "(for standalone keep director_servers empty)");
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen director = director_init(set, &listen_ip, listen_port,
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen director_host_add_from_string(director, set->director_servers);
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen if (mail_hosts_parse_and_add(director->mail_hosts,
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen i_fatal("Invalid value for director_mail_servers setting");
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen director->orig_config_hosts = mail_hosts_dup(director->mail_hosts);
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainenstatic void main_deinit(void)
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen const struct setting_parser_info *set_roots[] = {
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen const enum master_service_flags service_flags =
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen unsigned int test_port = 0;
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen master_service = master_service_init("director", service_flags,
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen while ((c = master_getopt(master_service)) > 0) {
f8e6e85ab508e80a66f323390f8f4e2edfff2730Timo Sirainen if (master_service_settings_read_simple(master_service, set_roots,
f8e6e85ab508e80a66f323390f8f4e2edfff2730Timo Sirainen i_fatal("Error reading configuration: %s", error);
b1f37113a5760bee842c5a7678bb5fa6f5bd8b60Timo Sirainen master_service_init_log(master_service, "director: ");
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen /* we're testing, possibly writing to same log file.
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen make it clear which director we are. */