aboutsummaryrefslogtreecommitdiffstats
path: root/src/libstddjb/iopause_stamp.c
diff options
context:
space:
mode:
authorLaurent Bercot <ska-skaware@skarnet.org>2026-05-27 02:35:28 +0000
committerLaurent Bercot <ska-skaware@skarnet.org>2026-05-27 02:35:28 +0000
commit58c02e5fee86a059231fec3bc80b44774b1d603c (patch)
tree41623447f890d447e7b504d66510d5431faee0e9 /src/libstddjb/iopause_stamp.c
parenta668770a4268fd4c61ae365a90e354bd073755b4 (diff)
downloadskalibs-58c02e5fee86a059231fec3bc80b44774b1d603c.tar.gz
iopause: limit spurious returns. sarealpath: align no PATH_MAX case.
Diffstat (limited to 'src/libstddjb/iopause_stamp.c')
-rw-r--r--src/libstddjb/iopause_stamp.c22
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 ;
+ }
+ }
}