summaryrefslogtreecommitdiffstats
path: root/common/exechelp-w32.c
diff options
context:
space:
mode:
authorWerner Koch <wk@gnupg.org>2017-02-28 09:34:29 +0100
committerWerner Koch <wk@gnupg.org>2017-02-28 09:39:10 +0100
commit1192449207f41b26be8950b04df84a52c8a2a886 (patch)
tree66bc2f2e39c4f1be9cb39fea9225d8a07db0f6c9 /common/exechelp-w32.c
parentdirmngr: Avoid warnings during non-ntbtls build. (diff)
downloadgnupg2-1192449207f41b26be8950b04df84a52c8a2a886.tar.xz
gnupg2-1192449207f41b26be8950b04df84a52c8a2a886.zip
w32: Make pipes really pollable.
* common/exectool.c (gnupg_exec_tool_stream) [W32]: Use _get_osfhandle to print the fd for the command line. * common/exechelp-w32.c (create_pipe_and_estream): Use es_sysopen so that the streams are actually pollable. -- This addresses two bugs: - Using the "-&@INEXTRA@" kludges requires that we pass the value of the handle on the command line and not the libc fd. - gpgrt_poll requires the use of the ReadFile/WriteFile backend which is currently only used when the stream has been created with gpgrt_sysopen. Signed-off-by: Werner Koch <wk@gnupg.org>
Diffstat (limited to 'common/exechelp-w32.c')
-rw-r--r--common/exechelp-w32.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/common/exechelp-w32.c b/common/exechelp-w32.c
index e79ee5b14..2c44e2c75 100644
--- a/common/exechelp-w32.c
+++ b/common/exechelp-w32.c
@@ -309,6 +309,7 @@ create_pipe_and_estream (int filedes[2], int flags,
{
gpg_error_t err = 0;
HANDLE fds[2];
+ es_syshd_t syshd;
filedes[0] = filedes[1] = -1;
err = my_error (GPG_ERR_GENERAL);
@@ -337,10 +338,17 @@ create_pipe_and_estream (int filedes[2], int flags,
if (! err && r_fp)
{
+ syshd.type = ES_SYSHD_HANDLE;
if (!outbound)
- *r_fp = es_fdopen (filedes[0], nonblock? "r,nonblock" : "r");
+ {
+ syshd.u.handle = fds[0];
+ *r_fp = es_sysopen (&syshd, nonblock? "r,nonblock" : "r");
+ }
else
- *r_fp = es_fdopen (filedes[1], nonblock? "w,nonblock" : "w");
+ {
+ syshd.u.handle = fds[1];
+ *r_fp = es_sysopen (&syshd, nonblock? "w,nonblock" : "w");
+ }
if (!*r_fp)
{
err = my_error_from_syserror ();