]>
Commit | Line | Data |
---|---|---|
0f23ee0c KZ |
1 | /* |
2 | * No copyright is claimed. This code is in the public domain; do with | |
3 | * it what you wish. | |
4 | * | |
5 | * Written by Karel Zak <kzak@redhat.com> | |
6 | * Petr Uzel <petr.uzel@suse.cz> | |
7 | */ | |
8 | ||
e12c9866 PU |
9 | #ifndef UTIL_LINUX_ALL_IO_H |
10 | #define UTIL_LINUX_ALL_IO_H | |
77714312 KZ |
11 | |
12 | #include <string.h> | |
13 | #include <unistd.h> | |
14 | #include <errno.h> | |
15 | ||
2a31396a KZ |
16 | #include "c.h" |
17 | ||
77714312 KZ |
18 | static inline int write_all(int fd, const void *buf, size_t count) |
19 | { | |
330f5439 | 20 | while (count) { |
77714312 KZ |
21 | ssize_t tmp; |
22 | ||
23 | errno = 0; | |
24 | tmp = write(fd, buf, count); | |
25 | if (tmp > 0) { | |
26 | count -= tmp; | |
27 | if (count) | |
34708190 | 28 | buf = (const void *) ((const char *) buf + tmp); |
77714312 KZ |
29 | } else if (errno != EINTR && errno != EAGAIN) |
30 | return -1; | |
729def03 | 31 | if (errno == EAGAIN) /* Try later, *sigh* */ |
a5bd7939 | 32 | xusleep(250000); |
77714312 KZ |
33 | } |
34 | return 0; | |
35 | } | |
36 | ||
330f5439 KZ |
37 | static inline int fwrite_all(const void *ptr, size_t size, |
38 | size_t nmemb, FILE *stream) | |
39 | { | |
40 | while (nmemb) { | |
41 | size_t tmp; | |
42 | ||
43 | errno = 0; | |
44 | tmp = fwrite(ptr, size, nmemb, stream); | |
45 | if (tmp > 0) { | |
46 | nmemb -= tmp; | |
47 | if (nmemb) | |
34708190 | 48 | ptr = (const void *) ((const char *) ptr + (tmp * size)); |
330f5439 KZ |
49 | } else if (errno != EINTR && errno != EAGAIN) |
50 | return -1; | |
51 | if (errno == EAGAIN) /* Try later, *sigh* */ | |
a5bd7939 | 52 | xusleep(250000); |
330f5439 KZ |
53 | } |
54 | return 0; | |
55 | } | |
56 | ||
f80e9bc3 PU |
57 | static inline ssize_t read_all(int fd, char *buf, size_t count) |
58 | { | |
59 | ssize_t ret; | |
60 | ssize_t c = 0; | |
61 | int tries = 0; | |
62 | ||
63 | memset(buf, 0, count); | |
64 | while (count > 0) { | |
65 | ret = read(fd, buf, count); | |
66 | if (ret <= 0) { | |
1e0cd7ae | 67 | if (ret < 0 && (errno == EAGAIN || errno == EINTR) && (tries++ < 5)) { |
a5bd7939 | 68 | xusleep(250000); |
f80e9bc3 | 69 | continue; |
a5bd7939 | 70 | } |
f80e9bc3 PU |
71 | return c ? c : -1; |
72 | } | |
b2ce7d58 | 73 | tries = 0; |
f80e9bc3 PU |
74 | count -= ret; |
75 | buf += ret; | |
76 | c += ret; | |
77 | } | |
78 | return c; | |
79 | } | |
80 | ||
e12c9866 | 81 | #endif /* UTIL_LINUX_ALL_IO_H */ |