From 4c41e245cfaf9f85af31c26394cf6549392f89f5 Mon Sep 17 00:00:00 2001 From: Sascha Hauer Date: Tue, 12 Apr 2011 16:38:20 +0200 Subject: [PATCH] libbb: add read_full/write_full functions These functions read/write all data or return with an error. Signed-off-by: Sascha Hauer --- include/libbb.h | 3 +++ lib/libbb.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/include/libbb.h b/include/libbb.h index 2d17c3fc9..110e8ec39 100644 --- a/include/libbb.h +++ b/include/libbb.h @@ -32,4 +32,7 @@ int process_escape_sequence(const char *source, char *dest, int destlen); char *simple_itoa(unsigned int i); +int write_full(int fd, void *buf, size_t size); +int read_full(int fd, void *buf, size_t size); + #endif /* __LIBBB_H */ diff --git a/lib/libbb.c b/lib/libbb.c index 3d0220263..9a0a60bdb 100644 --- a/lib/libbb.c +++ b/lib/libbb.c @@ -127,3 +127,53 @@ char *simple_itoa(unsigned int i) return p + 1; } EXPORT_SYMBOL(simple_itoa); + +/* + * write_full - write to filedescriptor + * + * Like write, but guarantees to write the full buffer out, else + * it returns with an error. + */ +int write_full(int fd, void *buf, size_t size) +{ + size_t insize = size; + int now; + + while (size) { + now = write(fd, buf, size); + if (now <= 0) + return now; + size -= now; + buf += now; + } + + return insize; +} +EXPORT_SYMBOL(write_full); + +/* + * read_full - read from filedescriptor + * + * Like read, but this function only returns less bytes than + * requested when the end of file is reached. + */ +int read_full(int fd, void *buf, size_t size) +{ + size_t insize = size; + int now; + int total = 0; + + while (size) { + now = read(fd, buf, size); + if (now == 0) + return total; + if (now < 0) + return now; + total += now; + size -= now; + buf += now; + } + + return insize; +} +EXPORT_SYMBOL(read_full);