aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcus Brinkmann <[email protected]>2008-08-11 17:23:45 +0000
committerMarcus Brinkmann <[email protected]>2008-08-11 17:23:45 +0000
commit26c0edc2707b7b2f6fa3c1f278260bc9116ab74a (patch)
tree07b057e076d0d8a778e9d57728d0b749e8c7611c
parent2008-08-08 Marcus Brinkmann <[email protected]> (diff)
downloadgpgme-26c0edc2707b7b2f6fa3c1f278260bc9116ab74a.tar.gz
gpgme-26c0edc2707b7b2f6fa3c1f278260bc9116ab74a.zip
2008-08-11 Marcus Brinkmann <[email protected]>
* 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.
Diffstat (limited to '')
-rw-r--r--gpgme/ChangeLog10
-rw-r--r--gpgme/gpgme.c17
-rw-r--r--gpgme/gpgme.h2
-rw-r--r--gpgme/ops.h2
-rw-r--r--gpgme/rungpg.c13
-rw-r--r--gpgme/wait-global.c21
-rw-r--r--gpgme/wait-private.c13
-rw-r--r--gpgme/wait-user.c9
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 <[email protected]>
+
+ * 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 <[email protected]>
* 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;