diff options
author | Dees Troy <dees_troy@teamw.in> | 2013-02-27 19:39:14 +0100 |
---|---|---|
committer | Gerrit Code Review <gerrit@5.9.244.119> | 2013-02-27 19:39:14 +0100 |
commit | 2cf31af56114cf997b10218db7c35ee047f5d400 (patch) | |
tree | 85f3b51e45ff8233922f2c0c151299868ca89371 /libblkid/all-io.h | |
parent | libtar - Fix extraction of hardlinks to use the prefix (diff) | |
parent | use libblkid to get filesystem type (diff) | |
download | android_bootable_recovery-2cf31af56114cf997b10218db7c35ee047f5d400.tar android_bootable_recovery-2cf31af56114cf997b10218db7c35ee047f5d400.tar.gz android_bootable_recovery-2cf31af56114cf997b10218db7c35ee047f5d400.tar.bz2 android_bootable_recovery-2cf31af56114cf997b10218db7c35ee047f5d400.tar.lz android_bootable_recovery-2cf31af56114cf997b10218db7c35ee047f5d400.tar.xz android_bootable_recovery-2cf31af56114cf997b10218db7c35ee047f5d400.tar.zst android_bootable_recovery-2cf31af56114cf997b10218db7c35ee047f5d400.zip |
Diffstat (limited to 'libblkid/all-io.h')
-rw-r--r-- | libblkid/all-io.h | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/libblkid/all-io.h b/libblkid/all-io.h new file mode 100644 index 000000000..424ab7d3f --- /dev/null +++ b/libblkid/all-io.h @@ -0,0 +1,82 @@ +/* + * No copyright is claimed. This code is in the public domain; do with + * it what you wish. + * + * Written by Karel Zak <kzak@redhat.com> + * Petr Uzel <petr.uzel@suse.cz> + */ + +#ifndef UTIL_LINUX_ALL_IO_H +#define UTIL_LINUX_ALL_IO_H + +#include <string.h> +#include <unistd.h> +#include <errno.h> + +#include "c.h" + +static inline int write_all(int fd, const void *buf, size_t count) +{ + while (count) { + ssize_t tmp; + + errno = 0; + tmp = write(fd, buf, count); + if (tmp > 0) { + count -= tmp; + if (count) + buf = (void *) ((char *) buf + tmp); + } else if (errno != EINTR && errno != EAGAIN) + return -1; + if (errno == EAGAIN) /* Try later, *sigh* */ + usleep(10000); + } + return 0; +} + +static inline int fwrite_all(const void *ptr, size_t size, + size_t nmemb, FILE *stream) +{ + while (nmemb) { + size_t tmp; + + errno = 0; + tmp = fwrite(ptr, size, nmemb, stream); + if (tmp > 0) { + nmemb -= tmp; + if (nmemb) + ptr = (void *) ((char *) ptr + (tmp * size)); + } else if (errno != EINTR && errno != EAGAIN) + return -1; + if (errno == EAGAIN) /* Try later, *sigh* */ + usleep(10000); + } + return 0; +} + +static inline ssize_t read_all(int fd, char *buf, size_t count) +{ + ssize_t ret; + ssize_t c = 0; + int tries = 0; + + memset(buf, 0, count); + while (count > 0) { + ret = read(fd, buf, count); + if (ret <= 0) { + if ((errno == EAGAIN || errno == EINTR || ret == 0) && + (tries++ < 5)) + continue; + return c ? c : -1; + } + if (ret > 0) + tries = 0; + count -= ret; + buf += ret; + c += ret; + } + return c; +} + + +#endif /* UTIL_LINUX_ALL_IO_H */ |