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