From 46cded2627e8796c58a5d494518a6c2ee78fe5ef Mon Sep 17 00:00:00 2001 From: Tobias Brunner Date: Tue, 22 Oct 2013 14:22:35 +0200 Subject: [PATCH] chunk: Add helper function to create a chunk from data read from a file descriptor --- src/libstrongswan/utils/chunk.c | 32 ++++++++++++++++++++++++++++++++ src/libstrongswan/utils/chunk.h | 8 ++++++++ 2 files changed, 40 insertions(+) diff --git a/src/libstrongswan/utils/chunk.c b/src/libstrongswan/utils/chunk.c index f5b3ac675..644b8060f 100644 --- a/src/libstrongswan/utils/chunk.c +++ b/src/libstrongswan/utils/chunk.c @@ -243,6 +243,38 @@ bool chunk_write(chunk_t chunk, char *path, char *label, mode_t mask, bool force return good; } +/** + * Described in header. + */ +chunk_t chunk_from_fd(int fd) +{ + char buf[8096]; + char *pos = buf; + ssize_t len, total = 0; + + while (TRUE) + { + len = read(fd, pos, buf + sizeof(buf) - pos); + if (len < 0) + { + DBG1(DBG_LIB, "reading from file descriptor failed: %s", + strerror(errno)); + return chunk_empty; + } + if (len == 0) + { + break; + } + total += len; + if (total == sizeof(buf)) + { + DBG1(DBG_LIB, "buffer too small to read from file descriptor"); + return chunk_empty; + } + } + return chunk_clone(chunk_create(buf, total)); +} + /** hex conversion digits */ static char hexdig_upper[] = "0123456789ABCDEF"; diff --git a/src/libstrongswan/utils/chunk.h b/src/libstrongswan/utils/chunk.h index 36f6f260e..d3751da70 100644 --- a/src/libstrongswan/utils/chunk.h +++ b/src/libstrongswan/utils/chunk.h @@ -99,6 +99,14 @@ void chunk_split(chunk_t chunk, const char *mode, ...); */ bool chunk_write(chunk_t chunk, char *path, char *label, mode_t mask, bool force); +/** + * Store data read from FD into a chunk + * + * @param fd file descriptor to read from + * @return chunk or chunk_empty on failure + */ +chunk_t chunk_from_fd(int fd); + /** * Convert a chunk of data to hex encoding. *