diff options
author | Christian Grothoff <christian@grothoff.org> | 2020-12-12 22:40:40 +0100 |
---|---|---|
committer | Christian Grothoff <christian@grothoff.org> | 2020-12-12 22:40:40 +0100 |
commit | b81a5fb3aacb14b95be66771ebad2b3f047cbf2b (patch) | |
tree | a6cd248372fb6a754d512b30d9299b72448b912e /src/util/crypto_helper_esign.c | |
parent | 09abf5e7e08c749c0a8904ba651e0357404e8aa9 (diff) |
add sync and timeout functionality to helpers
Diffstat (limited to 'src/util/crypto_helper_esign.c')
-rw-r--r-- | src/util/crypto_helper_esign.c | 82 |
1 files changed, 55 insertions, 27 deletions
diff --git a/src/util/crypto_helper_esign.c b/src/util/crypto_helper_esign.c index 39130e04f..1cf20e914 100644 --- a/src/util/crypto_helper_esign.c +++ b/src/util/crypto_helper_esign.c @@ -57,6 +57,11 @@ struct TALER_CRYPTO_ExchangeSignHelper * The UNIX domain socket, -1 if we are currently not connected. */ int sock; + + /** + * Have we reached the sync'ed state? + */ + bool synced; }; @@ -309,6 +314,41 @@ handle_mt_purge (struct TALER_CRYPTO_ExchangeSignHelper *esh, } +/** + * Wait until the socket is ready to read. + * + * @param dh helper to wait for + * @return false on timeout (after 5s) + */ +static bool +await_read_ready (struct TALER_CRYPTO_ExchangeSignHelper *esh) +{ + /* wait for reply with 5s timeout */ + struct pollfd pfd = { + .fd = esh->sock, + .events = POLLIN + }; + sigset_t sigmask; + struct timespec ts = { + .tv_sec = 5 + }; + int ret; + + GNUNET_assert (0 == sigemptyset (&sigmask)); + GNUNET_assert (0 == sigaddset (&sigmask, SIGTERM)); + GNUNET_assert (0 == sigaddset (&sigmask, SIGHUP)); + ret = ppoll (&pfd, + 1, + &ts, + &sigmask); + if ( (-1 == ret) && + (EINTR != errno) ) + GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, + "ppoll"); + return (0 < ret); +} + + void TALER_CRYPTO_helper_esign_poll (struct TALER_CRYPTO_ExchangeSignHelper *esh) { @@ -329,7 +369,13 @@ TALER_CRYPTO_helper_esign_poll (struct TALER_CRYPTO_ExchangeSignHelper *esh) if (ret < 0) { if (EAGAIN == errno) - break; + { + if (esh->synced) + break; + if (! await_read_ready (esh)) + break; /* timeout */ + continue; /* try again */ + } GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "recv"); do_disconnect (esh); @@ -365,6 +411,11 @@ TALER_CRYPTO_helper_esign_poll (struct TALER_CRYPTO_ExchangeSignHelper *esh) return; } break; + case TALER_HELPER_EDDSA_SYNCED: + GNUNET_log (GNUNET_ERROR_TYPE_INFO, + "Now synchronized with EdDSA helper\n"); + esh->synced = true; + break; default: GNUNET_break_op (0); do_disconnect (esh); @@ -422,33 +473,10 @@ TALER_CRYPTO_helper_esign_sign_ ( const struct GNUNET_MessageHeader *hdr = (const struct GNUNET_MessageHeader *) buf; + if (! await_read_ready (esh)) { - /* wait for reply with 5s timeout */ - struct pollfd pfd = { - .fd = esh->sock, - .events = POLLIN - }; - sigset_t sigmask; - struct timespec ts = { - .tv_sec = 5 - }; - - GNUNET_assert (0 == sigemptyset (&sigmask)); - GNUNET_assert (0 == sigaddset (&sigmask, SIGTERM)); - GNUNET_assert (0 == sigaddset (&sigmask, SIGHUP)); - ret = ppoll (&pfd, - 1, - &ts, - &sigmask); - if ( (-1 == ret) && - (EINTR != errno) ) - GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, - "ppoll"); - if (0 >= ret) - { - do_disconnect (esh); - return TALER_EC_GENERIC_TIMEOUT; - } + do_disconnect (esh); + return TALER_EC_GENERIC_TIMEOUT; } ret = recv (esh->sock, buf, |