]> git.ipfire.org Git - thirdparty/util-linux.git/blob - include/all-io.h
Merge branch '2012wk23' of git://github.com/kerolasa/lelux-utiliteetit
[thirdparty/util-linux.git] / include / all-io.h
1 #ifndef UTIL_LINUX_ALL_IO_H
2 #define UTIL_LINUX_ALL_IO_H
3
4 #include <string.h>
5 #include <unistd.h>
6 #include <errno.h>
7
8 static inline int write_all(int fd, const void *buf, size_t count)
9 {
10 while (count) {
11 ssize_t tmp;
12
13 errno = 0;
14 tmp = write(fd, buf, count);
15 if (tmp > 0) {
16 count -= tmp;
17 if (count)
18 buf = (void *) ((char *) buf + tmp);
19 } else if (errno != EINTR && errno != EAGAIN)
20 return -1;
21 if (errno == EAGAIN) /* Try later, *sigh* */
22 usleep(10000);
23 }
24 return 0;
25 }
26
27 static inline int fwrite_all(const void *ptr, size_t size,
28 size_t nmemb, FILE *stream)
29 {
30 while (nmemb) {
31 size_t tmp;
32
33 errno = 0;
34 tmp = fwrite(ptr, size, nmemb, stream);
35 if (tmp > 0) {
36 nmemb -= tmp;
37 if (nmemb)
38 ptr = (void *) ((char *) ptr + (tmp * size));
39 } else if (errno != EINTR && errno != EAGAIN)
40 return -1;
41 if (errno == EAGAIN) /* Try later, *sigh* */
42 usleep(10000);
43 }
44 return 0;
45 }
46
47 static inline ssize_t read_all(int fd, char *buf, size_t count)
48 {
49 ssize_t ret;
50 ssize_t c = 0;
51 int tries = 0;
52
53 memset(buf, 0, count);
54 while (count > 0) {
55 ret = read(fd, buf, count);
56 if (ret <= 0) {
57 if ((errno == EAGAIN || errno == EINTR || ret == 0) &&
58 (tries++ < 5))
59 continue;
60 return c ? c : -1;
61 }
62 if (ret > 0)
63 tries = 0;
64 count -= ret;
65 buf += ret;
66 c += ret;
67 }
68 return c;
69 }
70
71
72 #endif /* UTIL_LINUX_ALL_IO_H */