From bfa8ea3825b58da67ba5d65cded0dc5afdf467b1 Mon Sep 17 00:00:00 2001 From: Ben Kibbey Date: Tue, 11 Aug 2009 21:50:31 -0400 Subject: [PATCH] Really fix EAGAIN when doing an INQUIRE. Things are different on real remote hosts. :) --- assuan/assuan-buffer.c | 8 ++++++-- assuan/assuan-client.c | 2 +- src/libpwmd.c | 13 +++++++++++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/assuan/assuan-buffer.c b/assuan/assuan-buffer.c index cf93bd92..e0acfb63 100644 --- a/assuan/assuan-buffer.c +++ b/assuan/assuan-buffer.c @@ -366,8 +366,12 @@ _assuan_cookie_write_data (void *cookie, const char *buffer, size_t orig_size) char *line; size_t linelen; - if (ctx->outbound.data.error) - return 0; + if (ctx->outbound.data.error) { + if (_assuan_error_is_eagain(ctx->outbound.data.error)) + ctx->outbound.data.error = 0; + else + return 0; + } line = ctx->outbound.data.line; linelen = ctx->outbound.data.linelen; diff --git a/assuan/assuan-client.c b/assuan/assuan-client.c index 51d24b6f..98a3c081 100644 --- a/assuan/assuan-client.c +++ b/assuan/assuan-client.c @@ -46,7 +46,7 @@ _assuan_read_from_server (assuan_context_t ctx, int *okay, int *off) { rc = _assuan_read_line (ctx); } - while (!ctx->in_inquire && _assuan_error_is_eagain (rc)); + while (_assuan_error_is_eagain (rc) && !ctx->in_inquire); if (rc) return rc; line = ctx->inbound.line; diff --git a/src/libpwmd.c b/src/libpwmd.c index 3212b1f3..1fd6924c 100644 --- a/src/libpwmd.c +++ b/src/libpwmd.c @@ -442,6 +442,7 @@ static int inquire_cb(void *data, const char *keyword) { pwm_t *pwm = (pwm_t *)data; gpg_error_t rc = 0; + int is_eagain = 0; /* Shouldn't get this far without a callback. */ if (!pwm->inquire_func) @@ -461,6 +462,8 @@ static int inquire_cb(void *data, const char *keyword) break; } +eagain: + is_eagain = 0; arc = assuan_send_data(pwm->ctx, result, len); arc = gpg_err_code(arc); @@ -470,6 +473,12 @@ static int inquire_cb(void *data, const char *keyword) } rc = arc; + + if (rc == GPG_ERR_EAGAIN) { + rc = 0; + is_eagain = 1; + goto process; + } } else if (rc) break; @@ -488,11 +497,15 @@ static int inquire_cb(void *data, const char *keyword) continue; } +process: rc = _pwmd_process(pwm); if (rc == GPG_ERR_EAGAIN) rc = 0; } + + if (!rc && is_eagain) + goto eagain; } return gpg_err_code(rc); -- 2.11.4.GIT