From ccde48c08d118182c5760d7f4c02e157b28420cc Mon Sep 17 00:00:00 2001 From: Marcus Brinkmann Date: Fri, 14 Jun 2002 20:06:35 +0000 Subject: [PATCH] 2002-06-14 Marcus Brinkmann * 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. --- gpgme/ChangeLog | 8 ++++++++ gpgme/wait.c | 42 ++++++++++++++++++++++++++++++++---------- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/gpgme/ChangeLog b/gpgme/ChangeLog index 44bcc31..c017b08 100644 --- a/gpgme/ChangeLog +++ b/gpgme/ChangeLog @@ -1,3 +1,11 @@ +2002-06-14 Marcus Brinkmann + + * 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 * verify.c (gpgme_op_verify): Make sure that we never access an diff --git a/gpgme/wait.c b/gpgme/wait.c index 9f849fd..6c99d3e 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 -- 2.26.2