From 78a23a4d5ab27c8af26c0e232c099a0c16907649 Mon Sep 17 00:00:00 2001 From: Daniel Borkmann Date: Tue, 4 Jun 2013 10:11:55 +0200 Subject: xio: add ioexact operations Break this out so that we only need to have sigint non-static where it is really needed. Signed-off-by: Daniel Borkmann --- ioexact.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 ioexact.c (limited to 'ioexact.c') diff --git a/ioexact.c b/ioexact.c new file mode 100644 index 0000000..1600784 --- /dev/null +++ b/ioexact.c @@ -0,0 +1,53 @@ +#include +#include +#include + +#include "ioexact.h" + +extern volatile sig_atomic_t sigint; + +ssize_t read_exact(int fd, void *buf, size_t len, int mayexit) +{ + ssize_t num = 0, written; + + while (len > 0 && !sigint) { + if ((written = read(fd, buf, len)) < 0) { + if (errno == EAGAIN && num > 0) + continue; + if (mayexit) + return -1; + else + continue; + } + if (!written) + return 0; + len -= written; + buf += written; + num += written; + } + + return num; +} + +ssize_t write_exact(int fd, void *buf, size_t len, int mayexit) +{ + ssize_t num = 0, written; + + while (len > 0 && !sigint) { + if ((written = write(fd, buf, len)) < 0) { + if (errno == EAGAIN && num > 0) + continue; + if (mayexit) + return -1; + else + continue; + } + if (!written) + return 0; + len -= written; + buf += written; + num += written; + } + + return num; +} -- cgit v1.2.3-54-g00ecf