diff --git a/lib/internal.h b/lib/internal.h index 382a600e..78816c0b 100644 --- a/lib/internal.h +++ b/lib/internal.h @@ -101,6 +101,8 @@ char *crypt_get_partition_device(const char *dev_path, uint64_t offset, uint64_t char *crypt_get_base_device(const char *dev_path); uint64_t crypt_dev_partition_offset(const char *dev_path); +ssize_t write_buffer(int fd, const void *buf, size_t count); +ssize_t read_buffer(int fd, void *buf, size_t count); ssize_t write_blockwise(int fd, int bsize, void *buf, size_t count); ssize_t read_blockwise(int fd, int bsize, void *_buf, size_t count); ssize_t write_lseek_blockwise(int fd, int bsize, char *buf, size_t count, off_t offset); diff --git a/lib/utils.c b/lib/utils.c index ae7ba728..69b63b04 100644 --- a/lib/utils.c +++ b/lib/utils.c @@ -67,6 +67,52 @@ static void *aligned_malloc(void **base, int size, int alignment) #endif } +ssize_t read_buffer(int fd, void *buf, size_t count) +{ + size_t read_size = 0; + ssize_t r; + + if (fd < 0 || !buf) + return -EINVAL; + + do { + r = read(fd, buf, count - read_size); + if (r == -1 && errno != EINTR) + return r; + if (r == 0) + return (ssize_t)read_size; + if (r > 0) { + read_size += (size_t)r; + buf = (uint8_t*)buf + r; + } + } while (read_size != count); + + return (ssize_t)count; +} + +ssize_t write_buffer(int fd, const void *buf, size_t count) +{ + size_t write_size = 0; + ssize_t w; + + if (fd < 0 || !buf || !count) + return -EINVAL; + + do { + w = write(fd, buf, count - write_size); + if (w < 0 && errno != EINTR) + return w; + if (w == 0) + return (ssize_t)write_size; + if (w > 0) { + write_size += (size_t) w; + buf = (const uint8_t*)buf + w; + } + } while (write_size != count); + + return (ssize_t)write_size; +} + ssize_t write_blockwise(int fd, int bsize, void *orig_buf, size_t count) { void *hangover_buf, *hangover_buf_base = NULL;