Mercurial > dovecot > core-2.2
annotate src/lib-master/ipc-server.c @ 20739:607dad4f8c4c
lib-master: Fixed memory leak when IPC server is handling commands.
This mainly meant that when login processes responded to doveadm proxy
list/kick commands memory was leaked.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Sat, 10 Sep 2016 11:16:05 +0300 |
parents | 0f22db71df7a |
children | 2e2563132d5f |
rev | line source |
---|---|
19552
0f22db71df7a
global: freshen copyright
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19391
diff
changeset
|
1 /* Copyright (c) 2011-2016 Dovecot authors, see the included COPYING file */ |
13040
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "ioloop.h" |
15187
02451e967a06
Renamed network.[ch] to net.[ch].
Timo Sirainen <tss@iki.fi>
parents:
14681
diff
changeset
|
5 #include "net.h" |
13040
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "istream.h" |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "ostream.h" |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "hostpid.h" |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 #include "master-service.h" |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 #include "ipc-server.h" |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 #include <unistd.h> |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 #define IPC_SERVER_RECONNECT_MSECS (60*1000) |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 #define IPC_SERVER_PROTOCOL_MAJOR_VERSION 1 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 #define IPC_SERVER_PROTOCOL_MINOR_VERSION 0 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 #define IPC_SERVER_HANDSHAKE "VERSION\tipc-server\t1\t0\nHANDSHAKE\t%s\t%s\n" |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 struct ipc_cmd { |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 struct ipc_server *server; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 unsigned int tag; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 }; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 struct ipc_server { |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 char *name, *path; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 ipc_command_callback_t *callback; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 int ipc_cmd_refcount; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 int fd; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 struct io *io; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 struct timeout *to; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 struct istream *input; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 struct ostream *output; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 unsigned int version_received:1; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 }; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 static void ipc_server_disconnect(struct ipc_server *server); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 static void ipc_server_input_line(struct ipc_server *server, char *line) |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 { |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 struct ipc_cmd *cmd; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 unsigned int tag = 0; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 char *p; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 /* tag cmd */ |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 p = strchr(line, '\t'); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 if (p != NULL) { |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 *p++ = '\0'; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 if (str_to_uint(line, &tag) < 0) |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 p = NULL; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 } |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 if (p == NULL || *p == '\0') { |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 i_error("IPC proxy sent invalid input: %s", line); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 return; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 } |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 cmd = i_new(struct ipc_cmd, 1); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 cmd->server = server; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 cmd->tag = tag; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 server->ipc_cmd_refcount++; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 T_BEGIN { |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 server->callback(cmd, p); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 } T_END; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 } |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 static void ipc_server_input(struct ipc_server *server) |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 { |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 char *line; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 if (i_stream_read(server->input) < 0) { |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 ipc_server_disconnect(server); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 return; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 } |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 if (!server->version_received) { |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 if ((line = i_stream_next_line(server->input)) == NULL) |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 return; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 if (!version_string_verify(line, "ipc-proxy", |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 IPC_SERVER_PROTOCOL_MAJOR_VERSION)) { |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 i_error("IPC proxy not compatible with this server " |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 "(mixed old and new binaries?)"); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 ipc_server_disconnect(server); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 return; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 } |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 server->version_received = TRUE; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 } |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 while ((line = i_stream_next_line(server->input)) != NULL) |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 ipc_server_input_line(server, line); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 } |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 static void ipc_server_connect(struct ipc_server *server) |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 { |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 i_assert(server->fd == -1); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 if (server->to != NULL) |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 timeout_remove(&server->to); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 server->fd = net_connect_unix(server->path); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 if (server->fd == -1) { |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 i_error("connect(%s) failed: %m", server->path); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 server->to = timeout_add(IPC_SERVER_RECONNECT_MSECS, |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 ipc_server_connect, server); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 return; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 } |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 server->io = io_add(server->fd, IO_READ, ipc_server_input, server); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 server->input = i_stream_create_fd(server->fd, (size_t)-1, FALSE); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 server->output = o_stream_create_fd(server->fd, (size_t)-1, FALSE); |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
114 o_stream_set_no_error_handling(server->output, TRUE); |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
115 o_stream_nsend_str(server->output, |
13040
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 t_strdup_printf(IPC_SERVER_HANDSHAKE, server->name, my_pid)); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 o_stream_cork(server->output); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 } |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 static void ipc_server_disconnect(struct ipc_server *server) |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 { |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 if (server->fd == -1) |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 return; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 io_remove(&server->io); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 i_stream_destroy(&server->input); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 o_stream_destroy(&server->output); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 if (close(server->fd) < 0) |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 i_error("close(%s) failed: %m", server->path); |
13175
b9b9d0711780
ipc client: Fixed crashing on ipc server disconnection.
Timo Sirainen <tss@iki.fi>
parents:
13040
diff
changeset
|
130 server->fd = -1; |
13040
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 } |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 struct ipc_server * |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 ipc_server_init(const char *ipc_socket_path, const char *name, |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 ipc_command_callback_t *callback) |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 { |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 struct ipc_server *server; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 server = i_new(struct ipc_server, 1); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 server->name = i_strdup(name); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 server->path = i_strdup(ipc_socket_path); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 server->callback = callback; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 server->fd = -1; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 ipc_server_connect(server); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 return server; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 } |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 void ipc_server_deinit(struct ipc_server **_server) |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 { |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 struct ipc_server *server = *_server; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 *_server = NULL; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 i_assert(server->ipc_cmd_refcount == 0); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 ipc_server_disconnect(server); |
19391
f78c312bc5a9
lib-master: Fixed timeout leak at deinit when we couldn't connect to ipc-server
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
157 if (server->to != NULL) |
f78c312bc5a9
lib-master: Fixed timeout leak at deinit when we couldn't connect to ipc-server
Timo Sirainen <tss@iki.fi>
parents:
18137
diff
changeset
|
158 timeout_remove(&server->to); |
13040
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 i_free(server->name); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 i_free(server->path); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 i_free(server); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 } |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 void ipc_cmd_send(struct ipc_cmd *cmd, const char *data) |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 { |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
166 o_stream_nsend_str(cmd->server->output, |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
167 t_strdup_printf("%u\t:%s\n", cmd->tag, data)); |
13040
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 } |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 static void ipc_cmd_finish(struct ipc_cmd *cmd, const char *line) |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 { |
14681
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
172 o_stream_nsend_str(cmd->server->output, |
ca37d1577291
Added o_stream_nsend*() and related functions to make delayed error handling safer.
Timo Sirainen <tss@iki.fi>
parents:
14629
diff
changeset
|
173 t_strdup_printf("%u\t%s\n", cmd->tag, line)); |
13040
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 o_stream_uncork(cmd->server->output); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 i_assert(cmd->server->ipc_cmd_refcount > 0); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 cmd->server->ipc_cmd_refcount--; |
20739
607dad4f8c4c
lib-master: Fixed memory leak when IPC server is handling commands.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
178 i_free(cmd); |
13040
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 } |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 void ipc_cmd_success(struct ipc_cmd **_cmd) |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 { |
14629
c93ca5e46a8a
Marked functions parameters that are allowed to be NULL. Some APIs were also changed.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
183 ipc_cmd_success_reply(_cmd, ""); |
13040
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 } |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 void ipc_cmd_success_reply(struct ipc_cmd **_cmd, const char *data) |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 { |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 struct ipc_cmd *cmd = *_cmd; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 *_cmd = NULL; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 ipc_cmd_finish(cmd, t_strconcat("+", data, NULL)); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 } |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 void ipc_cmd_fail(struct ipc_cmd **_cmd, const char *errormsg) |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 { |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 struct ipc_cmd *cmd = *_cmd; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 i_assert(errormsg != NULL); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 *_cmd = NULL; |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 ipc_cmd_finish(cmd, t_strconcat("-", errormsg, NULL)); |
bf5c8ee58e5e
Added support for a simplified IPC infrastructure.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 } |