diff options
author | Daniel Borkmann <dborkman@redhat.com> | 2013-06-04 10:11:55 +0200 |
---|---|---|
committer | Daniel Borkmann <dborkman@redhat.com> | 2013-06-04 10:11:55 +0200 |
commit | 78a23a4d5ab27c8af26c0e232c099a0c16907649 (patch) | |
tree | 7abfec64bdb1c639faca541512e95b6f3bfa9aad /ioexact.c | |
parent | 22e4551cb007312ef808669aa70cad10a7657136 (diff) |
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 <dborkman@redhat.com>
Diffstat (limited to 'ioexact.c')
-rw-r--r-- | ioexact.c | 53 |
1 files changed, 53 insertions, 0 deletions
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 <errno.h> +#include <unistd.h> +#include <signal.h> + +#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; +} |