main.c revision edd318d5866ac3fbc6e8df28fb24a4dfef93c884
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic int director_client_connected(int fd, const struct ip_addr *ip)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (director_host_lookup_ip(director, ip) == NULL) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen i_warning("Connection from %s: Server not listed in "
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "director_servers, dropping", net_ip2addr(ip));
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic void client_connected(const struct master_service_connection *conn)
300e4e43ed1ca46d0614459161ca2fb460ef661aTimo Sirainen i_error("Received another proxy-notify connection");
300e4e43ed1ca46d0614459161ca2fb460ef661aTimo Sirainen notify_conn = notify_connection_init(director, conn->fd);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (net_getpeername(conn->fd, &ip, &port) == 0 &&
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* TCP/IP connection - this is another director */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (director_client_connected(conn->fd, &ip) < 0)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (net_getunixname(conn->listen_fd, &path) < 0)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen i_fatal("getsockname(%d) failed: %m", conn->listen_fd);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (len > 6 && strcmp(name + len - 6, "-admin") == 0) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* doveadm connection */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen (void)doveadm_connection_init(director, conn->fd);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* login connection */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen auth = auth_connection_init(auth_socket_path);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen login_connection_init(director, conn->fd, auth);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic unsigned int find_inet_listener_port(struct ip_addr *ip_r)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen socket_count = master_service_get_socket_count(master_service);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen for (i = 0; i < socket_count; i++) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (net_getsockname(fd, ip_r, &port) == 0 && port > 0)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic void director_state_changed(struct director *dir)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen array_count(&dir->desynced_host_changes) != 0 ||
cf9d67e4a9bfee31cf3be05244555d51a3d1b9feTimo Sirainen mail_host_get_by_hash(dir->mail_hosts, 0) == NULL)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen /* if there are any pending client requests, finish them now */
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen array_foreach(&dir->pending_requests, requestp) {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic void main_init(void)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen set = master_service_settings_get_others(master_service)[0];
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen listen_port = find_inet_listener_port(&listen_ip);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (listen_port == 0 && *set->director_servers != '\0') {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen i_fatal("No inet_listeners defined for director service "
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen "(for standalone keep director_servers empty)");
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen director = director_init(set, &listen_ip, listen_port,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen director_host_add_from_string(director, set->director_servers);
cf9d67e4a9bfee31cf3be05244555d51a3d1b9feTimo Sirainen if (mail_hosts_parse_and_add(director->mail_hosts,
cf9d67e4a9bfee31cf3be05244555d51a3d1b9feTimo Sirainen i_fatal("Invalid value for director_mail_servers setting");
edd318d5866ac3fbc6e8df28fb24a4dfef93c884Timo Sirainen director->orig_config_hosts = mail_hosts_dup(director->mail_hosts);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainenstatic void main_deinit(void)
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen const struct setting_parser_info *set_roots[] = {
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen master_service = master_service_init("director", 0, &argc, &argv, NULL);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen if (master_service_settings_read_simple(master_service, set_roots,
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen i_fatal("Error reading configuration: %s", error);
2670cd577aa57eb9f915a4f4220ae48c9b4fc5fbTimo Sirainen master_service_init_log(master_service, "director: ");