1 /* Copyright (c) 2013-2018 Dovecot authors, see the included COPYING file */
2 
3 #include "lib.h"
4 #include "restrict-access.h"
5 #include "master-service.h"
6 #include "master-service-settings.h"
7 #include "aggregator-settings.h"
8 #include "notify-connection.h"
9 #include "replicator-connection.h"
10 
11 struct replicator_connection *replicator;
12 
client_connected(struct master_service_connection * conn)13 static void client_connected(struct master_service_connection *conn)
14 {
15 	master_service_client_connection_accept(conn);
16 	notify_connection_create(conn->fd, conn->fifo);
17 }
18 
main_preinit(void)19 static void main_preinit(void)
20 {
21 	struct ip_addr *ips;
22 	unsigned int ips_count;
23 	const struct aggregator_settings *set;
24 	void **sets;
25 	int ret;
26 
27 	sets = master_service_settings_get_others(master_service);
28 	set = sets[0];
29 
30 	if (set->replicator_port != 0) {
31 		ret = net_gethostbyname(set->replicator_host, &ips, &ips_count);
32 		if (ret != 0) {
33 			i_fatal("replicator_host: gethostbyname(%s) failed: %s",
34 				set->replicator_host, net_gethosterror(ret));
35 		}
36 		replicator = replicator_connection_create_inet(ips, ips_count,
37 				set->replicator_port,
38 				notify_connection_sync_callback);
39 	} else {
40 		replicator = replicator_connection_create_unix(set->replicator_host,
41 				notify_connection_sync_callback);
42 	}
43 }
44 
main(int argc,char * argv[])45 int main(int argc, char *argv[])
46 {
47 	const struct setting_parser_info *set_roots[] = {
48 		&aggregator_setting_parser_info,
49 		NULL
50 	};
51 	const char *error;
52 
53 	master_service = master_service_init("aggregator", 0, &argc, &argv, "");
54 	if (master_getopt(master_service) > 0)
55 		return FATAL_DEFAULT;
56 
57 	if (master_service_settings_read_simple(master_service, set_roots,
58 						&error) < 0)
59 		i_fatal("Error reading configuration: %s", error);
60 	master_service_init_log(master_service);
61 
62 	main_preinit();
63 
64 	restrict_access_by_env(RESTRICT_ACCESS_FLAG_ALLOW_ROOT, NULL);
65 	restrict_access_allow_coredumps(TRUE);
66 	master_service_init_finish(master_service);
67 
68 	master_service_run(master_service, client_connected);
69 
70 	notify_connections_destroy_all();
71 	replicator_connection_destroy(&replicator);
72 	master_service_deinit(&master_service);
73         return 0;
74 }
75