aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeal H. Walfield <[email protected]>2015-11-05 11:19:45 +0000
committerNeal H. Walfield <[email protected]>2015-11-05 13:09:01 +0000
commitfd4b9e232805b2e30b29903568c95cc0aad8bbec (patch)
tree83f520893b5146e2b281b8ad9b791dfb9fdfd329
parentdoc: Note that gpgkey2ssh is deprecated. (diff)
downloadgnupg-fd4b9e232805b2e30b29903568c95cc0aad8bbec.tar.gz
gnupg-fd4b9e232805b2e30b29903568c95cc0aad8bbec.zip
common: Add a function for copying data from one iobuf to another.
* common/iobuf.c (iobuf_copy): New function. -- Signed-off-by: Neal H. Walfield <[email protected]>
-rw-r--r--common/iobuf.c35
-rw-r--r--common/iobuf.h8
2 files changed, 43 insertions, 0 deletions
diff --git a/common/iobuf.c b/common/iobuf.c
index 795ff11b1..ca8609e70 100644
--- a/common/iobuf.c
+++ b/common/iobuf.c
@@ -2208,6 +2208,41 @@ iobuf_temp_to_buffer (iobuf_t a, byte * buffer, size_t buflen)
return n;
}
+/* Copies the data from the input iobuf SOURCE to the output iobuf
+ DEST until either an error is encountered or EOF is reached.
+ Returns the number of bytes copies. */
+size_t
+iobuf_copy (iobuf_t dest, iobuf_t source)
+{
+ char *temp;
+ /* Use a 1 MB buffer. */
+ const size_t temp_size = 1024 * 1024;
+
+ size_t nread;
+ size_t nwrote = 0;
+ int err;
+
+ assert (source->use == IOBUF_INPUT || source->use == IOBUF_INPUT_TEMP);
+ assert (dest->use == IOBUF_OUTPUT || source->use == IOBUF_OUTPUT_TEMP);
+
+ temp = xmalloc (temp_size);
+ while (1)
+ {
+ nread = iobuf_read (source, temp, temp_size);
+ if (nread == -1)
+ /* EOF. */
+ break;
+
+ err = iobuf_write (dest, temp, nread);
+ if (err)
+ break;
+ nwrote += nread;
+ }
+ xfree (temp);
+
+ return nwrote;
+}
+
void
iobuf_flush_temp (iobuf_t temp)
diff --git a/common/iobuf.h b/common/iobuf.h
index bce6c3162..e106292c6 100644
--- a/common/iobuf.h
+++ b/common/iobuf.h
@@ -552,6 +552,14 @@ int iobuf_write_temp (iobuf_t dest, iobuf_t source);
BUFFER. Returns the number of bytes actually copied. */
size_t iobuf_temp_to_buffer (iobuf_t a, byte * buffer, size_t buflen);
+/* Copies the data from the input iobuf SOURCE to the output iobuf
+ DEST until either an error is encountered or EOF is reached.
+ Returns the number of bytes successfully written. If an error
+ occured, then any buffered bytes are not returned to SOURCE and are
+ effectively lost. To check if an error occured, use
+ iobuf_error. */
+size_t iobuf_copy (iobuf_t dest, iobuf_t source);
+
/* Return the size of any underlying file. This only works with
file_filter based pipelines.