diff options
author | Marcus Brinkmann <[email protected]> | 2010-06-10 23:09:32 +0000 |
---|---|---|
committer | Marcus Brinkmann <[email protected]> | 2010-06-10 23:09:32 +0000 |
commit | 9f4ec52c0e93f708f66363f45f99baa2092cf44b (patch) | |
tree | 72a7ed9e1135694681b00c63efaaa9cb890bb8d8 | |
parent | 2010-06-10 Marcus Brinkmann <[email protected]> (diff) | |
download | libassuan-9f4ec52c0e93f708f66363f45f99baa2092cf44b.tar.gz libassuan-9f4ec52c0e93f708f66363f45f99baa2092cf44b.zip |
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.
-rw-r--r-- | src/ChangeLog | 11 | ||||
-rw-r--r-- | src/assuan-handler.c | 24 | ||||
-rw-r--r-- | src/system-w32ce.c | 13 |
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) |