diff options
author | Werner Koch <[email protected]> | 2017-01-19 08:57:27 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2017-01-19 08:59:08 +0000 |
commit | 55c9212a2338bf0b07c8cf3a69bcedaa28d48d43 (patch) | |
tree | 6f92bc1bd4ce9991193776833b861505d4fb321b /common/exectool.c | |
parent | dirmngr: Add setup of CA for NTBTLS. (diff) | |
download | gnupg-55c9212a2338bf0b07c8cf3a69bcedaa28d48d43.tar.gz gnupg-55c9212a2338bf0b07c8cf3a69bcedaa28d48d43.zip |
common: Clarify use of vars in buffer copy code.
* common/exectool.c (my_error_from_errno): New.
(copy_buffer_do_copy): Use separate vars for errno values and
gpg-error values for clarity. s/assert/log_assert/.
(copy_buffer_flush): Ditto.
(gnupg_exec_tool_stream): Use gpg_err_code when testing.
--
NB: It is surprising that es_write seems not to set ERRNO but only
returns the ERRNO value. Need to check whether this is really the
case.
Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'common/exectool.c')
-rw-r--r-- | common/exectool.c | 42 |
1 files changed, 26 insertions, 16 deletions
diff --git a/common/exectool.c b/common/exectool.c index 0067fc63a..8c1f75792 100644 --- a/common/exectool.c +++ b/common/exectool.c @@ -65,6 +65,12 @@ my_error_from_syserror (void) return gpg_err_make (default_errsource, gpg_err_code_from_syserror ()); } +static inline gpg_error_t +my_error_from_errno (int rc) +{ + return gpg_err_make (default_errsource, gpg_err_code_from_errno (rc)); +} + static void read_and_log_stderr (read_and_log_buffer_t *state, es_poll_t *fderr) @@ -226,42 +232,44 @@ copy_buffer_shred (struct copy_buffer *c) static gpg_error_t copy_buffer_do_copy (struct copy_buffer *c, estream_t source, estream_t sink) { + int rc; gpg_error_t err; size_t nwritten = 0; if (c->nread == 0) { c->writep = c->buffer; - err = es_read (source, c->buffer, sizeof c->buffer, &c->nread); - if (err) + rc = es_read (source, c->buffer, sizeof c->buffer, &c->nread); + if (rc) { - if (errno == EAGAIN) + err = my_error_from_syserror (); + if (gpg_err_code (err) == GPG_ERR_EAGAIN) return 0; /* We will just retry next time. */ - return my_error_from_syserror (); + return err; } - assert (c->nread <= sizeof c->buffer); + log_assert (c->nread <= sizeof c->buffer); } if (c->nread == 0) return 0; /* Done copying. */ - nwritten = 0; - err = sink? es_write (sink, c->writep, c->nread, &nwritten) : 0; + rc = sink? es_write (sink, c->writep, c->nread, &nwritten) : 0; + err = rc? my_error_from_errno (rc) : 0; - assert (nwritten <= c->nread); + log_assert (nwritten <= c->nread); c->writep += nwritten; c->nread -= nwritten; - assert (c->writep - c->buffer <= sizeof c->buffer); + log_assert (c->writep - c->buffer <= sizeof c->buffer); if (err) { - if (errno == EAGAIN) + if (gpg_err_code (err) == GPG_ERR_EAGAIN) return 0; /* We will just retry next time. */ - return my_error_from_syserror (); + return err; } if (sink && es_fflush (sink) && errno != EAGAIN) @@ -275,16 +283,18 @@ copy_buffer_do_copy (struct copy_buffer *c, estream_t source, estream_t sink) static gpg_error_t copy_buffer_flush (struct copy_buffer *c, estream_t sink) { + int rc; gpg_error_t err; size_t nwritten; nwritten = 0; - err = es_write (sink, c->writep, c->nread, &nwritten); + rc = es_write (sink, c->writep, c->nread, &nwritten); + err = rc? my_error_from_errno (rc) : 0; - assert (nwritten <= c->nread); + log_assert (nwritten <= c->nread); c->writep += nwritten; c->nread -= nwritten; - assert (c->writep - c->buffer <= sizeof c->buffer); + log_assert (c->writep - c->buffer <= sizeof c->buffer); if (err) return err; @@ -452,7 +462,7 @@ gnupg_exec_tool_stream (const char *pgmname, const char *argv[], if (es_feof (input)) { err = copy_buffer_flush (cpbuf_in, fds[0].stream); - if (err == GPG_ERR_EAGAIN) + if (gpg_err_code (err) == GPG_ERR_EAGAIN) continue; /* Retry next time. */ if (err) { @@ -480,7 +490,7 @@ gnupg_exec_tool_stream (const char *pgmname, const char *argv[], if (es_feof (inextra)) { err = copy_buffer_flush (cpbuf_extra, fds[3].stream); - if (err == GPG_ERR_EAGAIN) + if (gpg_err_code (err) == GPG_ERR_EAGAIN) continue; /* Retry next time. */ if (err) { |