main.c revision e34d170f8f0e084bd94bfbc1a7085ece67e508df
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2010-2012 Dovecot authors, see the included COPYING file */
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen#include "lib.h"
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen#include "ioloop.h"
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen#include "array.h"
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen#include "restrict-access.h"
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen#include "master-interface.h"
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen#include "master-service.h"
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen#include "master-service-settings.h"
1f696b6f364516a2d79f946ca88149bafdc9d5adTimo Sirainen#include "auth-connection.h"
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen#include "doveadm-connection.h"
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen#include "login-connection.h"
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen#include "notify-connection.h"
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen#include "director.h"
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen#include "director-host.h"
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen#include "director-connection.h"
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen#include "director-request.h"
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen#include "mail-host.h"
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen#include <stdio.h>
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen#include <unistd.h>
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen#define AUTH_SOCKET_PATH "auth-login"
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen#define AUTH_USERDB_SOCKET_PATH "auth-userdb"
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainenstatic struct director *director;
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainenstatic struct notify_connection *notify_conn;
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainenstatic int director_client_connected(int fd, const struct ip_addr *ip)
b367011da1a2ba3e9113dfbc601aaa4b6b04317dTimo Sirainen{
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen struct director_host *host;
b367011da1a2ba3e9113dfbc601aaa4b6b04317dTimo Sirainen
3281669db44d09a087a203201248abbc81b3cc1aTimo Sirainen host = director_host_lookup_ip(director, ip);
f89eb8f2cda0bd6d40a9f96db1c92517f0593871Martti Rannanjärvi if (host == NULL || host->removed) {
f89eb8f2cda0bd6d40a9f96db1c92517f0593871Martti Rannanjärvi i_warning("Connection from %s: Server not listed in "
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen "director_servers, dropping", net_ip2addr(ip));
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen return -1;
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen }
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen (void)director_connection_init_in(director, fd, ip);
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen return 0;
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen}
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainenstatic void client_connected(struct master_service_connection *conn)
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen{
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen struct auth_connection *auth;
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen const char *socket_path;
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen struct ip_addr ip;
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen unsigned int local_port, len;
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen bool userdb;
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen if (conn->fifo) {
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen if (notify_conn != NULL) {
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen i_error("Received another proxy-notify connection");
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen return;
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen }
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen master_service_client_connection_accept(conn);
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen notify_conn = notify_connection_init(director, conn->fd);
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen return;
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen }
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen if (net_getpeername(conn->fd, &ip, NULL) == 0 &&
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen net_getsockname(conn->fd, NULL, &local_port) == 0 &&
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen (IPADDR_IS_V4(&ip) || IPADDR_IS_V6(&ip))) {
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 } else {
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen if (director_client_connected(conn->fd, &ip) == 0)
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen master_service_client_connection_accept(conn);
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen }
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen return;
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen }
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen len = strlen(conn->name);
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 return;
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen }
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen
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;
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen auth = auth_connection_init(socket_path);
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen if (auth_connection_connect(auth) == 0) {
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen master_service_client_connection_accept(conn);
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen (void)login_connection_init(director, conn->fd, auth, userdb);
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen } else {
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen auth_connection_deinit(&auth);
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen }
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen}
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainenstatic unsigned int
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainenfind_inet_listener_port(struct ip_addr *ip_r,
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen const struct director_settings *set)
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen{
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen unsigned int i, socket_count, port;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen socket_count = master_service_get_socket_count(master_service);
4c05697a4f3958c836e23e1eff5b4b7c49ef6617Timo Sirainen for (i = 0; i < socket_count; i++) {
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen int fd = MASTER_LISTEN_FD_FIRST + i;
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen
4c05697a4f3958c836e23e1eff5b4b7c49ef6617Timo Sirainen if (net_getsockname(fd, ip_r, &port) == 0 && port > 0 &&
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen port != set->director_doveadm_port)
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen return port;
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen }
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen return 0;
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen}
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainenstatic void director_state_changed(struct director *dir)
fe91058fafc4da453161aecde6f2d48a8fae4a96Timo Sirainen{
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen struct director_request *const *requestp;
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen ARRAY_DEFINE(new_requests, struct director_request *);
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen bool ret;
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen if (!dir->ring_synced ||
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen mail_host_get_by_hash(dir->mail_hosts, 0) == NULL)
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen return;
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen /* if there are any pending client requests, finish them now */
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen t_array_init(&new_requests, 8);
d1ba8ecbb936ace90179d2292952546708d68f71Timo Sirainen array_foreach(&dir->pending_requests, requestp) {
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen ret = director_request_continue(*requestp);
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen if (!ret) {
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen /* a) request for a user being killed
76d4ff1c1b31a1a09f6cbfe613a8d0efe62cbfd2Timo Sirainen b) user is weak */
640c1f9731a2e0368546bf675110ced42a589a04Timo Sirainen array_append(&new_requests, requestp, 1);
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen }
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen }
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen array_clear(&dir->pending_requests);
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen array_append_array(&dir->pending_requests, &new_requests);
204ee6ed414f5e4eeb6f6c10763b55daf56f11acJosef 'Jeff' Sipek
6307d76096764e66bddc63d4a3e5a1aa19cc528fJosef 'Jeff' Sipek if (dir->to_request != NULL)
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen timeout_remove(&dir->to_request);
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen}
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainenstatic void main_preinit(void)
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen{
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen const struct director_settings *set;
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen struct ip_addr listen_ip;
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen unsigned int listen_port;
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen set = master_service_settings_get_others(master_service)[0];
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen
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 }
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen director = director_init(set, &listen_ip, listen_port,
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen director_state_changed);
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen director_host_add_from_string(director, set->director_servers);
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen director_find_self(director);
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen if (mail_hosts_parse_and_add(director->mail_hosts,
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen set->director_mail_servers) < 0)
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen i_fatal("Invalid value for director_mail_servers setting");
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen director->orig_config_hosts = mail_hosts_dup(director->mail_hosts);
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen
7c925149e49f7cce41c90d562ff3835b66ddca29Timo Sirainen restrict_access_by_env(NULL, FALSE);
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen restrict_access_allow_coredumps(TRUE);
009217abb57a24a4076092e8e4e165545747839eStephan Bosch}
009217abb57a24a4076092e8e4e165545747839eStephan Bosch
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainenstatic void main_deinit(void)
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen{
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen if (notify_conn != NULL)
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen notify_connection_deinit(&notify_conn);
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen director_deinit(&director);
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen doveadm_connections_deinit();
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen login_connections_deinit();
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen auth_connections_deinit();
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen}
7c925149e49f7cce41c90d562ff3835b66ddca29Timo Sirainen
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainenint main(int argc, char *argv[])
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen{
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen const struct setting_parser_info *set_roots[] = {
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen &director_setting_parser_info,
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen NULL
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen };
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen const enum master_service_flags service_flags =
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen MASTER_SERVICE_FLAG_NO_IDLE_DIE |
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen MASTER_SERVICE_FLAG_UPDATE_PROCTITLE;
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen unsigned int test_port = 0;
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen const char *error;
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen bool debug = FALSE;
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen int c;
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen master_service = master_service_init("director", service_flags,
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen &argc, &argv, "Dt:");
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen while ((c = master_getopt(master_service)) > 0) {
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen switch (c) {
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen case 'D':
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen debug = TRUE;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen break;
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen case 't':
f8e6e85ab508e80a66f323390f8f4e2edfff2730Timo Sirainen if (str_to_uint(optarg, &test_port) < 0)
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen i_fatal("-t: Not a number: %s", optarg);
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen break;
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen default:
f9b6b5e9c4e18682321959883c888035a56b6be9Timo Sirainen return FATAL_DEFAULT;
f8e6e85ab508e80a66f323390f8f4e2edfff2730Timo Sirainen }
f8e6e85ab508e80a66f323390f8f4e2edfff2730Timo Sirainen }
f8e6e85ab508e80a66f323390f8f4e2edfff2730Timo Sirainen if (master_service_settings_read_simple(master_service, set_roots,
f8e6e85ab508e80a66f323390f8f4e2edfff2730Timo Sirainen &error) < 0)
f8e6e85ab508e80a66f323390f8f4e2edfff2730Timo Sirainen i_fatal("Error reading configuration: %s", error);
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen
b1f37113a5760bee842c5a7678bb5fa6f5bd8b60Timo Sirainen master_service_init_log(master_service, "director: ");
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen main_preinit();
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen master_service_init_finish(master_service);
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen director->test_port = test_port;
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen director->debug = debug;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen director_connect(director);
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen if (director->test_port != 0) {
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen /* we're testing, possibly writing to same log file.
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen make it clear which director we are. */
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen master_service_init_log(master_service,
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen t_strdup_printf("director(%s): ",
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen net_ip2addr(&director->self_ip)));
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen }
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen master_service_run(master_service, client_connected);
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen main_deinit();
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen master_service_deinit(&master_service);
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen return 0;
be6ad6e46ecb8c7126b421819046e7f4857a2babTimo Sirainen}
f1ed4fa248aaf6841ba638b9d66b2738d9f7aa18Timo Sirainen