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