0b47a8373c9a78a4732b401c40583471fc2f8573
3 * - wrappers for poll(2)
6 * This file is part of adns, which is
7 * Copyright (C) 1997-2000,2003,2006,2014 Ian Jackson
8 * Copyright (C) 1999-2000,2003,2006 Tony Finch
9 * Copyright (C) 1991 Massachusetts Institute of Technology
10 * (See the file INSTALL for full details.)
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 3, or (at your option)
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software Foundation.
33 int adns_beforepoll(adns_state ads
, struct pollfd
*fds
, int *nfds_io
,
34 int *timeout_io
, const struct timeval
*now
) {
35 struct timeval tv_nowbuf
, tv_tobuf
, *tv_to
;
36 int space
, found
, timeout_ms
, r
;
37 struct pollfd fds_tmp
[MAX_POLLFDS
];
39 adns__consistency(ads
,0,cc_entex
);
42 adns__must_gettimeofday(ads
,&now
,&tv_nowbuf
);
43 if (!now
) { *nfds_io
= 0; r
= 0; goto xit
; }
45 timeout_ms
= *timeout_io
;
46 if (timeout_ms
== -1) {
49 tv_tobuf
.tv_sec
= timeout_ms
/ 1000;
50 tv_tobuf
.tv_usec
= (timeout_ms
% 1000)*1000;
54 adns__timeouts(ads
, 0, &tv_to
,&tv_tobuf
, *now
);
57 assert(tv_to
== &tv_tobuf
);
58 timeout_ms
= (tv_tobuf
.tv_usec
+999)/1000;
59 assert(tv_tobuf
.tv_sec
< (INT_MAX
-timeout_ms
)/1000);
60 timeout_ms
+= tv_tobuf
.tv_sec
*1000;
64 *timeout_io
= timeout_ms
;
68 if (space
>= MAX_POLLFDS
) {
69 found
= adns__pollfds(ads
,fds
);
72 found
= adns__pollfds(ads
,fds_tmp
);
74 if (space
< found
) { r
= ERANGE
; goto xit
; }
75 memcpy(fds
,fds_tmp
,sizeof(struct pollfd
)*found
);
79 adns__returning(ads
,0);
83 void adns_afterpoll(adns_state ads
, const struct pollfd
*fds
, int nfds
,
84 const struct timeval
*now
) {
85 struct timeval tv_buf
;
87 adns__consistency(ads
,0,cc_entex
);
88 adns__must_gettimeofday(ads
,&now
,&tv_buf
);
90 adns__timeouts(ads
, 1, 0,0, *now
);
91 adns__fdevents(ads
, fds
,nfds
, 0,0,0,0, *now
,0);
93 adns__returning(ads
,0);
96 int adns_wait_poll(adns_state ads
,
98 adns_answer
**answer_r
,
101 struct pollfd fds
[MAX_POLLFDS
];
103 adns__consistency(ads
,0,cc_entex
);
106 r
= adns__internal_check(ads
,query_io
,answer_r
,context_r
);
107 if (r
!= EAGAIN
) goto xit
;
108 nfds
= MAX_POLLFDS
; to
= -1;
109 adns_beforepoll(ads
,fds
,&nfds
,&to
,0);
110 r
= poll(fds
,nfds
,to
);
112 if (errno
== EINTR
) {
113 if (ads
->iflags
& adns_if_eintr
) { r
= EINTR
; goto xit
; }
115 adns__diag(ads
,-1,0,"poll failed in wait: %s",strerror(errno
));
116 adns_globalsystemfailure(ads
);
120 adns_afterpoll(ads
,fds
,nfds
,0);
125 adns__returning(ads
,0);