2008-08-11 Marcus Brinkmann <marcus@g10code.com>
authorMarcus Brinkmann <mb@g10code.com>
Mon, 11 Aug 2008 17:23:45 +0000 (17:23 +0000)
committerMarcus Brinkmann <mb@g10code.com>
Mon, 11 Aug 2008 17:23:45 +0000 (17:23 +0000)
        * 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
gpgme/gpgme.c
gpgme/gpgme.h
gpgme/ops.h
gpgme/rungpg.c
gpgme/wait-global.c
gpgme/wait-private.c
gpgme/wait-user.c

index 4629cc243a824045b0508cb77f5e406f8384c7b3..8be440908a1bca9cce479b49310d4601aad20a5e 100644 (file)
@@ -1,3 +1,13 @@
+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.
index 05222428a272340b6e7b2b62ccb14601bfe0cd53..5aa879a42d19b166a9940c47df86193f282e35af 100644 (file)
@@ -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)
index 728f5e88c0976559e7c7bbb99cf9edd6002ee6e3..de4f8bbf14724958f4adf32cbcce858a1a2e0ebd 100644 (file)
@@ -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"
 
 
 \f
index d6a09e52d2ff4680f125de2b2521d075dff96786..cd3ee4ac0beccd7ffaceb01ec8689375d045edd4 100644 (file)
@@ -27,6 +27,8 @@
 
 \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
index ca4145ca95d2941f29aacabed4c6e5f013a56d26..39d66d315203a22bea81d98485b27fa8057d9f79 100644 (file)
@@ -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;
 }
index 97ece4992c24de043f9a2594f00c683a206fd186..1ab44d167be88d54c372f5716443f63abcbc506d 100644 (file)
@@ -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
index 6633cf67f14088eb4363849ee9722afce917b3ef..0366057401f0be6c212b7ffe7c3361ddb343cf0c 100644 (file)
@@ -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;
                }
            }
index 7fd61a9b3e5e22cf6eac2bb8869f25832d90a3c5..05750e2a444ad03c095342fb7c599e3fdee30c28 100644 (file)
@@ -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;