Correct use of SOFT vs WAITS_FOR dependency type in various places.
[oweals/dinit.git] / src / dinit-util.h
1 #ifndef DINIT_UTIL_H_INCLUDED
2 #define DINIT_UTIL_H_INCLUDED 1
3
4 #include <cerrno>
5
6 // Signal-safe read. Read and re-try if interrupted by signal (EINTR).
7 // *May* affect errno even on a successful read (when the return is less than n).
8 inline ssize_t ss_read(int fd, void * buf, size_t n)
9 {
10     char * cbuf = static_cast<char *>(buf);
11     ssize_t r = 0;
12     while ((size_t)r < n) {
13         ssize_t res = read(fd, cbuf + r, n - r);
14         if (res == 0) {
15             return r;
16         }
17         if (res < 0) {
18             if (res == EINTR) {
19                 continue;
20             }
21
22             // If any other error, and we have successfully read some, return it:
23             if (r == 0) {
24                 return -1;
25             }
26             else {
27                 return r;
28             }
29         }
30         r += res;
31     }
32     return n;
33 }
34
35 #endif