main.c revision 861f53be0cc2fa5665f3c107a7576e2a53bb2eb0
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2010 Dovecot authors, see the included COPYING file */
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen#include "lib.h"
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen#include "ioloop.h"
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen#include "array.h"
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen#include "restrict-access.h"
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen#include "master-interface.h"
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen#include "master-service.h"
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen#include "master-service-settings.h"
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen#include "auth-connection.h"
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen#include "doveadm-connection.h"
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen#include "login-connection.h"
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen#include "notify-connection.h"
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen#include "director.h"
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen#include "director-host.h"
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen#include "director-connection.h"
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen#include "director-request.h"
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen#include "mail-host.h"
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen#include <stdio.h>
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen#include <unistd.h>
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen#define AUTH_SOCKET_PATH "auth-login"
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen#define AUTH_USERDB_SOCKET_PATH "auth-userdb"
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainenstatic struct director *director;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainenstatic struct notify_connection *notify_conn;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainenstatic char *auth_socket_path, *userdb_socket_path;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainenstatic int director_client_connected(int fd, const struct ip_addr *ip)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen{
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 return -1;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen }
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen director_connection_init_in(director, fd, ip);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen return 0;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen}
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainenstatic void client_connected(struct master_service_connection *conn)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen{
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen struct auth_connection *auth;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen const char *path, *name, *socket_path;
d28179fd78550a58be44dcb1e3e830ab7d33172dTimo Sirainen struct ip_addr ip;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen unsigned int port, len;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen bool userdb;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen if (conn->fifo) {
62c05ba0290a0bf9c2b0ab4ce117f9a736907c21Timo Sirainen if (notify_conn != NULL) {
62c05ba0290a0bf9c2b0ab4ce117f9a736907c21Timo Sirainen i_error("Received another proxy-notify connection");
62c05ba0290a0bf9c2b0ab4ce117f9a736907c21Timo Sirainen return;
62c05ba0290a0bf9c2b0ab4ce117f9a736907c21Timo Sirainen }
62c05ba0290a0bf9c2b0ab4ce117f9a736907c21Timo Sirainen master_service_client_connection_accept(conn);
62c05ba0290a0bf9c2b0ab4ce117f9a736907c21Timo Sirainen notify_conn = notify_connection_init(director, conn->fd);
62c05ba0290a0bf9c2b0ab4ce117f9a736907c21Timo Sirainen return;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen }
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen if (net_getpeername(conn->fd, &ip, &port) == 0 &&
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen (IPADDR_IS_V4(&ip) || IPADDR_IS_V6(&ip))) {
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 } else {
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen if (director_client_connected(conn->fd, &ip) == 0)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen master_service_client_connection_accept(conn);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen }
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen return;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen }
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen if (net_getunixname(conn->listen_fd, &path) < 0)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen i_fatal("getunixname(%d) failed: %m", conn->listen_fd);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen name = strrchr(path, '/');
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen if (name == NULL)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen name = path;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen else
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen name++;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen len = strlen(name);
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 return;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen }
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
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 auth = auth_connection_init(socket_path);
0928812e725cd3a4debab2a93d0c9b0436a4de9fTimo Sirainen if (auth_connection_connect(auth) == 0) {
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen master_service_client_connection_accept(conn);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen login_connection_init(director, conn->fd, auth, userdb);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen } else {
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen auth_connection_deinit(&auth);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen }
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen}
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainenstatic unsigned int find_inet_listener_port(struct ip_addr *ip_r)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen{
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen unsigned int i, socket_count, port;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen socket_count = master_service_get_socket_count(master_service);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen for (i = 0; i < socket_count; i++) {
3858a7a5da361c35f1e6e50c8e3214dc0cf379d6Phil Carmody int fd = MASTER_LISTEN_FD_FIRST + i;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen if (net_getsockname(fd, ip_r, &port) == 0 && port > 0)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen return port;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen }
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen return 0;
62c05ba0290a0bf9c2b0ab4ce117f9a736907c21Timo Sirainen}
62c05ba0290a0bf9c2b0ab4ce117f9a736907c21Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainenstatic void director_state_changed(struct director *dir)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen{
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen struct director_request *const *requestp;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen bool ret;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen if (!dir->ring_synced ||
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen mail_host_get_by_hash(dir->mail_hosts, 0) == NULL)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen return;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen /* if there are any pending client requests, finish them now */
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen array_foreach(&dir->pending_requests, requestp) {
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen ret = director_request_continue(*requestp);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen i_assert(ret);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen }
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen array_clear(&dir->pending_requests);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen if (dir->to_request != NULL)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen timeout_remove(&dir->to_request);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen}
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainenstatic void main_init(void)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen{
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen const struct director_settings *set;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen struct ip_addr listen_ip;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen unsigned int listen_port;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen set = master_service_settings_get_others(master_service)[0];
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen auth_socket_path = i_strconcat(set->base_dir,
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen "/"AUTH_SOCKET_PATH, NULL);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen userdb_socket_path = i_strconcat(set->base_dir,
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen "/"AUTH_USERDB_SOCKET_PATH, NULL);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
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 }
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen director = director_init(set, &listen_ip, listen_port,
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen director_state_changed);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen director_host_add_from_string(director, set->director_servers);
62c05ba0290a0bf9c2b0ab4ce117f9a736907c21Timo Sirainen if (mail_hosts_parse_and_add(director->mail_hosts,
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen set->director_mail_servers) < 0)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen i_fatal("Invalid value for director_mail_servers setting");
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen director->orig_config_hosts = mail_hosts_dup(director->mail_hosts);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen}
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainenstatic void main_deinit(void)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen{
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen if (notify_conn != NULL)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen notify_connection_deinit(&notify_conn);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen director_deinit(&director);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen doveadm_connections_deinit();
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen login_connections_deinit();
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen auth_connections_deinit();
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen i_free(auth_socket_path);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen i_free(userdb_socket_path);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen}
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainenint main(int argc, char *argv[])
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen{
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen const struct setting_parser_info *set_roots[] = {
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen &director_setting_parser_info,
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen NULL
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen };
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen unsigned int test_port = 0;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen const char *error;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen bool debug = FALSE;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen int c;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen master_service = master_service_init("director",
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen MASTER_SERVICE_FLAG_NO_IDLE_DIE,
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen &argc, &argv, "Dt:");
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen while ((c = master_getopt(master_service)) > 0) {
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen switch (c) {
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen case 'D':
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen debug = TRUE;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen break;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen case 't':
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen if (str_to_uint(optarg, &test_port) < 0)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen i_fatal("-t: Not a number: %s", optarg);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen break;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen default:
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen return FATAL_DEFAULT;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen }
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen }
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen if (master_service_settings_read_simple(master_service, set_roots,
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen &error) < 0)
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen i_fatal("Error reading configuration: %s", error);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen master_service_init_log(master_service, "director: ");
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen restrict_access_by_env(NULL, FALSE);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen restrict_access_allow_coredumps(TRUE);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen master_service_init_finish(master_service);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen main_init();
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen director->test_port = test_port;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen director->debug = debug;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen director_connect(director);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen if (director->test_port != 0) {
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen /* we're testing, possibly writing to same log file.
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen make it clear which director we are. */
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen master_service_init_log(master_service,
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen t_strdup_printf("director(%s): ",
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen net_ip2addr(&director->self_ip)));
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen }
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen master_service_run(master_service, client_connected);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen main_deinit();
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen master_service_deinit(&master_service);
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen return 0;
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen}
12983e9d3b4ebdfb1e14f197c153304b3af44b59Timo Sirainen