diff options
Diffstat (limited to 'usr/kinit/xpio.c')
-rw-r--r-- | usr/kinit/xpio.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/usr/kinit/xpio.c b/usr/kinit/xpio.c new file mode 100644 index 0000000..42a9844 --- /dev/null +++ b/usr/kinit/xpio.c @@ -0,0 +1,51 @@ +/* + * Looping versions of pread() and pwrite() + */ + +#include <stdlib.h> +#include <unistd.h> +#include <errno.h> + +#include "xpio.h" + +ssize_t xpread(int fd, void *buf, size_t count, off_t offset) +{ + ssize_t ctr = 0; + ssize_t rv = 0; + char *bp = buf; + + while (count) { + rv = pread(fd, bp, count, offset); + + if (rv == 0 || (rv == -1 && errno != EINTR)) + break; + + bp += rv; + count -= rv; + offset += rv; + ctr += rv; + } + + return ctr ? ctr : rv; +} + +ssize_t xpwrite(int fd, void *buf, size_t count, off_t offset) +{ + ssize_t ctr = 0; + ssize_t rv = 0; + char *bp = buf; + + while (count) { + rv = pwrite(fd, bp, count, offset); + + if (rv == 0 || (rv == -1 && errno != EINTR)) + break; + + bp += rv; + count -= rv; + offset += rv; + ctr += rv; + } + + return ctr ? ctr : rv; +} |