1 /* ISC license. */
2
3 #include <errno.h>
4 #include <skalibs/iopause.h>
5 #include <s6/ftrigr.h>
6
ftrigr_wait_and(ftrigr_t * a,uint16_t const * idlist,unsigned int n,tain_t const * deadline,tain_t * stamp)7 int ftrigr_wait_and (ftrigr_t *a, uint16_t const *idlist, unsigned int n, tain_t const *deadline, tain_t *stamp)
8 {
9 iopause_fd x = { -1, IOPAUSE_READ, 0 } ;
10 x.fd = ftrigr_fd(a) ;
11 for (; n ; n--, idlist++)
12 {
13 for (;;)
14 {
15 char dummy ;
16 int r = ftrigr_check(a, *idlist, &dummy) ;
17 if (r < 0) return r ;
18 else if (r) break ;
19 r = iopause_stamp(&x, 1, deadline, stamp) ;
20 if (r < 0) return r ;
21 else if (!r) return (errno = ETIMEDOUT, -1) ;
22 else if (ftrigr_updateb(a) < 0) return -1 ;
23 }
24 }
25
26 return 1 ;
27 }
28