annotate src/lib-program-client/program-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 751eb2d43bc7
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) 2002-2018 Dovecot authors, see the included COPYING file
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
2 */
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
3
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
4 #include "lib.h"
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
5 #include "ioloop.h"
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
6 #include "array.h"
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
7 #include "str.h"
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
8 #include "safe-mkstemp.h"
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
9 #include "istream-private.h"
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
10 #include "istream-seekable.h"
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
11 #include "ostream.h"
20901
197c817bb7c1 lib-program-client: Use child-wait
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20900
diff changeset
12 #include "lib-signals.h"
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
13
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
14 #include "program-client-private.h"
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
15
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
16 #include <unistd.h>
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
17
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
18 #define MAX_OUTPUT_BUFFER_SIZE 16384
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
19 #define MAX_OUTPUT_MEMORY_BUFFER (1024*128)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
20
20787
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
21 static
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
22 void program_client_callback(struct program_client *pclient, int result, void *context)
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
23 {
21091
3b3cdcf17e03 lib-program-client: Do not call callback when destroying
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20938
diff changeset
24 /* do not call callback when destroying */
3b3cdcf17e03 lib-program-client: Do not call callback when destroying
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20938
diff changeset
25 if (pclient->destroying) return;
20787
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
26 program_client_callback_t *callback = pclient->callback;
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
27 i_assert(pclient->callback != NULL);
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
28 callback(result, context);
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
29 }
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
30
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
31 static
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
32 int program_client_seekable_fd_callback(const char **path_r, void *context)
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
33 {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
34 struct program_client *pclient = (struct program_client *)context;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
35 string_t *path;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
36 int fd;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
37
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
38 path = t_str_new(128);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
39 str_append(path, pclient->temp_prefix);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
40 fd = safe_mkstemp(path, 0600, (uid_t)-1, (gid_t)-1);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
41 if (fd == -1) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
42 i_error("safe_mkstemp(%s) failed: %m", str_c(path));
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
43 return -1;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
44 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
45
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
46 /* we just want the fd, unlink it */
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
47 if (i_unlink(str_c(path)) < 0) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
48 /* shouldn't happen.. */
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
49 i_close_fd(&fd);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
50 return -1;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
51 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
52
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
53 *path_r = str_c(path);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
54 return fd;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
55 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
56
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
57 static
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
58 void program_client_timeout(struct program_client *pclient)
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
59 {
20902
ff8afcb96349 lib-program-client: Use milliseconds in idle timeout
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20901
diff changeset
60 i_error("program `%s' execution timed out (> %u msecs)",
ff8afcb96349 lib-program-client: Use milliseconds in idle timeout
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20901
diff changeset
61 pclient->path, pclient->set.input_idle_timeout_msecs);
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
62 program_client_fail(pclient, PROGRAM_CLIENT_ERROR_RUN_TIMEOUT);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
63 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
64
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
65 static
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
66 void program_client_connect_timeout(struct program_client *pclient)
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
67 {
20902
ff8afcb96349 lib-program-client: Use milliseconds in idle timeout
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20901
diff changeset
68 i_error("program `%s' socket connection timed out (> %u msecs)",
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
69 pclient->path, pclient->set.client_connect_timeout_msecs);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
70 program_client_fail(pclient, PROGRAM_CLIENT_ERROR_CONNECT_TIMEOUT);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
71 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
72
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
73 static
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
74 int program_client_connect(struct program_client *pclient)
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
75 {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
76 if (pclient->set.client_connect_timeout_msecs != 0) {
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
77 pclient->to = timeout_add(pclient->set.client_connect_timeout_msecs,
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
78 program_client_connect_timeout, pclient);
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
79 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
80
21366
f7f4cb784890 lib-program-client: Do not call program_client_fail twice
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 21091
diff changeset
81 return pclient->connect(pclient);
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
82 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
83
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
84 static
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
85 int program_client_close_output(struct program_client *pclient)
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
86 {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
87 int ret;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
88
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
89 if (pclient->program_output != NULL)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
90 o_stream_destroy(&pclient->program_output);
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
91 if ((ret = pclient->close_output(pclient)) < 0)
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
92 return -1;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
93 pclient->program_output = NULL;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
94
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
95 return ret;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
96 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
97
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
98 static
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
99 void program_client_disconnect_extra_fds(struct program_client *pclient)
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
100 {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
101 struct program_client_extra_fd *efds;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
102 unsigned int i, count;
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
103
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
104 if (!array_is_created(&pclient->extra_fds))
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
105 return;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
106
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
107 efds = array_get_modifiable(&pclient->extra_fds, &count);
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
108 for(i = 0; i < count; i++) {
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
109 if (efds[i].input != NULL)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
110 i_stream_unref(&efds[i].input);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
111 if (efds[i].io != NULL)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
112 io_remove(&efds[i].io);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
113 if (efds[i].parent_fd != -1 && close(efds[i].parent_fd) < 0)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
114 i_error("close(fd=%d) failed: %m", efds[i].parent_fd);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
115 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
116 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
117
20900
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
118 void program_client_disconnected(struct program_client *pclient)
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
119 {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
120 if (pclient->program_input != NULL) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
121 if (pclient->output_seekable)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
122 i_stream_unref(&pclient->program_input);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
123 else
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
124 i_stream_destroy(&pclient->program_input);
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
125 }
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
126 if (pclient->program_output != NULL)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
127 o_stream_destroy(&pclient->program_output);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
128
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
129 if (pclient->io != NULL)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
130 io_remove(&pclient->io);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
131
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
132 if (pclient->fd_in != -1 && close(pclient->fd_in) < 0)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
133 i_error("close(%s) failed: %m", pclient->path);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
134 if (pclient->fd_out != -1 && pclient->fd_out != pclient->fd_in
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
135 && close(pclient->fd_out) < 0)
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
136 i_error("close(%s/out) failed: %m", pclient->path);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
137 pclient->fd_in = pclient->fd_out = -1;
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
138
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
139 pclient->disconnected = TRUE;
20900
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
140
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
141 if (pclient->other_error && pclient->error == PROGRAM_CLIENT_ERROR_NONE) {
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
142 pclient->error = PROGRAM_CLIENT_ERROR_OTHER;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
143 }
20787
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
144
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
145 program_client_callback(pclient,
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
146 pclient->error != PROGRAM_CLIENT_ERROR_NONE ?
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
147 -1 :
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
148 pclient->exit_code,
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
149 pclient->context);
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
150 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
151
20900
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
152 static
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
153 void program_client_disconnect(struct program_client *pclient, bool force)
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
154 {
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
155 int ret;
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
156
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
157 if (pclient->disconnected)
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
158 return;
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
159 pclient->disconnected = TRUE;
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
160
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
161 if (pclient->to != NULL)
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
162 timeout_remove(&pclient->to);
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
163 if (pclient->io != NULL)
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
164 io_remove(&pclient->io);
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
165
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
166 if ((ret = program_client_close_output(pclient)) < 0)
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
167 pclient->other_error = TRUE;
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
168
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
169 program_client_disconnect_extra_fds(pclient);
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
170
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
171 pclient->disconnect(pclient, force);
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
172 }
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
173
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
174 void program_client_fail(struct program_client *pclient, enum program_client_error error)
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
175 {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
176 if (pclient->error != PROGRAM_CLIENT_ERROR_NONE)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
177 return;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
178
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
179 pclient->error = error;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
180 program_client_disconnect(pclient, TRUE);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
181 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
182
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
183 static
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
184 bool program_client_input_pending(struct program_client *pclient)
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
185 {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
186 struct program_client_extra_fd *efds = NULL;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
187 unsigned int count, i;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
188
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
189 if (pclient->program_input != NULL &&
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
190 !pclient->program_input->closed &&
22783
751eb2d43bc7 lib-program-client: Use reliable means of checking for input stream EOF.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 22713
diff changeset
191 i_stream_have_bytes_left(pclient->program_input)) {
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
192 return TRUE;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
193 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
194
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
195 if (array_is_created(&pclient->extra_fds)) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
196 efds = array_get_modifiable(&pclient->extra_fds, &count);
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
197 for(i = 0; i < count; i++) {
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
198 if (efds[i].input != NULL &&
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
199 !efds[i].input->closed &&
22783
751eb2d43bc7 lib-program-client: Use reliable means of checking for input stream EOF.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 22713
diff changeset
200 i_stream_have_bytes_left(efds[i].input)) {
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
201 return TRUE;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
202 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
203 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
204 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
205
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
206 return FALSE;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
207 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
208
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
209 static
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
210 int program_client_program_output(struct program_client *pclient)
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
211 {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
212 struct istream *input = pclient->input;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
213 struct ostream *output = pclient->program_output;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
214 const unsigned char *data;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
215 size_t size;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
216 int ret = 0;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
217
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
218 if ((ret = o_stream_flush(output)) <= 0) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
219 if (ret < 0) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
220 i_error("write(%s) failed: %s",
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
221 o_stream_get_name(output),
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
222 o_stream_get_error(output));
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
223 program_client_fail(pclient, PROGRAM_CLIENT_ERROR_IO);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
224 }
20900
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
225
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
226 return ret;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
227 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
228
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
229 if (input != NULL && output != NULL) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
230 do {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
231 while ((data=i_stream_get_data(input, &size)) != NULL) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
232 ssize_t sent;
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
233
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
234 if ((sent=o_stream_send(output, data, size)) < 0) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
235 i_error("write(%s) failed: %s",
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
236 o_stream_get_name(output),
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
237 o_stream_get_error(output));
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
238 program_client_fail(pclient, PROGRAM_CLIENT_ERROR_IO);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
239 return -1;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
240 }
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
241
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
242 if (sent == 0)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
243 return 0;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
244 i_stream_skip(input, sent);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
245 }
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
246 } while ((ret = i_stream_read(input)) > 0);
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
247
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
248 if (ret == 0)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
249 return 1;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
250
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
251 if (ret < 0) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
252 if (input->stream_errno != 0) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
253 i_error("read(%s) failed: %s",
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
254 i_stream_get_name(input),
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
255 i_stream_get_error(input));
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
256 program_client_fail(pclient, PROGRAM_CLIENT_ERROR_IO);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
257 return -1;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
258 } else if (!i_stream_have_bytes_left(input)) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
259 i_stream_unref(&pclient->input);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
260 input = NULL;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
261
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
262 if ((ret = o_stream_flush(output)) <= 0) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
263 if (ret < 0) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
264 i_error("write(%s) failed: %s",
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
265 o_stream_get_name(output),
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
266 o_stream_get_error(output));
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
267 program_client_fail(pclient, PROGRAM_CLIENT_ERROR_IO);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
268 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
269 return ret;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
270 }
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
271 }
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
272 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
273 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
274
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
275 if (input == NULL) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
276 if (!program_client_input_pending(pclient)) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
277 program_client_disconnect(pclient, FALSE);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
278 } else if (program_client_close_output(pclient) < 0) {
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
279 program_client_fail(pclient,
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
280 PROGRAM_CLIENT_ERROR_OTHER);
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
281 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
282 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
283 return 1;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
284 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
285
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
286 void program_client_program_input(struct program_client *pclient)
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
287 {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
288 struct istream *input = pclient->program_input;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
289 struct ostream *output = pclient->output;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
290 const unsigned char *data;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
291 size_t size;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
292 int ret = 0;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
293
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
294 if (pclient->output_seekable && pclient->seekable_output == NULL) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
295 struct istream *input_list[2] = { input, NULL };
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
296
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
297 input = i_stream_create_seekable(input_list, MAX_OUTPUT_MEMORY_BUFFER,
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
298 program_client_seekable_fd_callback,
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
299 pclient);
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
300 i_stream_unref(&pclient->program_input);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
301 pclient->program_input = input;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
302
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
303 pclient->seekable_output = input;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
304 i_stream_ref(pclient->seekable_output);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
305 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
306
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
307 if (input != NULL) {
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
308 while ((ret = i_stream_read_data(input, &data, &size, 0)) > 0) {
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
309 if (output != NULL) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
310 ssize_t sent;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
311
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
312 if ((sent=o_stream_send(output, data, size)) < 0) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
313 i_error("write(%s) failed: %s",
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
314 o_stream_get_name(output),
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
315 o_stream_get_error(output));
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
316 program_client_fail(pclient, PROGRAM_CLIENT_ERROR_IO);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
317 return;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
318 }
20789
07251700afa2 lib-program-client: Avoid busy-looping while waiting for ostream to have space.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20787
diff changeset
319 if (sent == 0)
07251700afa2 lib-program-client: Avoid busy-looping while waiting for ostream to have space.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20787
diff changeset
320 return;
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
321 size = (size_t)sent;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
322 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
323
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
324 i_stream_skip(input, size);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
325 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
326
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
327 if (ret < 0) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
328 if (input->stream_errno != 0) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
329 i_error("read(%s) failed: %s",
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
330 i_stream_get_name(input),
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
331 i_stream_get_error(input));
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
332 program_client_fail(pclient, PROGRAM_CLIENT_ERROR_IO);
21369
2d7cb49b3c8d lib-program-client: Fix crash after disconnecting client.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21366
diff changeset
333 return;
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
334 } else {
21369
2d7cb49b3c8d lib-program-client: Fix crash after disconnecting client.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21366
diff changeset
335 if (!program_client_input_pending(pclient)) {
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
336 program_client_disconnect(pclient, FALSE);
21369
2d7cb49b3c8d lib-program-client: Fix crash after disconnecting client.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21366
diff changeset
337 return;
2d7cb49b3c8d lib-program-client: Fix crash after disconnecting client.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21366
diff changeset
338 }
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
339 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
340 }
20900
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
341 if (program_client_input_pending(pclient))
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
342 return;
20908
31b7aa09db9d lib-program-client: Fix memory access problem
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20903
diff changeset
343 if (pclient->program_input != NULL && !input->eof) {
20900
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
344 program_client_fail(pclient,
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
345 PROGRAM_CLIENT_ERROR_IO);
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
346 return;
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
347 }
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
348 }
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
349 program_client_disconnect(pclient, FALSE);
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
350 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
351
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
352 static
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
353 void program_client_extra_fd_input(struct program_client_extra_fd *efd)
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
354 {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
355 struct program_client *pclient = efd->pclient;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
356
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
357 i_assert(efd->callback != NULL);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
358 efd->callback(efd->context, efd->input);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
359
22783
751eb2d43bc7 lib-program-client: Use reliable means of checking for input stream EOF.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 22713
diff changeset
360 if (efd->input->closed || !i_stream_have_bytes_left(efd->input)) {
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
361 if (!program_client_input_pending(pclient))
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
362 program_client_disconnect(pclient, FALSE);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
363 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
364 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
365
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
366 int program_client_connected(struct program_client *pclient)
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
367 {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
368 int ret = 1;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
369
20902
ff8afcb96349 lib-program-client: Use milliseconds in idle timeout
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20901
diff changeset
370 pclient->start_time = ioloop_timeval;
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
371 if (pclient->to != NULL)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
372 timeout_remove(&pclient->to);
20902
ff8afcb96349 lib-program-client: Use milliseconds in idle timeout
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20901
diff changeset
373 if (pclient->set.input_idle_timeout_msecs != 0) {
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
374 pclient->to =
20902
ff8afcb96349 lib-program-client: Use milliseconds in idle timeout
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20901
diff changeset
375 timeout_add(pclient->set.input_idle_timeout_msecs,
ff8afcb96349 lib-program-client: Use milliseconds in idle timeout
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20901
diff changeset
376 program_client_timeout, pclient);
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
377 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
378
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
379 /* run output */
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
380 if (pclient->program_output != NULL &&
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
381 (ret = program_client_program_output(pclient)) == 0) {
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
382 if (pclient->program_output != NULL) {
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
383 o_stream_set_flush_callback(pclient->program_output,
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
384 program_client_program_output, pclient);
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
385 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
386 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
387
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
388 return ret;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
389 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
390
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
391 void program_client_init(struct program_client *pclient, pool_t pool, const char *path,
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
392 const char *const *args, const struct program_client_settings *set)
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
393 {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
394 pclient->pool = pool;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
395 pclient->path = p_strdup(pool, path);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
396 if (args != NULL)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
397 pclient->args = p_strarray_dup(pool, args);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
398 pclient->set = *set;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
399 pclient->debug = set->debug;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
400 pclient->fd_in = -1;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
401 pclient->fd_out = -1;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
402 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
403
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
404 void program_client_set_input(struct program_client *pclient, struct istream *input)
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
405 {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
406 if (pclient->input != NULL)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
407 i_stream_unref(&pclient->input);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
408 if (input != NULL)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
409 i_stream_ref(input);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
410 pclient->input = input;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
411 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
412
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
413 void program_client_set_output(struct program_client *pclient, struct ostream *output)
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
414 {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
415 if (pclient->output != NULL)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
416 o_stream_unref(&pclient->output);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
417 if (output != NULL)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
418 o_stream_ref(output);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
419 pclient->output = output;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
420 pclient->output_seekable = FALSE;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
421 i_free(pclient->temp_prefix);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
422 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
423
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
424 void program_client_set_output_seekable(struct program_client *pclient, const char *temp_prefix)
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
425 {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
426 if (pclient->output != NULL)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
427 o_stream_unref(&pclient->output);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
428 pclient->temp_prefix = i_strdup(temp_prefix);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
429 pclient->output_seekable = TRUE;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
430 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
431
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
432 struct istream *program_client_get_output_seekable(struct program_client *pclient)
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
433 {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
434 struct istream *input = pclient->seekable_output;
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
435
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
436 pclient->seekable_output = NULL;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
437
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
438 i_stream_seek(input, 0);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
439 return input;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
440 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
441
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
442 #undef program_client_set_extra_fd
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
443 void program_client_set_extra_fd(struct program_client *pclient, int fd,
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
444 program_client_fd_callback_t *callback, void *context)
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
445 {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
446 struct program_client_extra_fd *efds;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
447 struct program_client_extra_fd *efd = NULL;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
448 unsigned int i, count;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
449 i_assert(fd > 1);
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
450
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
451 if (!array_is_created(&pclient->extra_fds))
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
452 p_array_init(&pclient->extra_fds, pclient->pool, 2);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
453
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
454 efds = array_get_modifiable(&pclient->extra_fds, &count);
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
455 for(i = 0; i < count; i++) {
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
456 if (efds[i].child_fd == fd) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
457 efd = &efds[i];
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
458 break;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
459 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
460 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
461
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
462 if (efd == NULL) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
463 efd = array_append_space(&pclient->extra_fds);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
464 efd->pclient = pclient;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
465 efd->child_fd = fd;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
466 efd->parent_fd = -1;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
467 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
468 efd->callback = callback;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
469 efd->context = context;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
470 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
471
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
472 void program_client_set_env(struct program_client *pclient, const char *name, const char *value)
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
473 {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
474 const char *env;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
475
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
476 if (!array_is_created(&pclient->envs))
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
477 p_array_init(&pclient->envs, pclient->pool, 16);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
478
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
479 env = p_strdup_printf(pclient->pool, "%s=%s", name, value);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
480 array_append(&pclient->envs, &env, 1);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
481 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
482
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
483 void program_client_init_streams(struct program_client *pclient)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
484 {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
485 /* Create streams for normal program I/O */
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
486 if (pclient->fd_out >= 0) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
487 pclient->program_output =
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
488 o_stream_create_fd(pclient->fd_out,
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
489 MAX_OUTPUT_BUFFER_SIZE, FALSE);
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
490 o_stream_set_name(pclient->program_output, "program stdin");
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
491 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
492 if (pclient->fd_in >= 0) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
493 struct istream *input;
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
494
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
495 input = i_stream_create_fd(pclient->fd_in, (size_t)-1, FALSE);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
496
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
497 pclient->program_input = input;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
498 i_stream_set_name(pclient->program_input, "program stdout");
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
499
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
500 pclient->io = io_add(pclient->fd_in, IO_READ,
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
501 program_client_program_input, pclient);
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
502 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
503
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
504 /* Create streams for additional output through side-channel fds */
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
505 if (array_is_created(&pclient->extra_fds)) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
506 struct program_client_extra_fd *efds = NULL;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
507 unsigned int count, i;
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
508
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
509 efds = array_get_modifiable(&pclient->extra_fds, &count);
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
510 for(i = 0; i < count; i++) {
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
511 i_assert(efds[i].parent_fd >= 0);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
512 efds[i].input = i_stream_create_fd
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
513 (efds[i].parent_fd, (size_t)-1, FALSE);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
514 i_stream_set_name(efds[i].input,
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
515 t_strdup_printf("program output fd=%d",
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
516 efds[i].child_fd));
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
517 efds[i].io = io_add(efds[i].parent_fd, IO_READ,
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
518 program_client_extra_fd_input, &efds[i]);
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
519 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
520 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
521 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
522
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
523 void program_client_destroy(struct program_client **_pclient)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
524 {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
525 struct program_client *pclient = *_pclient;
21091
3b3cdcf17e03 lib-program-client: Do not call callback when destroying
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20938
diff changeset
526 *_pclient = NULL;
3b3cdcf17e03 lib-program-client: Do not call callback when destroying
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20938
diff changeset
527
3b3cdcf17e03 lib-program-client: Do not call callback when destroying
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20938
diff changeset
528 pclient->destroying = TRUE;
3b3cdcf17e03 lib-program-client: Do not call callback when destroying
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20938
diff changeset
529 pclient->callback = NULL;
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
530
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
531 program_client_disconnect(pclient, TRUE);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
532
20900
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
533 i_assert(pclient->callback == NULL);
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
534
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
535 if (pclient->input != NULL)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
536 i_stream_unref(&pclient->input);
20787
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
537 if (pclient->program_input != NULL)
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
538 i_stream_unref(&pclient->program_input);
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
539 if (pclient->program_output != NULL)
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
540 o_stream_unref(&pclient->program_output);
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
541 if (pclient->output != NULL)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
542 o_stream_unref(&pclient->output);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
543 if (pclient->seekable_output != NULL)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
544 i_stream_unref(&pclient->seekable_output);
20900
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
545
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
546 if (pclient->io != NULL)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
547 io_remove(&pclient->io);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
548 i_free(pclient->temp_prefix);
20900
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
549
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
550 if (pclient->destroy != NULL)
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
551 pclient->destroy(pclient);
61bebf0b543b lib-program-client: Disconnect asynchronously
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20852
diff changeset
552
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
553 pool_unref(&pclient->pool);
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
554 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
555
20787
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
556 void program_client_switch_ioloop(struct program_client *pclient)
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
557 {
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
558 if (pclient->input != NULL)
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
559 i_stream_switch_ioloop(pclient->input);
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
560 if (pclient->program_input != NULL)
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
561 i_stream_switch_ioloop(pclient->program_input);
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
562 if (pclient->seekable_output != NULL)
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
563 i_stream_switch_ioloop(pclient->seekable_output);
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
564 if (pclient->output != NULL)
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
565 o_stream_switch_ioloop(pclient->output);
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
566 if (pclient->program_output != NULL)
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
567 o_stream_switch_ioloop(pclient->program_output);
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
568 if (pclient->to != NULL)
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
569 pclient->to = io_loop_move_timeout(&pclient->to);
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
570 if (pclient->io != NULL)
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
571 pclient->io = io_loop_move_io(&pclient->io);
20903
d9208e0f8b08 lib-program-client: Add switch_ioloop vfunc
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20902
diff changeset
572 pclient->switch_ioloop(pclient);
20787
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
573 }
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
574
20938
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
575 int program_client_create(const char *uri, const char *const *args,
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
576 const struct program_client_settings *set,
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
577 bool noreply, struct program_client **pc_r,
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
578 const char **error_r)
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
579 {
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
580 if (strncmp(uri, "exec:", 5) == 0) {
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
581 *pc_r = program_client_local_create(
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
582 uri+5,
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
583 args,
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
584 set);
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
585 return 0;
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
586 } else if (strncmp(uri, "unix:", 5) == 0) {
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
587 *pc_r = program_client_remote_create(
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
588 uri+5,
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
589 args,
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
590 set, noreply);
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
591 return 0;
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
592 } else {
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
593 *error_r = t_strdup_printf(
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
594 "Unsupported program client scheme '%s'",
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
595 t_strcut(uri, ':'));
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
596 return -1;
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
597 }
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
598 }
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
599
16902941b3da lib-program-client: Add URI based constructor
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20908
diff changeset
600
20787
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
601 static
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
602 void program_client_run_callback(int result, int *context)
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
603 {
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
604 *context = result;
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
605 io_loop_stop(current_ioloop);
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
606 }
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
607
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
608 int program_client_run(struct program_client *pclient)
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
609 {
20852
1c4be30c9e9b lib-program-client: Fixed program_client_run() that succeeds rapidly.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20789
diff changeset
610 int ret = -2;
20787
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
611 struct ioloop *prev_ioloop = current_ioloop;
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
612 struct ioloop *ioloop = io_loop_create();
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
613
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
614 program_client_switch_ioloop(pclient);
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
615
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
616 program_client_run_async(pclient, program_client_run_callback, &ret);
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
617
20852
1c4be30c9e9b lib-program-client: Fixed program_client_run() that succeeds rapidly.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20789
diff changeset
618 if (ret == -2) {
20787
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
619 io_loop_run(ioloop);
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
620 }
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
621
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
622 io_loop_set_current(prev_ioloop);
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
623 program_client_switch_ioloop(pclient);
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
624 io_loop_set_current(ioloop);
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
625 io_loop_destroy(&ioloop);
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
626
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
627 if (pclient->error != PROGRAM_CLIENT_ERROR_NONE)
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
628 return -1;
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
629
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
630 return pclient->exit_code;
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
631 }
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
632
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
633 #undef program_client_run_async
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
634 void program_client_run_async(struct program_client *pclient, program_client_callback_t *callback, void *context)
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
635 {
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
636 int ret;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
637
20787
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
638 i_assert(callback != NULL);
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
639
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
640 pclient->disconnected = FALSE;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
641 pclient->exit_code = 1;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
642 pclient->error = PROGRAM_CLIENT_ERROR_NONE;
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
643
20787
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
644 pclient->callback = callback;
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
645 pclient->context = context;
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
646 if ((ret = program_client_connect(pclient)) >= 0) {
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
647 /* run output */
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
648 if (ret > 0 && pclient->program_output != NULL &&
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
649 (ret = o_stream_flush(pclient->program_output)) == 0) {
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
650 o_stream_set_flush_callback
20786
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
651 (pclient->program_output,
10510f5116ff lib-program-client: Whitespace fix
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20785
diff changeset
652 program_client_program_output, pclient);
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
653 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
654 if (ret < 0) {
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
655 i_error("write(%s) failed: %s",
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
656 o_stream_get_name(pclient->program_output),
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
657 o_stream_get_error(pclient->program_output));
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
658 pclient->error = PROGRAM_CLIENT_ERROR_IO;
20787
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
659 program_client_callback(pclient, ret, context);
11ea2902f99d lib-program-client: Expose asynchronous API
Aki Tuomi <aki.tuomi@dovecot.fi>
parents: 20786
diff changeset
660 return;
20785
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
661 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
662 }
3c8e6a9835d8 lib-program-client: Add program-client from pigeonhole
Aki Tuomi <aki.tuomi@dovecot.fi>
parents:
diff changeset
663 }