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