xref: /minix3/external/bsd/bind/dist/bin/tests/virtual-time/vtwrapper.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: vtwrapper.c,v 1.4 2014/12/10 04:37:54 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2010  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  *
6*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
7*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
8*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
9*00b67f09SDavid van Moolenbroek  *
10*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
11*00b67f09SDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
12*00b67f09SDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
13*00b67f09SDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
14*00b67f09SDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
15*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16*00b67f09SDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
17*00b67f09SDavid van Moolenbroek  */
18*00b67f09SDavid van Moolenbroek 
19*00b67f09SDavid van Moolenbroek /* Id: vtwrapper.c,v 1.4 2010/08/12 09:31:50 fdupont Exp  */
20*00b67f09SDavid van Moolenbroek 
21*00b67f09SDavid van Moolenbroek #define _GNU_SOURCE
22*00b67f09SDavid van Moolenbroek #include <sys/syscall.h>
23*00b67f09SDavid van Moolenbroek #include <sys/time.h>
24*00b67f09SDavid van Moolenbroek #include <sys/types.h>
25*00b67f09SDavid van Moolenbroek #include <math.h>
26*00b67f09SDavid van Moolenbroek #include <unistd.h>
27*00b67f09SDavid van Moolenbroek #include <stdlib.h>
28*00b67f09SDavid van Moolenbroek #include <stdio.h>
29*00b67f09SDavid van Moolenbroek #ifdef SYS_select
30*00b67f09SDavid van Moolenbroek #include <sys/select.h>
31*00b67f09SDavid van Moolenbroek #endif
32*00b67f09SDavid van Moolenbroek #ifdef SYS_poll
33*00b67f09SDavid van Moolenbroek #include <poll.h>
34*00b67f09SDavid van Moolenbroek #endif
35*00b67f09SDavid van Moolenbroek #ifdef SYS_kevent
36*00b67f09SDavid van Moolenbroek #include <sys/event.h>
37*00b67f09SDavid van Moolenbroek #endif
38*00b67f09SDavid van Moolenbroek #ifdef SYS_epoll_wait
39*00b67f09SDavid van Moolenbroek #include <sys/epoll.h>
40*00b67f09SDavid van Moolenbroek #endif
41*00b67f09SDavid van Moolenbroek 
42*00b67f09SDavid van Moolenbroek 
43*00b67f09SDavid van Moolenbroek #ifdef SYS_gettimeofday
44*00b67f09SDavid van Moolenbroek #define VIRTUAL_TIME
45*00b67f09SDavid van Moolenbroek #ifdef VIRTUAL_TIME
46*00b67f09SDavid van Moolenbroek static struct timeval epoch = { 0, 0 };
47*00b67f09SDavid van Moolenbroek static int _init_called = 0;
48*00b67f09SDavid van Moolenbroek 
49*00b67f09SDavid van Moolenbroek void
_init(void)50*00b67f09SDavid van Moolenbroek _init(void) {
51*00b67f09SDavid van Moolenbroek 	(void)syscall(SYS_gettimeofday, &epoch, NULL);
52*00b67f09SDavid van Moolenbroek 	_init_called = 1;
53*00b67f09SDavid van Moolenbroek }
54*00b67f09SDavid van Moolenbroek 
55*00b67f09SDavid van Moolenbroek static void
absolute_inflate(struct timeval * vt,struct timeval * rt)56*00b67f09SDavid van Moolenbroek absolute_inflate(struct timeval *vt, struct timeval *rt)
57*00b67f09SDavid van Moolenbroek {
58*00b67f09SDavid van Moolenbroek 	double d;
59*00b67f09SDavid van Moolenbroek 
60*00b67f09SDavid van Moolenbroek 	rt->tv_sec = vt->tv_sec;
61*00b67f09SDavid van Moolenbroek 	rt->tv_usec = vt->tv_usec;
62*00b67f09SDavid van Moolenbroek 
63*00b67f09SDavid van Moolenbroek 	if ((epoch.tv_sec > vt->tv_sec) ||
64*00b67f09SDavid van Moolenbroek 	    ((epoch.tv_sec == vt->tv_sec) && (epoch.tv_usec > vt->tv_usec)))
65*00b67f09SDavid van Moolenbroek 		return;
66*00b67f09SDavid van Moolenbroek 
67*00b67f09SDavid van Moolenbroek 	rt->tv_sec -= epoch.tv_sec;
68*00b67f09SDavid van Moolenbroek 	rt->tv_usec -= epoch.tv_usec;
69*00b67f09SDavid van Moolenbroek 	while (rt->tv_usec < 0) {
70*00b67f09SDavid van Moolenbroek 		rt->tv_sec -= 1;
71*00b67f09SDavid van Moolenbroek 		rt->tv_usec += 1000000;
72*00b67f09SDavid van Moolenbroek 	}
73*00b67f09SDavid van Moolenbroek 
74*00b67f09SDavid van Moolenbroek 	if (rt->tv_sec == 0)
75*00b67f09SDavid van Moolenbroek 		goto done;
76*00b67f09SDavid van Moolenbroek 
77*00b67f09SDavid van Moolenbroek 	d = (double) (rt->tv_sec - 1);
78*00b67f09SDavid van Moolenbroek 	d += (double) rt->tv_usec / 1000000.;
79*00b67f09SDavid van Moolenbroek 	d = exp(d);
80*00b67f09SDavid van Moolenbroek 	rt->tv_sec = (time_t) d;
81*00b67f09SDavid van Moolenbroek 	d -= (double) rt->tv_sec;
82*00b67f09SDavid van Moolenbroek 	rt->tv_usec = (suseconds_t) (d * 1000000.);
83*00b67f09SDavid van Moolenbroek 
84*00b67f09SDavid van Moolenbroek  done:
85*00b67f09SDavid van Moolenbroek 	rt->tv_sec += epoch.tv_sec;
86*00b67f09SDavid van Moolenbroek 	rt->tv_usec += epoch.tv_usec;
87*00b67f09SDavid van Moolenbroek 	while (rt->tv_usec >= 1000000) {
88*00b67f09SDavid van Moolenbroek 		rt->tv_sec += 1;
89*00b67f09SDavid van Moolenbroek 		rt->tv_usec -= 1000000;
90*00b67f09SDavid van Moolenbroek 	}
91*00b67f09SDavid van Moolenbroek 	return;
92*00b67f09SDavid van Moolenbroek }
93*00b67f09SDavid van Moolenbroek 
94*00b67f09SDavid van Moolenbroek static void
absolute_deflate(struct timeval * rt,struct timeval * vt)95*00b67f09SDavid van Moolenbroek absolute_deflate(struct timeval *rt, struct timeval *vt) {
96*00b67f09SDavid van Moolenbroek 	double d;
97*00b67f09SDavid van Moolenbroek 
98*00b67f09SDavid van Moolenbroek 	vt->tv_sec = rt->tv_sec;
99*00b67f09SDavid van Moolenbroek 	vt->tv_usec = rt->tv_usec;
100*00b67f09SDavid van Moolenbroek 
101*00b67f09SDavid van Moolenbroek 	if ((epoch.tv_sec > rt->tv_sec) ||
102*00b67f09SDavid van Moolenbroek 	    ((epoch.tv_sec == rt->tv_sec) && (epoch.tv_usec > rt->tv_usec)))
103*00b67f09SDavid van Moolenbroek 		return;
104*00b67f09SDavid van Moolenbroek 
105*00b67f09SDavid van Moolenbroek 	vt->tv_sec -= epoch.tv_sec;
106*00b67f09SDavid van Moolenbroek 	vt->tv_usec -= epoch.tv_usec;
107*00b67f09SDavid van Moolenbroek 	while (vt->tv_usec < 0) {
108*00b67f09SDavid van Moolenbroek 		vt->tv_sec -= 1;
109*00b67f09SDavid van Moolenbroek 		vt->tv_usec += 1000000;
110*00b67f09SDavid van Moolenbroek 	}
111*00b67f09SDavid van Moolenbroek 
112*00b67f09SDavid van Moolenbroek 	if (vt->tv_sec == 0)
113*00b67f09SDavid van Moolenbroek 		goto done;
114*00b67f09SDavid van Moolenbroek 
115*00b67f09SDavid van Moolenbroek 	d = (double) vt->tv_sec;
116*00b67f09SDavid van Moolenbroek 	d += (double) vt->tv_usec / 1000000.;
117*00b67f09SDavid van Moolenbroek 	d = log(d);
118*00b67f09SDavid van Moolenbroek 	vt->tv_sec = (time_t) d;
119*00b67f09SDavid van Moolenbroek 	d -= (double) vt->tv_sec;
120*00b67f09SDavid van Moolenbroek 	vt->tv_sec += 1;
121*00b67f09SDavid van Moolenbroek 	vt->tv_usec = (suseconds_t) (d * 1000000.);
122*00b67f09SDavid van Moolenbroek 
123*00b67f09SDavid van Moolenbroek  done:
124*00b67f09SDavid van Moolenbroek 	vt->tv_sec += epoch.tv_sec;
125*00b67f09SDavid van Moolenbroek 	vt->tv_usec += epoch.tv_usec;
126*00b67f09SDavid van Moolenbroek 	while (vt->tv_usec >= 1000000) {
127*00b67f09SDavid van Moolenbroek 		vt->tv_sec += 1;
128*00b67f09SDavid van Moolenbroek 		vt->tv_usec -= 1000000;
129*00b67f09SDavid van Moolenbroek 	}
130*00b67f09SDavid van Moolenbroek 	return;
131*00b67f09SDavid van Moolenbroek }
132*00b67f09SDavid van Moolenbroek 
133*00b67f09SDavid van Moolenbroek static void
interval_inflate(struct timeval * vt,struct timeval * rt)134*00b67f09SDavid van Moolenbroek interval_inflate(struct timeval *vt, struct timeval *rt) {
135*00b67f09SDavid van Moolenbroek 	struct timeval now, tv;
136*00b67f09SDavid van Moolenbroek 
137*00b67f09SDavid van Moolenbroek 	(void) gettimeofday(&now, NULL);
138*00b67f09SDavid van Moolenbroek 
139*00b67f09SDavid van Moolenbroek 	absolute_deflate(&now, &tv);
140*00b67f09SDavid van Moolenbroek 
141*00b67f09SDavid van Moolenbroek 	tv.tv_sec += vt->tv_sec;
142*00b67f09SDavid van Moolenbroek 	tv.tv_usec += vt->tv_usec;
143*00b67f09SDavid van Moolenbroek 	while (tv.tv_usec >= 1000000) {
144*00b67f09SDavid van Moolenbroek 		tv.tv_sec += 1;
145*00b67f09SDavid van Moolenbroek 		tv.tv_usec -= 1000000;
146*00b67f09SDavid van Moolenbroek 	}
147*00b67f09SDavid van Moolenbroek 
148*00b67f09SDavid van Moolenbroek 	absolute_inflate(&tv, rt);
149*00b67f09SDavid van Moolenbroek 
150*00b67f09SDavid van Moolenbroek 	rt->tv_sec -= now.tv_sec;
151*00b67f09SDavid van Moolenbroek 	rt->tv_usec -= now.tv_usec;
152*00b67f09SDavid van Moolenbroek 	if (rt->tv_usec < 0) {
153*00b67f09SDavid van Moolenbroek 		rt->tv_sec -= 1;
154*00b67f09SDavid van Moolenbroek 		rt->tv_usec += 1000000;
155*00b67f09SDavid van Moolenbroek 	}
156*00b67f09SDavid van Moolenbroek 	return;
157*00b67f09SDavid van Moolenbroek }
158*00b67f09SDavid van Moolenbroek 
159*00b67f09SDavid van Moolenbroek static void
interval_deflate(struct timeval * rt,struct timeval * vt)160*00b67f09SDavid van Moolenbroek interval_deflate(struct timeval *rt, struct timeval *vt) {
161*00b67f09SDavid van Moolenbroek 	struct timeval now, tv;
162*00b67f09SDavid van Moolenbroek 
163*00b67f09SDavid van Moolenbroek 	vt->tv_sec = rt->tv_sec;
164*00b67f09SDavid van Moolenbroek 	vt->tv_usec = rt->tv_usec;
165*00b67f09SDavid van Moolenbroek 
166*00b67f09SDavid van Moolenbroek 	if ((vt->tv_sec == 0) && (vt->tv_usec <= 10000))
167*00b67f09SDavid van Moolenbroek 		return;
168*00b67f09SDavid van Moolenbroek 
169*00b67f09SDavid van Moolenbroek 	(void) gettimeofday(&now, NULL);
170*00b67f09SDavid van Moolenbroek 
171*00b67f09SDavid van Moolenbroek 	tv.tv_sec = now.tv_sec + rt->tv_sec;
172*00b67f09SDavid van Moolenbroek 	tv.tv_usec = now.tv_usec + rt->tv_usec;
173*00b67f09SDavid van Moolenbroek 	while (tv.tv_usec >= 1000000) {
174*00b67f09SDavid van Moolenbroek 		tv.tv_sec += 1;
175*00b67f09SDavid van Moolenbroek 		tv.tv_usec -= 1000000;
176*00b67f09SDavid van Moolenbroek 	}
177*00b67f09SDavid van Moolenbroek 
178*00b67f09SDavid van Moolenbroek 	absolute_deflate(&now, &now);
179*00b67f09SDavid van Moolenbroek 	absolute_deflate(&tv, vt);
180*00b67f09SDavid van Moolenbroek 
181*00b67f09SDavid van Moolenbroek 	vt->tv_sec -= now.tv_sec;
182*00b67f09SDavid van Moolenbroek 	vt->tv_usec -= now.tv_usec;
183*00b67f09SDavid van Moolenbroek 	while (vt->tv_usec < 0) {
184*00b67f09SDavid van Moolenbroek 		vt->tv_sec -= 1;
185*00b67f09SDavid van Moolenbroek 		vt->tv_usec += 1000000;
186*00b67f09SDavid van Moolenbroek 	}
187*00b67f09SDavid van Moolenbroek 
188*00b67f09SDavid van Moolenbroek 	if ((vt->tv_sec == 0) && (vt->tv_usec < 10000))
189*00b67f09SDavid van Moolenbroek 		vt->tv_usec = 10000;
190*00b67f09SDavid van Moolenbroek 	return;
191*00b67f09SDavid van Moolenbroek }
192*00b67f09SDavid van Moolenbroek #endif
193*00b67f09SDavid van Moolenbroek 
194*00b67f09SDavid van Moolenbroek int
gettimeofday(struct timeval * tv,struct timezone * tz)195*00b67f09SDavid van Moolenbroek gettimeofday(struct timeval *tv, struct timezone *tz) {
196*00b67f09SDavid van Moolenbroek #ifdef VIRTUAL_TIME
197*00b67f09SDavid van Moolenbroek 	struct timeval now;
198*00b67f09SDavid van Moolenbroek 	int ret;
199*00b67f09SDavid van Moolenbroek 
200*00b67f09SDavid van Moolenbroek 	if (!_init_called) _init();
201*00b67f09SDavid van Moolenbroek 
202*00b67f09SDavid van Moolenbroek 	if (epoch.tv_sec == 0)
203*00b67f09SDavid van Moolenbroek 		return syscall(SYS_gettimeofday, tv, tz);
204*00b67f09SDavid van Moolenbroek 
205*00b67f09SDavid van Moolenbroek 	ret = syscall(SYS_gettimeofday, &now, tz);
206*00b67f09SDavid van Moolenbroek 	if (ret == 0)
207*00b67f09SDavid van Moolenbroek 		absolute_inflate(&now, tv);
208*00b67f09SDavid van Moolenbroek 	return ret;
209*00b67f09SDavid van Moolenbroek #else
210*00b67f09SDavid van Moolenbroek 	return syscall(SYS_gettimeofday, tv, tz);
211*00b67f09SDavid van Moolenbroek #endif
212*00b67f09SDavid van Moolenbroek }
213*00b67f09SDavid van Moolenbroek 
214*00b67f09SDavid van Moolenbroek #ifdef SYS_select
215*00b67f09SDavid van Moolenbroek int
select(int nfds,fd_set * rfds,fd_set * wfds,fd_set * xfds,struct timeval * timeout)216*00b67f09SDavid van Moolenbroek select(int nfds, fd_set *rfds, fd_set *wfds, fd_set *xfds,
217*00b67f09SDavid van Moolenbroek        struct timeval *timeout)
218*00b67f09SDavid van Moolenbroek {
219*00b67f09SDavid van Moolenbroek #ifdef VIRTUAL_TIME
220*00b67f09SDavid van Moolenbroek 	struct timeval tv;
221*00b67f09SDavid van Moolenbroek 
222*00b67f09SDavid van Moolenbroek 	if (!_init_called) _init();
223*00b67f09SDavid van Moolenbroek 
224*00b67f09SDavid van Moolenbroek 	if (epoch.tv_sec == 0 || timeout == NULL ||
225*00b67f09SDavid van Moolenbroek 	    (timeout->tv_sec == 0 && timeout->tv_usec == 0))
226*00b67f09SDavid van Moolenbroek 		return syscall(SYS_select, nfds, rfds, wfds, xfds, timeout);
227*00b67f09SDavid van Moolenbroek 
228*00b67f09SDavid van Moolenbroek 	interval_deflate(timeout, &tv);
229*00b67f09SDavid van Moolenbroek 	return syscall(SYS_select, nfds, rfds, wfds, xfds, &tv);
230*00b67f09SDavid van Moolenbroek #else
231*00b67f09SDavid van Moolenbroek 	return syscall(SYS_select, nfds, rfds, wfds, xfds, timeout);
232*00b67f09SDavid van Moolenbroek #endif
233*00b67f09SDavid van Moolenbroek }
234*00b67f09SDavid van Moolenbroek #endif
235*00b67f09SDavid van Moolenbroek 
236*00b67f09SDavid van Moolenbroek #ifdef SYS_poll
237*00b67f09SDavid van Moolenbroek int
poll(struct pollfd fds[],nfds_t nfds,int timeout)238*00b67f09SDavid van Moolenbroek poll(struct pollfd fds[], nfds_t nfds, int timeout) {
239*00b67f09SDavid van Moolenbroek #ifdef VIRTUAL_TIME
240*00b67f09SDavid van Moolenbroek 	struct timeval in, out;
241*00b67f09SDavid van Moolenbroek 
242*00b67f09SDavid van Moolenbroek 	if (!_init_called) _init();
243*00b67f09SDavid van Moolenbroek 
244*00b67f09SDavid van Moolenbroek 	if (timeout <= 0 || epoch.tv_sec == 0)
245*00b67f09SDavid van Moolenbroek 		return syscall(SYS_poll, fds, nfds, timeout);
246*00b67f09SDavid van Moolenbroek 
247*00b67f09SDavid van Moolenbroek 	in.tv_sec = timeout / 1000;
248*00b67f09SDavid van Moolenbroek 	in.tv_usec = (timeout % 1000) * 1000;
249*00b67f09SDavid van Moolenbroek 	interval_deflate(&in, &out);
250*00b67f09SDavid van Moolenbroek 	timeout = out.tv_sec * 1000 + out.tv_usec / 1000;
251*00b67f09SDavid van Moolenbroek 	return syscall(SYS_poll, fds, nfds, timeout);
252*00b67f09SDavid van Moolenbroek #else
253*00b67f09SDavid van Moolenbroek 	return syscall(SYS_poll, fds, nfds, timeout);
254*00b67f09SDavid van Moolenbroek #endif
255*00b67f09SDavid van Moolenbroek }
256*00b67f09SDavid van Moolenbroek #endif
257*00b67f09SDavid van Moolenbroek 
258*00b67f09SDavid van Moolenbroek #ifdef SYS_kevent
259*00b67f09SDavid van Moolenbroek int
kevent(int kq,struct kevent * changelist,int nchanges,struct kevent * eventlist,int nevents,const struct timespec * timeout)260*00b67f09SDavid van Moolenbroek kevent(int kq, struct kevent *changelist, int nchanges,
261*00b67f09SDavid van Moolenbroek        struct kevent *eventlist, int nevents, const struct timespec *timeout)
262*00b67f09SDavid van Moolenbroek {
263*00b67f09SDavid van Moolenbroek #ifdef VIRTUAL_TIME
264*00b67f09SDavid van Moolenbroek 	struct timeval in, out;
265*00b67f09SDavid van Moolenbroek 	struct timespec ts;
266*00b67f09SDavid van Moolenbroek 
267*00b67f09SDavid van Moolenbroek 	if (!_init_called) _init();
268*00b67f09SDavid van Moolenbroek 
269*00b67f09SDavid van Moolenbroek 	if (epoch.tv_sec == 0 || timeout == NULL ||
270*00b67f09SDavid van Moolenbroek 	    (timeout->tv_sec == 0 && timeout->tv_nsec == 0))
271*00b67f09SDavid van Moolenbroek 		return syscall(SYS_kevent, kq, changelist, nchanges,
272*00b67f09SDavid van Moolenbroek 			       eventlist, nevents, timeout);
273*00b67f09SDavid van Moolenbroek 
274*00b67f09SDavid van Moolenbroek 	in.tv_sec = timeout->tv_sec;
275*00b67f09SDavid van Moolenbroek 	in.tv_usec = timeout->tv_nsec / 1000;
276*00b67f09SDavid van Moolenbroek 	interval_deflate(&in, &out);
277*00b67f09SDavid van Moolenbroek 	ts.tv_sec = out.tv_sec;
278*00b67f09SDavid van Moolenbroek 	ts.tv_nsec = out.tv_usec * 1000;
279*00b67f09SDavid van Moolenbroek 	return syscall(SYS_kevent, kq, changelist, nchanges, eventlist,
280*00b67f09SDavid van Moolenbroek 		       nevents, &ts);
281*00b67f09SDavid van Moolenbroek #else
282*00b67f09SDavid van Moolenbroek 	return syscall(SYS_kevent, kq, changelist, nchanges, eventlist,
283*00b67f09SDavid van Moolenbroek 		       nevents, timeout);
284*00b67f09SDavid van Moolenbroek #endif
285*00b67f09SDavid van Moolenbroek }
286*00b67f09SDavid van Moolenbroek #endif
287*00b67f09SDavid van Moolenbroek 
288*00b67f09SDavid van Moolenbroek #ifdef SYS_epoll_wait
289*00b67f09SDavid van Moolenbroek int
epoll_wait(int fd,struct epoll_event * events,int maxevents,int timeout)290*00b67f09SDavid van Moolenbroek epoll_wait(int fd, struct epoll_event *events, int maxevents, int timeout) {
291*00b67f09SDavid van Moolenbroek #ifdef VIRTUAL_TIME
292*00b67f09SDavid van Moolenbroek 	struct timeval in, out;
293*00b67f09SDavid van Moolenbroek 
294*00b67f09SDavid van Moolenbroek 	if (!_init_called) _init();
295*00b67f09SDavid van Moolenbroek 
296*00b67f09SDavid van Moolenbroek 	if (timeout == 0 || timeout == -1 || epoch.tv_sec == 0)
297*00b67f09SDavid van Moolenbroek 		return syscall(SYS_epoll_wait, fd, events, maxevents, timeout);
298*00b67f09SDavid van Moolenbroek 
299*00b67f09SDavid van Moolenbroek 	in.tv_sec = timeout / 1000;
300*00b67f09SDavid van Moolenbroek 	in.tv_usec = (timeout % 1000) * 1000;
301*00b67f09SDavid van Moolenbroek 	interval_deflate(&in, &out);
302*00b67f09SDavid van Moolenbroek 	timeout = out.tv_sec * 1000 + out.tv_usec / 1000;
303*00b67f09SDavid van Moolenbroek 	return syscall(SYS_poll, fd, events, maxevents, timeout);
304*00b67f09SDavid van Moolenbroek #else
305*00b67f09SDavid van Moolenbroek 	return syscall(SYS_poll, fd, events, maxevents, timeout);
306*00b67f09SDavid van Moolenbroek #endif
307*00b67f09SDavid van Moolenbroek }
308*00b67f09SDavid van Moolenbroek #endif
309*00b67f09SDavid van Moolenbroek #endif
310