Mercurial > dovecot > core-2.2
annotate src/master/master-client.c @ 23017:c1d36f2575c7 default tip
lib-imap: Fix "Don't accept strings with NULs" cherry-pick
author | Timo Sirainen <timo.sirainen@open-xchange.com> |
---|---|
date | Thu, 29 Aug 2019 09:55:25 +0300 |
parents | cb108f786fb4 |
children |
rev | line source |
---|---|
22713
cb108f786fb4
Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
1 /* Copyright (c) 2016-2018 Dovecot authors, see the included COPYING file */ |
20452
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
2 |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
3 #include "common.h" |
20925
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
4 #include "array.h" |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
5 #include "str.h" |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
6 #include "strescape.h" |
20452
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
7 #include "ostream.h" |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
8 #include "connection.h" |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
9 #include "service.h" |
20926
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
10 #include "service-process.h" |
20452
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
11 #include "service-monitor.h" |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
12 #include "master-client.h" |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
13 |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
14 struct master_client { |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
15 struct connection conn; |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
16 }; |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
17 |
20925
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
18 static void |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
19 master_client_service_status_output(string_t *str, |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
20 const struct service *service) |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
21 { |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
22 str_append_tabescaped(str, service->set->name); |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
23 str_printfa(str, "\t%u\t%u\t%u\t%u\t%u\t%ld\t%u\t%ld\t%c\t%c\n", |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
24 service->process_count, service->process_avail, |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
25 service->process_limit, service->client_limit, |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
26 service->to_throttle == NULL ? 0 : service->throttle_secs, |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
27 (long)service->exit_failure_last, |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
28 service->exit_failures_in_sec, |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
29 (long)service->last_drop_warning, |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
30 service->listen_pending ? 'y' : 'n', |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
31 service->listening ? 'y' : 'n'); |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
32 } |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
33 |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
34 static int |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
35 master_client_service_status(struct master_client *client) |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
36 { |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
37 struct service *const *servicep; |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
38 string_t *str = t_str_new(128); |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
39 |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
40 array_foreach(&services->services, servicep) { |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
41 str_truncate(str, 0); |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
42 master_client_service_status_output(str, *servicep); |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
43 o_stream_nsend(client->conn.output, str_data(str), str_len(str)); |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
44 } |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
45 o_stream_nsend_str(client->conn.output, "\n"); |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
46 return 1; |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
47 } |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
48 |
20926
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
49 static void |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
50 master_client_process_output(string_t *str, |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
51 const struct service_process *process) |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
52 { |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
53 str_append_tabescaped(str, process->service->set->name); |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
54 str_printfa(str, "\t%ld\t%u\t%u\t%ld\t%ld\t%ld\n", |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
55 (long)process->pid, process->available_count, |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
56 process->total_count, (long)process->idle_start, |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
57 (long)process->last_status_update, |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
58 (long)process->last_kill_sent); |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
59 } |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
60 |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
61 static int |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
62 master_client_process_status(struct master_client *client, |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
63 const char *const *args) |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
64 { |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
65 struct service *const *servicep; |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
66 struct service_process *p; |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
67 string_t *str = t_str_new(128); |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
68 |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
69 array_foreach(&services->services, servicep) { |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
70 if (args[0] != NULL && !str_array_find(args, (*servicep)->set->name)) |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
71 continue; |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
72 for (p = (*servicep)->processes; p != NULL; p = p->next) { |
21329
a6116b23e7e9
master: PROCESS-STATUS output was duplicated many times
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20926
diff
changeset
|
73 str_truncate(str, 0); |
20926
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
74 master_client_process_output(str, p); |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
75 o_stream_nsend(client->conn.output, |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
76 str_data(str), str_len(str)); |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
77 } |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
78 } |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
79 o_stream_nsend_str(client->conn.output, "\n"); |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
80 return 1; |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
81 } |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
82 |
20452
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
83 static int |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
84 master_client_stop(struct master_client *client, const char *const *args) |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
85 { |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
86 struct service *service; |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
87 const char *reply = "+\n"; |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
88 |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
89 for (unsigned int i = 0; args[i] != NULL; i++) { |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
90 service = service_lookup(services, args[i]); |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
91 if (service == NULL) |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
92 reply = t_strdup_printf("-Unknown service: %s\n", args[i]); |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
93 else |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
94 service_monitor_stop_close(service); |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
95 } |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
96 o_stream_send_str(client->conn.output, reply); |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
97 return 1; |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
98 } |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
99 |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
100 static int |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
101 master_client_input_args(struct connection *conn, const char *const *args) |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
102 { |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
103 struct master_client *client = (struct master_client *)conn; |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
104 const char *cmd = args[0]; |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
105 |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
106 if (cmd == NULL) { |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
107 i_error("%s: Empty command", conn->name); |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
108 return 0; |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
109 } |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
110 args++; |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
111 |
20925
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
112 if (strcmp(cmd, "SERVICE-STATUS") == 0) |
15bbfd3098d6
Added "doveadm service status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20452
diff
changeset
|
113 return master_client_service_status(client); |
20926
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
114 if (strcmp(cmd, "PROCESS-STATUS") == 0) |
6c00a8320574
Added "doveadm process status"
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
20925
diff
changeset
|
115 return master_client_process_status(client, args); |
20452
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
116 if (strcmp(cmd, "STOP") == 0) |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
117 return master_client_stop(client, args); |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
118 i_error("%s: Unknown command: %s", conn->name, cmd); |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
119 return -1; |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
120 } |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
121 |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
122 static void master_client_destroy(struct connection *conn) |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
123 { |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
124 struct master_client *client = (struct master_client *)conn; |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
125 |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
126 connection_deinit(conn); |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
127 i_free(client); |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
128 } |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
129 |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
130 static const struct connection_settings master_conn_set = { |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
131 .service_name_in = "master-client", |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
132 .service_name_out = "master-server", |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
133 .major_version = 1, |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
134 .minor_version = 0, |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
135 |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
136 .input_max_size = 1024, |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
137 .output_max_size = 1024, |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
138 .client = FALSE |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
139 }; |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
140 |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
141 static const struct connection_vfuncs master_conn_vfuncs = { |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
142 .destroy = master_client_destroy, |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
143 .input_args = master_client_input_args |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
144 }; |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
145 |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
146 static struct connection_list *master_connections; |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
147 |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
148 void master_client_connected(struct service_list *service_list) |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
149 { |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
150 struct master_client *client; |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
151 int fd; |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
152 |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
153 fd = net_accept(service_list->master_fd, NULL, NULL); |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
154 if (fd < 0) { |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
155 if (fd == -2) |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
156 i_error("net_accept() failed: %m"); |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
157 return; |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
158 } |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
159 client = i_new(struct master_client, 1); |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
160 connection_init_server(master_connections, &client->conn, |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
161 "master-client", fd, fd); |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
162 } |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
163 |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
164 void master_clients_init(void) |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
165 { |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
166 master_connections = connection_list_init(&master_conn_set, |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
167 &master_conn_vfuncs); |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
168 } |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
169 |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
170 void master_clients_deinit(void) |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
171 { |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
172 connection_list_deinit(&master_connections); |
9d3e4542c309
master: Allow stopping specific services via master socket.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
diff
changeset
|
173 } |