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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }