diff options
Diffstat (limited to 'src/libstddjb/iopause_stamp.c')
| -rw-r--r-- | src/libstddjb/iopause_stamp.c | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/src/libstddjb/iopause_stamp.c b/src/libstddjb/iopause_stamp.c index 890909b..0eb546b 100644 --- a/src/libstddjb/iopause_stamp.c +++ b/src/libstddjb/iopause_stamp.c @@ -8,10 +8,20 @@ int iopause_stamp (iopause_fd *x, unsigned int n, tain const *deadline, tain *stamp) { int e = errno ; - int r ; - do r = iopause(x, n, deadline, stamp) ; - while (r == -1 && errno == EINTR) ; - if (stamp) tain_now(stamp) ; - if (r >= 0) errno = e ; - return r ; + for (;;) + { + int r = iopause(x, n, deadline, stamp) ; + if (r == -1) + { + if (errno != EINTR) return -1 ; + if (stamp) tain_now(stamp) ; + } + else + { + if (stamp) tain_now(stamp) ; + errno = e ; + if (r > 0) return r ; + if (deadline && stamp && !tain_less(stamp, deadline)) return 0 ; + } + } } |
