| /* | 
 |  * 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* */ | 
 | 			xusleep(250000); | 
 | 	} | 
 | 	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* */ | 
 | 			xusleep(250000); | 
 | 	} | 
 | 	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)) { | 
 | 				xusleep(250000); | 
 | 				continue; | 
 | 			} | 
 | 			return c ? c : -1; | 
 | 		} | 
 | 		if (ret > 0) | 
 | 			tries = 0; | 
 | 		count -= ret; | 
 | 		buf += ret; | 
 | 		c += ret; | 
 | 	} | 
 | 	return c; | 
 | } | 
 |  | 
 |  | 
 | #endif /* UTIL_LINUX_ALL_IO_H */ |