3 * - wrappers for poll(2)
6 * This file is part of adns, which is Copyright (C) 1997-1999 Ian Jackson
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2, or (at your option)
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software Foundation,
20 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
29 int adns_beforepoll(adns_state ads
, struct pollfd
*fds
, int *nfds_io
, int *timeout_io
,
30 const struct timeval
*now
) {
31 struct timeval tv_nowbuf
, tv_tobuf
, *tv_to
;
32 int space
, found
, timeout_ms
;
33 struct pollfd fds_tmp
[MAX_POLLFDS
];
35 adns__must_gettimeofday(ads
,&now
,&tv_nowbuf
);
36 if (!now
) { *nfds_io
= 0; return 0; }
38 timeout_ms
= *timeout_io
;
39 if (timeout_ms
== -1) {
42 tv_tobuf
.tv_sec
= timeout_ms
/ 1000;
43 tv_tobuf
.tv_usec
= (timeout_ms
% 1000)*1000;
47 adns__timeouts(ads
, 1, &tv_to
,&tv_tobuf
, *now
);
50 assert(tv_to
== &tv_tobuf
);
51 timeout_ms
= (tv_tobuf
.tv_usec
+999)/1000;
52 assert(tv_tobuf
.tv_sec
< (INT_MAX
-timeout_ms
)/1000);
53 timeout_ms
+= tv_tobuf
.tv_sec
*1000;
57 *timeout_io
= timeout_ms
;
60 if (space
>= MAX_POLLFDS
) {
61 found
= adns__pollfds(ads
,fds
);
64 found
= adns__pollfds(ads
,fds_tmp
);
66 if (found
< space
) return space ? ERANGE
: 0;
67 memcpy(fds
,fds_tmp
,sizeof(struct pollfd
)*found
);
72 void adns_afterpoll(adns_state ads
, const struct pollfd
*fds
, int nfds
,
73 const struct timeval
*now
) {
74 struct timeval tv_buf
;
76 adns__must_gettimeofday(ads
,&now
,&tv_buf
);
79 adns__timeouts(ads
,1, 0,0, *now
);
80 adns__fdevents(ads
, fds
,nfds
, 0,0,0,0, *now
,0);