Mercurial > dovecot > core-2.2
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 |
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 } |