1 /* Copyright (c) 2011-2018 Dovecot authors, see the included COPYING file */
2 
3 #include "lib.h"
4 #include "module-dir.h"
5 #include "restrict-access.h"
6 #include "master-service.h"
7 #include "master-service-settings.h"
8 #include "global-memory.h"
9 #include "stats-settings.h"
10 #include "fifo-input-connection.h"
11 #include "mail-command.h"
12 #include "mail-session.h"
13 #include "mail-user.h"
14 #include "mail-domain.h"
15 #include "mail-ip.h"
16 #include "mail-stats.h"
17 #include "client.h"
18 
19 static struct module *modules = NULL;
20 
client_connected(struct master_service_connection * conn)21 static void client_connected(struct master_service_connection *conn)
22 {
23 	if (conn->fifo)
24 		(void)fifo_input_connection_create(conn->fd);
25 	else
26 		(void)client_create(conn->fd);
27 	master_service_client_connection_accept(conn);
28 }
29 
main_preinit(void)30 static void main_preinit(void)
31 {
32 	struct module_dir_load_settings mod_set;
33 
34 	i_zero(&mod_set);
35 	mod_set.abi_version = DOVECOT_ABI_VERSION;
36 	mod_set.require_init_funcs = TRUE;
37 
38 	modules = module_dir_load(STATS_MODULE_DIR, NULL, &mod_set);
39 	module_dir_init(modules);
40 
41 	restrict_access_by_env(RESTRICT_ACCESS_FLAG_ALLOW_ROOT, NULL);
42 	restrict_access_allow_coredumps(TRUE);
43 }
44 
main(int argc,char * argv[])45 int main(int argc, char *argv[])
46 {
47 	const struct setting_parser_info *set_roots[] = {
48 		&old_stats_setting_parser_info,
49 		NULL
50 	};
51 	const enum master_service_flags service_flags =
52 		MASTER_SERVICE_FLAG_DONT_SEND_STATS |
53 		MASTER_SERVICE_FLAG_NO_IDLE_DIE |
54 		MASTER_SERVICE_FLAG_UPDATE_PROCTITLE;
55 	const char *error;
56 	void **sets;
57 
58 	master_service = master_service_init("stats", service_flags,
59 					     &argc, &argv, "");
60 	if (master_getopt(master_service) > 0)
61 		return FATAL_DEFAULT;
62 	if (master_service_settings_read_simple(master_service, set_roots,
63 						&error) < 0)
64 		i_fatal("Error reading configuration: %s", error);
65 	master_service_init_log(master_service);
66 
67 	main_preinit();
68 
69 	sets = master_service_settings_get_others(master_service);
70 	stats_settings = sets[0];
71 
72 	mail_commands_init();
73 	mail_sessions_init();
74 	mail_users_init();
75 	mail_domains_init();
76 	mail_ips_init();
77 	mail_global_init();
78 
79 	master_service_init_finish(master_service);
80 	master_service_run(master_service, client_connected);
81 
82 	clients_destroy_all();
83 	fifo_input_connections_destroy_all();
84 	mail_commands_deinit();
85 	mail_sessions_deinit();
86 	mail_users_deinit();
87 	mail_domains_deinit();
88 	mail_ips_deinit();
89 	mail_global_deinit();
90 
91 	module_dir_unload(&modules);
92 	i_assert(global_used_memory == 0);
93 	master_service_deinit(&master_service);
94         return 0;
95 }
96