620c146d |
1 | /* |
2 | * poll.c |
3 | * - wrappers for poll(2) |
4 | */ |
5 | /* |
6 | * This file is part of adns, which is Copyright (C) 1997-1999 Ian Jackson |
7 | * |
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) |
11 | * any later version. |
12 | * |
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. |
17 | * |
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. |
21 | */ |
22 | |
23 | #include <limits.h> |
24 | |
25 | #include "internal.h" |
26 | |
27 | #ifdef HAVE_POLL |
28 | |
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; |
3e2e5fab |
32 | int space, found, timeout_ms, r; |
620c146d |
33 | struct pollfd fds_tmp[MAX_POLLFDS]; |
34 | |
3e2e5fab |
35 | adns__consistency(ads,cc_entex); |
36 | |
fc6a52ae |
37 | if (timeout_io) { |
38 | adns__must_gettimeofday(ads,&now,&tv_nowbuf); |
3e2e5fab |
39 | if (!now) { *nfds_io= 0; r= 0; goto xit; } |
620c146d |
40 | |
fc6a52ae |
41 | timeout_ms= *timeout_io; |
42 | if (timeout_ms == -1) { |
43 | tv_to= 0; |
44 | } else { |
45 | tv_tobuf.tv_sec= timeout_ms / 1000; |
46 | tv_tobuf.tv_usec= (timeout_ms % 1000)*1000; |
47 | tv_to= &tv_tobuf; |
48 | } |
620c146d |
49 | |
fc6a52ae |
50 | adns__timeouts(ads, 0, &tv_to,&tv_tobuf, *now); |
620c146d |
51 | |
fc6a52ae |
52 | if (tv_to) { |
53 | assert(tv_to == &tv_tobuf); |
54 | timeout_ms= (tv_tobuf.tv_usec+999)/1000; |
55 | assert(tv_tobuf.tv_sec < (INT_MAX-timeout_ms)/1000); |
56 | timeout_ms += tv_tobuf.tv_sec*1000; |
57 | } else { |
58 | timeout_ms= -1; |
59 | } |
60 | *timeout_io= timeout_ms; |
620c146d |
61 | } |
620c146d |
62 | |
63 | space= *nfds_io; |
64 | if (space >= MAX_POLLFDS) { |
65 | found= adns__pollfds(ads,fds); |
66 | *nfds_io= found; |
67 | } else { |
68 | found= adns__pollfds(ads,fds_tmp); |
69 | *nfds_io= found; |
3e2e5fab |
70 | if (space < found) { r= ERANGE; goto xit; } |
620c146d |
71 | memcpy(fds,fds_tmp,sizeof(struct pollfd)*found); |
72 | } |
3e2e5fab |
73 | r= 0; |
74 | xit: |
75 | adns__consistency(ads,cc_entex); |
76 | return r; |
620c146d |
77 | } |
78 | |
79 | void adns_afterpoll(adns_state ads, const struct pollfd *fds, int nfds, |
80 | const struct timeval *now) { |
81 | struct timeval tv_buf; |
82 | |
3e2e5fab |
83 | adns__consistency(ads,cc_entex); |
620c146d |
84 | adns__must_gettimeofday(ads,&now,&tv_buf); |
3e2e5fab |
85 | if (now) { |
86 | adns__timeouts(ads, 1, 0,0, *now); |
87 | adns__fdevents(ads, fds,nfds, 0,0,0,0, *now,0); |
88 | } |
89 | adns__consistency(ads,cc_entex); |
620c146d |
90 | } |
91 | |
92 | #endif |