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; |
32 | int space, found, timeout_ms; |
33 | struct pollfd fds_tmp[MAX_POLLFDS]; |
34 | |
35 | adns__must_gettimeofday(ads,&now,&tv_nowbuf); |
36 | if (!now) { *nfds_io= 0; return 0; } |
37 | |
38 | timeout_ms= *timeout_io; |
39 | if (timeout_ms == -1) { |
40 | tv_to= 0; |
41 | } else { |
42 | tv_tobuf.tv_sec= timeout_ms / 1000; |
43 | tv_tobuf.tv_usec= (timeout_ms % 1000)*1000; |
44 | tv_to= &tv_tobuf; |
45 | } |
46 | |
47 | adns__timeouts(ads, 1, &tv_to,&tv_tobuf, *now); |
48 | |
49 | if (tv_to) { |
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; |
54 | } else { |
55 | timeout_ms= -1; |
56 | } |
57 | *timeout_io= timeout_ms; |
58 | |
59 | space= *nfds_io; |
60 | if (space >= MAX_POLLFDS) { |
61 | found= adns__pollfds(ads,fds); |
62 | *nfds_io= found; |
63 | } else { |
64 | found= adns__pollfds(ads,fds_tmp); |
65 | *nfds_io= found; |
66 | if (found < space) return space ? ERANGE : 0; |
67 | memcpy(fds,fds_tmp,sizeof(struct pollfd)*found); |
68 | } |
69 | return 0; |
70 | } |
71 | |
72 | void adns_afterpoll(adns_state ads, const struct pollfd *fds, int nfds, |
73 | const struct timeval *now) { |
74 | struct timeval tv_buf; |
75 | |
76 | adns__must_gettimeofday(ads,&now,&tv_buf); |
77 | if (!now) return; |
78 | |
79 | adns__timeouts(ads,1, 0,0, *now); |
80 | adns__fdevents(ads, fds,nfds, 0,0,0,0, *now,0); |
81 | } |
82 | |
83 | #endif |