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