Update to upstream util-linux 2.20.1
[framework/base/util-linux-ng.git] / include / writeall.h
1 #ifndef UTIL_LINUX_WRITEALL_H
2 #define UTIL_LINUX_WRITEALL_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 += 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 += (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 #endif /* UTIL_LINUX_WRITEALL_H */