* 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-11 Marcus Brinkmann <marcus@g10code.com>
+
+ * 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 <marcus@g10code.com>
* rungpg.c (command_handler): Remove I/O callback on error, too.
}
-/* 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)
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"
\f
\f
/* 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);
\f
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)
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;
}
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;
{
/* 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
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;
}
{
/* 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;
}
}
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;