diff options
| author | Marcus Brinkmann <[email protected]> | 2008-08-11 17:23:45 +0000 | 
|---|---|---|
| committer | Marcus Brinkmann <[email protected]> | 2008-08-11 17:23:45 +0000 | 
| commit | 26c0edc2707b7b2f6fa3c1f278260bc9116ab74a (patch) | |
| tree | 07b057e076d0d8a778e9d57728d0b749e8c7611c | |
| parent | 2008-08-08 Marcus Brinkmann <[email protected]> (diff) | |
| download | gpgme-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.
| -rw-r--r-- | gpgme/ChangeLog | 10 | ||||
| -rw-r--r-- | gpgme/gpgme.c | 17 | ||||
| -rw-r--r-- | gpgme/gpgme.h | 2 | ||||
| -rw-r--r-- | gpgme/ops.h | 2 | ||||
| -rw-r--r-- | gpgme/rungpg.c | 13 | ||||
| -rw-r--r-- | gpgme/wait-global.c | 21 | ||||
| -rw-r--r-- | gpgme/wait-private.c | 13 | ||||
| -rw-r--r-- | 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  <[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; | 
