aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ChangeLog11
-rw-r--r--src/assuan-handler.c24
-rw-r--r--src/system-w32ce.c13
3 files changed, 44 insertions, 4 deletions
diff --git a/src/ChangeLog b/src/ChangeLog
index f78ac81..362f3f0 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,14 @@
+2010-06-11 Marcus Brinkmann <[email protected]>
+
+ * assuan-handler.c (std_handler_input,
+ std_handler_output) [HAVE_W32CE_SYSTEM]: Finish the pipe. We must
+ do this here, because otherwise assuan_close_input_fd() and
+ assuan_close_output_fd() can't work.
+ * system-w32ce.c (_assuan_w32ce_finish_pipe): Call SetLastError in
+ error case.
+ (__assuan_close): Save WSAGetLastError before trashing it!
+ Otherwise handle is never closed and GPGME hangs.
+
2010-06-10 Marcus Brinkmann <[email protected]>
* w32ce-add.h (ASSUAN_STDIN, ASSUAN_STDOUT): Define magic handle values.
diff --git a/src/assuan-handler.c b/src/assuan-handler.c
index 9bb3010..c19117f 100644
--- a/src/assuan-handler.c
+++ b/src/assuan-handler.c
@@ -264,6 +264,17 @@ std_handler_input (assuan_context_t ctx, char *line)
rc = assuan_command_parse_fd (ctx, line, &fd);
if (rc)
return PROCESS_DONE (ctx, rc);
+
+#ifdef HAVE_W32CE_SYSTEM
+ oldfd = fd;
+ fd = _assuan_w32ce_finish_pipe ((int)fd, 0);
+ if (fd == INVALID_HANDLE_VALUE)
+ return PROCESS_DONE (ctx, set_error (ctx, GPG_ERR_ASS_PARAMETER,
+ "rvid conversion failed"));
+ TRACE2 (ctx, ASSUAN_LOG_SYSIO, "std_handler_input", ctx,
+ "turned RVID 0x%x into handle 0x%x", oldfd, fd);
+#endif
+
if (ctx->input_notify_fnc)
{
oldfd = ctx->input_fd;
@@ -284,10 +295,21 @@ std_handler_output (assuan_context_t ctx, char *line)
{
gpg_error_t rc;
assuan_fd_t fd, oldfd;
-
+
rc = assuan_command_parse_fd (ctx, line, &fd);
if (rc)
return PROCESS_DONE (ctx, rc);
+
+#ifdef HAVE_W32CE_SYSTEM
+ oldfd = fd;
+ fd = _assuan_w32ce_finish_pipe ((int)fd, 1);
+ if (fd == INVALID_HANDLE_VALUE)
+ return PROCESS_DONE (ctx, set_error (ctx, gpg_err_code_from_syserror (),
+ "rvid conversion failed"));
+ TRACE2 (ctx, ASSUAN_LOG_SYSIO, "std_handler_output", ctx,
+ "turned RVID 0x%x into handle 0x%x", oldfd, fd);
+#endif
+
if (ctx->output_notify_fnc)
{
oldfd = ctx->output_fd;
diff --git a/src/system-w32ce.c b/src/system-w32ce.c
index a95fbf3..c201c47 100644
--- a/src/system-w32ce.c
+++ b/src/system-w32ce.c
@@ -159,7 +159,10 @@ _assuan_w32ce_finish_pipe (int rvid, int write_end)
HANDLE hd;
if (!rvid)
- return INVALID_HANDLE_VALUE;
+ {
+ SetLastError (ERROR_INVALID_HANDLE);
+ return INVALID_HANDLE_VALUE;
+ }
hd = CreateFile (L"GPG1:", write_end? GENERIC_WRITE : GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
@@ -259,9 +262,13 @@ int
__assuan_close (assuan_context_t ctx, assuan_fd_t fd)
{
int rc = closesocket (HANDLE2SOCKET(fd));
+ int err = WSAGetLastError ();
+
+ /* Note that gpg_err_set_errno on Windows CE overwrites
+ WSAGetLastError() (via SetLastError()). */
if (rc)
- gpg_err_set_errno ( _assuan_sock_wsa2errno (WSAGetLastError ()) );
- if (rc && WSAGetLastError () == WSAENOTSOCK)
+ gpg_err_set_errno (_assuan_sock_wsa2errno (err));
+ if (rc && err == WSAENOTSOCK)
{
rc = CloseHandle (fd);
if (rc)