Mercurial > dovecot > core-2.2
annotate src/lmtp/main.c @ 11388:b8d3c96e61a7 HEAD
lib-master API changed to avoid accidentally leaking client connections.
This change also fixes many such leaks.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 27 May 2010 12:16:36 +0100 |
parents | 70cfc89a3936 |
children | 7fef89fea00e |
rev | line source |
---|---|
10582
615eef3139c2
Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents:
10498
diff
changeset
|
1 /* Copyright (c) 2002-2010 Dovecot authors, see the included COPYING file */ |
9121
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "array.h" |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "ioloop.h" |
10257 | 6 #include "hostpid.h" |
10825
cc3f6adc1e0b
lmtp proxy: Added support for DNS lookups.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
7 #include "abspath.h" |
9121
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "restrict-access.h" |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "fd-close-on-exec.h" |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include "master-service.h" |
10039
ddcc3391adf9
lmtp: Added lmtp_proxy setting (it's no longer hardcoded to yes).
Timo Sirainen <tss@iki.fi>
parents:
9832
diff
changeset
|
11 #include "master-service-settings.h" |
9350
7df8fddbc7a5
Fixed LMTP server to actualy work.
Timo Sirainen <tss@iki.fi>
parents:
9348
diff
changeset
|
12 #include "master-interface.h" |
9121
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 #include "mail-storage-service.h" |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #include "lda-settings.h" |
10039
ddcc3391adf9
lmtp: Added lmtp_proxy setting (it's no longer hardcoded to yes).
Timo Sirainen <tss@iki.fi>
parents:
9832
diff
changeset
|
15 #include "lmtp-settings.h" |
9121
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 #include "client.h" |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 #include "main.h" |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 #include <stdlib.h> |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 #include <unistd.h> |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 |
10825
cc3f6adc1e0b
lmtp proxy: Added support for DNS lookups.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
22 #define DNS_CLIENT_SOCKET_PATH "dns-client" |
9121
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 #define LMTP_MASTER_FIRST_LISTEN_FD 3 |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 #define IS_STANDALONE() \ |
9350
7df8fddbc7a5
Fixed LMTP server to actualy work.
Timo Sirainen <tss@iki.fi>
parents:
9348
diff
changeset
|
26 (getenv(MASTER_UID_ENV) == NULL) |
9121
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 |
10825
cc3f6adc1e0b
lmtp proxy: Added support for DNS lookups.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
28 const char *dns_client_socket_path; |
10130
d1384c2b08e5
Merged single and multi mail_storage_service_*() functions.
Timo Sirainen <tss@iki.fi>
parents:
10127
diff
changeset
|
29 struct mail_storage_service_ctx *storage_service; |
9121
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 |
11388
b8d3c96e61a7
lib-master API changed to avoid accidentally leaking client connections.
Timo Sirainen <tss@iki.fi>
parents:
11282
diff
changeset
|
31 static void client_connected(struct master_service_connection *conn) |
9121
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 { |
11388
b8d3c96e61a7
lib-master API changed to avoid accidentally leaking client connections.
Timo Sirainen <tss@iki.fi>
parents:
11282
diff
changeset
|
33 master_service_client_connection_accept(conn); |
10134
545bdb7670d2
lib-storage: Changed APIs to fix reading settings for multiple users.
Timo Sirainen <tss@iki.fi>
parents:
10130
diff
changeset
|
34 (void)client_create(conn->fd, conn->fd, conn); |
9121
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 } |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 |
11282
70cfc89a3936
lmtp: Set user/group at startup as specified in service block.
Timo Sirainen <tss@iki.fi>
parents:
10825
diff
changeset
|
37 static void drop_privileges(void) |
70cfc89a3936
lmtp: Set user/group at startup as specified in service block.
Timo Sirainen <tss@iki.fi>
parents:
10825
diff
changeset
|
38 { |
70cfc89a3936
lmtp: Set user/group at startup as specified in service block.
Timo Sirainen <tss@iki.fi>
parents:
10825
diff
changeset
|
39 struct restrict_access_settings set; |
70cfc89a3936
lmtp: Set user/group at startup as specified in service block.
Timo Sirainen <tss@iki.fi>
parents:
10825
diff
changeset
|
40 const char *error; |
70cfc89a3936
lmtp: Set user/group at startup as specified in service block.
Timo Sirainen <tss@iki.fi>
parents:
10825
diff
changeset
|
41 |
70cfc89a3936
lmtp: Set user/group at startup as specified in service block.
Timo Sirainen <tss@iki.fi>
parents:
10825
diff
changeset
|
42 /* by default we don't drop any privileges, but keep running as root. */ |
70cfc89a3936
lmtp: Set user/group at startup as specified in service block.
Timo Sirainen <tss@iki.fi>
parents:
10825
diff
changeset
|
43 restrict_access_get_env(&set); |
70cfc89a3936
lmtp: Set user/group at startup as specified in service block.
Timo Sirainen <tss@iki.fi>
parents:
10825
diff
changeset
|
44 if (set.uid != 0) { |
70cfc89a3936
lmtp: Set user/group at startup as specified in service block.
Timo Sirainen <tss@iki.fi>
parents:
10825
diff
changeset
|
45 /* open config connection before dropping privileges */ |
70cfc89a3936
lmtp: Set user/group at startup as specified in service block.
Timo Sirainen <tss@iki.fi>
parents:
10825
diff
changeset
|
46 (void)master_service_settings_read_simple(master_service, |
70cfc89a3936
lmtp: Set user/group at startup as specified in service block.
Timo Sirainen <tss@iki.fi>
parents:
10825
diff
changeset
|
47 NULL, &error); |
70cfc89a3936
lmtp: Set user/group at startup as specified in service block.
Timo Sirainen <tss@iki.fi>
parents:
10825
diff
changeset
|
48 } |
70cfc89a3936
lmtp: Set user/group at startup as specified in service block.
Timo Sirainen <tss@iki.fi>
parents:
10825
diff
changeset
|
49 restrict_access_by_env(NULL, FALSE); |
70cfc89a3936
lmtp: Set user/group at startup as specified in service block.
Timo Sirainen <tss@iki.fi>
parents:
10825
diff
changeset
|
50 } |
70cfc89a3936
lmtp: Set user/group at startup as specified in service block.
Timo Sirainen <tss@iki.fi>
parents:
10825
diff
changeset
|
51 |
9121
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 static void main_init(void) |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 { |
10134
545bdb7670d2
lib-storage: Changed APIs to fix reading settings for multiple users.
Timo Sirainen <tss@iki.fi>
parents:
10130
diff
changeset
|
54 struct master_service_connection conn; |
545bdb7670d2
lib-storage: Changed APIs to fix reading settings for multiple users.
Timo Sirainen <tss@iki.fi>
parents:
10130
diff
changeset
|
55 |
545bdb7670d2
lib-storage: Changed APIs to fix reading settings for multiple users.
Timo Sirainen <tss@iki.fi>
parents:
10130
diff
changeset
|
56 if (IS_STANDALONE()) { |
545bdb7670d2
lib-storage: Changed APIs to fix reading settings for multiple users.
Timo Sirainen <tss@iki.fi>
parents:
10130
diff
changeset
|
57 memset(&conn, 0, sizeof(conn)); |
545bdb7670d2
lib-storage: Changed APIs to fix reading settings for multiple users.
Timo Sirainen <tss@iki.fi>
parents:
10130
diff
changeset
|
58 (void)client_create(STDIN_FILENO, STDOUT_FILENO, &conn); |
545bdb7670d2
lib-storage: Changed APIs to fix reading settings for multiple users.
Timo Sirainen <tss@iki.fi>
parents:
10130
diff
changeset
|
59 } |
10825
cc3f6adc1e0b
lmtp proxy: Added support for DNS lookups.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
60 dns_client_socket_path = t_abspath(DNS_CLIENT_SOCKET_PATH); |
9121
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 } |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 static void main_deinit(void) |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 { |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 clients_destroy(); |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 } |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 |
10120
b584904d3bc7
Moved process title init to lib-master. With Linux-hack enabled it now preserves command args.
Timo Sirainen <tss@iki.fi>
parents:
10119
diff
changeset
|
68 int main(int argc, char *argv[]) |
9121
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 { |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 const struct setting_parser_info *set_roots[] = { |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 &lda_setting_parser_info, |
10039
ddcc3391adf9
lmtp: Added lmtp_proxy setting (it's no longer hardcoded to yes).
Timo Sirainen <tss@iki.fi>
parents:
9832
diff
changeset
|
72 &lmtp_setting_parser_info, |
9121
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 NULL |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 }; |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 enum master_service_flags service_flags = 0; |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 enum mail_storage_service_flags storage_service_flags = |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 MAIL_STORAGE_SERVICE_FLAG_DISALLOW_ROOT | |
10134
545bdb7670d2
lib-storage: Changed APIs to fix reading settings for multiple users.
Timo Sirainen <tss@iki.fi>
parents:
10130
diff
changeset
|
78 MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP | |
10257 | 79 MAIL_STORAGE_SERVICE_FLAG_TEMP_PRIV_DROP | |
10498
569206178c09
mail storage service: Some flag enums were missing FLAG_ in the middle.
Timo Sirainen <tss@iki.fi>
parents:
10497
diff
changeset
|
80 MAIL_STORAGE_SERVICE_FLAG_NO_LOG_INIT | |
10497
3907cc4ecc4b
Idle-disconnecting auth master connections is now optional. LMTP no longer does it.
Timo Sirainen <tss@iki.fi>
parents:
10364
diff
changeset
|
81 MAIL_STORAGE_SERVICE_FLAG_NO_IDLE_TIMEOUT; |
10364
4183f16e6f60
lmtp: If -D parameter is given, enable core dumps.
Timo Sirainen <tss@iki.fi>
parents:
10259
diff
changeset
|
82 int c; |
9121
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 |
9159
6324a79d3ee1
Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents:
9121
diff
changeset
|
84 if (IS_STANDALONE()) { |
6324a79d3ee1
Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents:
9121
diff
changeset
|
85 service_flags |= MASTER_SERVICE_FLAG_STANDALONE | |
6324a79d3ee1
Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents:
9121
diff
changeset
|
86 MASTER_SERVICE_FLAG_STD_CLIENT; |
10259
e0db66c8b9a9
lmtp: Keep connection to config process open.
Timo Sirainen <tss@iki.fi>
parents:
10257
diff
changeset
|
87 } else { |
e0db66c8b9a9
lmtp: Keep connection to config process open.
Timo Sirainen <tss@iki.fi>
parents:
10257
diff
changeset
|
88 service_flags |= MASTER_SERVICE_FLAG_KEEP_CONFIG_OPEN; |
9159
6324a79d3ee1
Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents:
9121
diff
changeset
|
89 } |
9121
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 |
10119
1e63221f5c83
Moved most of getopt() handling to lib-master.
Timo Sirainen <tss@iki.fi>
parents:
10039
diff
changeset
|
91 master_service = master_service_init("lmtp", service_flags, |
10364
4183f16e6f60
lmtp: If -D parameter is given, enable core dumps.
Timo Sirainen <tss@iki.fi>
parents:
10259
diff
changeset
|
92 &argc, &argv, "D"); |
4183f16e6f60
lmtp: If -D parameter is given, enable core dumps.
Timo Sirainen <tss@iki.fi>
parents:
10259
diff
changeset
|
93 while ((c = master_getopt(master_service)) > 0) { |
4183f16e6f60
lmtp: If -D parameter is given, enable core dumps.
Timo Sirainen <tss@iki.fi>
parents:
10259
diff
changeset
|
94 switch (c) { |
4183f16e6f60
lmtp: If -D parameter is given, enable core dumps.
Timo Sirainen <tss@iki.fi>
parents:
10259
diff
changeset
|
95 case 'D': |
4183f16e6f60
lmtp: If -D parameter is given, enable core dumps.
Timo Sirainen <tss@iki.fi>
parents:
10259
diff
changeset
|
96 storage_service_flags |= |
4183f16e6f60
lmtp: If -D parameter is given, enable core dumps.
Timo Sirainen <tss@iki.fi>
parents:
10259
diff
changeset
|
97 MAIL_STORAGE_SERVICE_FLAG_ENABLE_CORE_DUMPS; |
4183f16e6f60
lmtp: If -D parameter is given, enable core dumps.
Timo Sirainen <tss@iki.fi>
parents:
10259
diff
changeset
|
98 break; |
4183f16e6f60
lmtp: If -D parameter is given, enable core dumps.
Timo Sirainen <tss@iki.fi>
parents:
10259
diff
changeset
|
99 default: |
4183f16e6f60
lmtp: If -D parameter is given, enable core dumps.
Timo Sirainen <tss@iki.fi>
parents:
10259
diff
changeset
|
100 return FATAL_DEFAULT; |
4183f16e6f60
lmtp: If -D parameter is given, enable core dumps.
Timo Sirainen <tss@iki.fi>
parents:
10259
diff
changeset
|
101 } |
4183f16e6f60
lmtp: If -D parameter is given, enable core dumps.
Timo Sirainen <tss@iki.fi>
parents:
10259
diff
changeset
|
102 } |
11282
70cfc89a3936
lmtp: Set user/group at startup as specified in service block.
Timo Sirainen <tss@iki.fi>
parents:
10825
diff
changeset
|
103 |
70cfc89a3936
lmtp: Set user/group at startup as specified in service block.
Timo Sirainen <tss@iki.fi>
parents:
10825
diff
changeset
|
104 drop_privileges(); |
10127
9c640a1eb8b6
lmtp: Fixed crashing caused by recent API changes.
Timo Sirainen <tss@iki.fi>
parents:
10120
diff
changeset
|
105 master_service_init_finish(master_service); |
10257 | 106 master_service_init_log(master_service, |
107 t_strdup_printf("lmtp(%s): ", my_pid)); | |
9121
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 |
10130
d1384c2b08e5
Merged single and multi mail_storage_service_*() functions.
Timo Sirainen <tss@iki.fi>
parents:
10127
diff
changeset
|
109 storage_service = mail_storage_service_init(master_service, set_roots, |
d1384c2b08e5
Merged single and multi mail_storage_service_*() functions.
Timo Sirainen <tss@iki.fi>
parents:
10127
diff
changeset
|
110 storage_service_flags); |
9121
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 restrict_access_allow_coredumps(TRUE); |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 main_init(); |
9348
0c587f108916
lib-master has now a global master_service variable that all binaries use.
Timo Sirainen <tss@iki.fi>
parents:
9159
diff
changeset
|
114 master_service_run(master_service, client_connected); |
9121
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 main_deinit(); |
10130
d1384c2b08e5
Merged single and multi mail_storage_service_*() functions.
Timo Sirainen <tss@iki.fi>
parents:
10127
diff
changeset
|
117 mail_storage_service_deinit(&storage_service); |
9348
0c587f108916
lib-master has now a global master_service variable that all binaries use.
Timo Sirainen <tss@iki.fi>
parents:
9159
diff
changeset
|
118 master_service_deinit(&master_service); |
9121
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 return 0; |
a957a6be4af5
Initial implementation of LMTP server. Master process doesn't yet execute it though.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 } |