From 26c0edc2707b7b2f6fa3c1f278260bc9116ab74a Mon Sep 17 00:00:00 2001 From: Marcus Brinkmann Date: Mon, 11 Aug 2008 17:23:45 +0000 Subject: [PATCH] 2008-08-11 Marcus Brinkmann * rungpg.c (gpg_cancel): Remove cmd fd before status fd. * gpgme.c (_gpgme_cancel_with_err): New function. (gpgme_cancel): Reimplement in terms of _gpgme_cancel_with_err. * wait-private.c (_gpgme_wait_on_condition): Use _gpgme_cancel_with_err. * wait-user.c (_gpgme_user_io_cb_handler): Likewise. * wait-global.c (_gpgme_wait_global_event_cb, gpgme_wait): Likewise. --- gpgme/ChangeLog | 10 ++++++++++ gpgme/gpgme.c | 17 ++++++++++++----- gpgme/gpgme.h | 2 +- gpgme/ops.h | 2 ++ gpgme/rungpg.c | 13 +++++++++++-- gpgme/wait-global.c | 21 ++++----------------- gpgme/wait-private.c | 13 +++---------- gpgme/wait-user.c | 9 +-------- 8 files changed, 44 insertions(+), 43 deletions(-) diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog index 4629cc24..8be44090 100644 --- a/gpgme/ChangeLog +++ b/gpgme/ChangeLog @@ -1,3 +1,13 @@ +2008-08-11 Marcus Brinkmann + + * rungpg.c (gpg_cancel): Remove cmd fd before status fd. + * gpgme.c (_gpgme_cancel_with_err): New function. + (gpgme_cancel): Reimplement in terms of _gpgme_cancel_with_err. + * wait-private.c (_gpgme_wait_on_condition): Use + _gpgme_cancel_with_err. + * wait-user.c (_gpgme_user_io_cb_handler): Likewise. + * wait-global.c (_gpgme_wait_global_event_cb, gpgme_wait): Likewise. + 2008-08-08 Marcus Brinkmann * rungpg.c (command_handler): Remove I/O callback on error, too. diff --git a/gpgme/gpgme.c b/gpgme/gpgme.c index 05222428..5aa879a4 100644 --- a/gpgme/gpgme.c +++ b/gpgme/gpgme.c @@ -106,24 +106,31 @@ gpgme_new (gpgme_ctx_t *r_ctx) } -/* Cancel a pending asynchronous operation. */ gpgme_error_t -gpgme_cancel (gpgme_ctx_t ctx) +_gpgme_cancel_with_err (gpgme_ctx_t ctx, gpg_error_t ctx_err) { gpgme_error_t err; - TRACE_BEG (DEBUG_CTX, "gpgme_cancel", ctx); + TRACE_BEG1 (DEBUG_CTX, "_gpgme_cancel_with_err", ctx, "ctx_err=%i", + ctx_err); err = _gpgme_engine_cancel (ctx->engine); if (err) return TRACE_ERR (err); - err = gpg_error (GPG_ERR_CANCELED); - _gpgme_engine_io_event (ctx->engine, GPGME_EVENT_DONE, &err); + _gpgme_engine_io_event (ctx->engine, GPGME_EVENT_DONE, &ctx_err); return TRACE_ERR (0); } +/* Cancel a pending asynchronous operation. */ +gpgme_error_t +gpgme_cancel (gpgme_ctx_t ctx) +{ + return _gpgme_cancel_with_err (ctx, gpg_error (GPG_ERR_CANCELED)); +} + + /* Cancel a pending operation asynchronously. */ gpgme_error_t gpgme_cancel_async (gpgme_ctx_t ctx) diff --git a/gpgme/gpgme.h b/gpgme/gpgme.h index 728f5e88..de4f8bbf 100644 --- a/gpgme/gpgme.h +++ b/gpgme/gpgme.h @@ -72,7 +72,7 @@ extern "C" { AM_PATH_GPGME macro) check that this header matches the installed library. Warning: Do not edit the next line. configure will do that for you! */ -#define GPGME_VERSION "1.1.7-svn1326" +#define GPGME_VERSION "1.1.7-svn1329" diff --git a/gpgme/ops.h b/gpgme/ops.h index d6a09e52..cd3ee4ac 100644 --- a/gpgme/ops.h +++ b/gpgme/ops.h @@ -27,6 +27,8 @@ /* From gpgme.c. */ +gpgme_error_t _gpgme_cancel_with_err (gpgme_ctx_t ctx, gpg_error_t ctx_err); + void _gpgme_release_result (gpgme_ctx_t ctx); diff --git a/gpgme/rungpg.c b/gpgme/rungpg.c index ca4145ca..39d66d31 100644 --- a/gpgme/rungpg.c +++ b/gpgme/rungpg.c @@ -340,6 +340,17 @@ gpg_cancel (void *engine) if (!gpg) return gpg_error (GPG_ERR_INV_VALUE); + /* If gpg may be waiting for a cmd, close the cmd fd first. On + Windows, close operations block on the reader/writer thread. */ + if (gpg->cmd.used) + { + if (gpg->cmd.fd != -1) + _gpgme_io_close (gpg->cmd.fd); + else if (gpg->fd_data_map + && gpg->fd_data_map[gpg->cmd.idx].fd != -1) + _gpgme_io_close (gpg->fd_data_map[gpg->cmd.idx].fd); + } + if (gpg->status.fd[0] != -1) _gpgme_io_close (gpg->status.fd[0]); if (gpg->status.fd[1] != -1) @@ -353,8 +364,6 @@ gpg_cancel (void *engine) free_fd_data_map (gpg->fd_data_map); gpg->fd_data_map = NULL; } - if (gpg->cmd.fd != -1) - _gpgme_io_close (gpg->cmd.fd); return 0; } diff --git a/gpgme/wait-global.c b/gpgme/wait-global.c index 97ece499..1ab44d16 100644 --- a/gpgme/wait-global.c +++ b/gpgme/wait-global.c @@ -200,16 +200,9 @@ _gpgme_wait_global_event_cb (void *data, gpgme_event_io_t type, gpgme_error_t err = ctx_active (ctx); if (err) - { - /* An error occured. Close all fds in this context, and - send the error in a done event. */ - unsigned int idx; - - for (idx = 0; idx <= ctx->fdt.size; idx++) - if (ctx->fdt.fds[idx].fd != -1) - _gpgme_io_close (ctx->fdt.fds[idx].fd); - _gpgme_engine_io_event (ctx->engine, GPGME_EVENT_DONE, &err); - } + /* An error occured. Close all fds in this context, and + send the error in a done event. */ + _gpgme_cancel_with_err (ctx, &err); } break; @@ -321,13 +314,7 @@ gpgme_wait (gpgme_ctx_t ctx, gpgme_error_t *status, int hang) { /* An error occured. Close all fds in this context, and signal it. */ - unsigned int idx; - - for (idx = 0; idx < ictx->fdt.size; idx++) - if (ictx->fdt.fds[idx].fd != -1) - _gpgme_io_close (ictx->fdt.fds[idx].fd); - _gpgme_engine_io_event (ictx->engine, GPGME_EVENT_DONE, - &err); + _gpgme_cancel_with_err (ictx, err); /* Break out of the loop, and retry the select() from scratch, because now all fds should be diff --git a/gpgme/wait-private.c b/gpgme/wait-private.c index 6633cf67..03660574 100644 --- a/gpgme/wait-private.c +++ b/gpgme/wait-private.c @@ -89,10 +89,7 @@ _gpgme_wait_on_condition (gpgme_ctx_t ctx, volatile int *cond) unsigned int idx; err = gpg_error_from_errno (errno); - for (idx = 0; idx < ctx->fdt.size; idx++) - if (ctx->fdt.fds[idx].fd != -1) - _gpgme_io_close (ctx->fdt.fds[idx].fd); - _gpgme_engine_io_event (ctx->engine, GPGME_EVENT_DONE, &err); + _gpgme_cancel_with_err (ctx, err); return err; } @@ -116,12 +113,8 @@ _gpgme_wait_on_condition (gpgme_ctx_t ctx, volatile int *cond) { /* An error occured. Close all fds in this context, and signal it. */ - unsigned int idx; - - for (idx = 0; idx < ctx->fdt.size; idx++) - if (ctx->fdt.fds[idx].fd != -1) - _gpgme_io_close (ctx->fdt.fds[idx].fd); - _gpgme_engine_io_event (ctx->engine, GPGME_EVENT_DONE, &err); + _gpgme_cancel_with_err (ctx, err); + return err; } } diff --git a/gpgme/wait-user.c b/gpgme/wait-user.c index 7fd61a9b..05750e2a 100644 --- a/gpgme/wait-user.c +++ b/gpgme/wait-user.c @@ -55,14 +55,7 @@ _gpgme_user_io_cb_handler (void *data, int fd) if (! err) err = _gpgme_run_io_cb (&ctx->fdt.fds[tag->idx], 0); if (err) - { - unsigned int idx; - - for (idx = 0; idx < ctx->fdt.size; idx++) - if (ctx->fdt.fds[idx].fd != -1) - _gpgme_io_close (ctx->fdt.fds[idx].fd); - _gpgme_engine_io_event (ctx->engine, GPGME_EVENT_DONE, &err); - } + _gpgme_cancel_with_err (ctx, err); else { unsigned int i;