diff options
Diffstat (limited to '')
| -rw-r--r-- | gpgme/ChangeLog | 8 | ||||
| -rw-r--r-- | gpgme/wait.c | 42 | 
2 files changed, 40 insertions, 10 deletions
diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog index 44bcc310..c017b081 100644 --- a/gpgme/ChangeLog +++ b/gpgme/ChangeLog @@ -1,3 +1,11 @@ +2002-06-14  Marcus Brinkmann  <[email protected]> + +	* wait.c (do_select): Return -1 on error, and 0 if nothing to run. +	(_gpgme_wait_one): Only set HANG to zero if do_select returned an +	error, or there are no more file descriptors to wait on. +	(_gpgme_wait_on_condition): Ignore return value from do_select for +	now. +  2002-06-13  Werner Koch  <[email protected]>  	* verify.c (gpgme_op_verify): Make sure that we never access an diff --git a/gpgme/wait.c b/gpgme/wait.c index 9f849fdf..6c99d3e3 100644 --- a/gpgme/wait.c +++ b/gpgme/wait.c @@ -143,8 +143,8 @@ run_idle ()  /* Wait on all file descriptors listed in FDT and process them using -   the registered callbacks.  Returns 0 if nothing to run and 1 if it -   did run something.  */ +   the registered callbacks.  Returns -1 on error (with errno set), 0 +   if nothing to run and 1 if it did run something.  */  static int  do_select (fd_table_t fdt)  { @@ -157,7 +157,7 @@ do_select (fd_table_t fdt)    if (n <= 0)       {        UNLOCK (fdt->lock); -      return 0;	/* Error or timeout.  */ +      return n;	/* Error or timeout.  */      }    for (i = 0; i < fdt->size && n; i++) @@ -236,22 +236,44 @@ gpgme_wait (GpgmeCtx ctx, GpgmeError *status, int hang)  GpgmeError  _gpgme_wait_one (GpgmeCtx ctx)  { +  GpgmeError err = 0;    int hang = 1;    DEBUG1 ("waiting... ctx=%p", ctx);    do      { -      if (! do_select (&ctx->fdt)) -	hang = 0; +      if (do_select (&ctx->fdt) < 0) +	{ +	  err = mk_error (File_Error); +	  hang = 0; +	} +      else +	{ +	  int any = 0; +	  int i; + +	  LOCK (ctx->fdt.lock); +	  for (i = 0; i < ctx->fdt.size; i++) +	    { +	      if (ctx->fdt.fds[i].fd != -1) +		{ +		  any = 1; +		  break; +		} +	    } +	  if (!any) +	    hang = 0; +	  UNLOCK (ctx->fdt.lock); +	}      }    while (hang && !ctx->cancel); -  if (ctx->cancel) +  if (!err && ctx->cancel)      {        /* FIXME: Paranoia?  */        ctx->cancel = 0;        ctx->pending = 0;        ctx->error = mk_error (Canceled);      } -  return ctx->error; +  return err ? err : ctx->error;  } @@ -261,9 +283,9 @@ _gpgme_wait_on_condition (GpgmeCtx ctx, int hang, volatile int *cond)    DEBUG3 ("waiting... ctx=%p hang=%d cond=%p", ctx, hang, cond);    do      { -      if (! do_select (&fdt_global)) -	hang = 0; - +      /* XXX We are ignoring all errors from select here.  */ +      do_select (&fdt_global); +              if (cond && *cond)  	hang = 0;        else  | 
