xref: /linux/tools/include/nolibc/poll.h (revision 015a99fa76650e7d6efa3e36f20c0f5b346fe9ce)
1dc2c656eSThomas Weißschuh /* SPDX-License-Identifier: LGPL-2.1 OR MIT */
2dc2c656eSThomas Weißschuh /*
3dc2c656eSThomas Weißschuh  * poll definitions for NOLIBC
4dc2c656eSThomas Weißschuh  * Copyright (C) 2017-2021 Willy Tarreau <w@1wt.eu>
5dc2c656eSThomas Weißschuh  */
6dc2c656eSThomas Weißschuh 
7dc2c656eSThomas Weißschuh /* make sure to include all global symbols */
8dc2c656eSThomas Weißschuh #include "nolibc.h"
9dc2c656eSThomas Weißschuh 
10dc2c656eSThomas Weißschuh #ifndef _NOLIBC_POLL_H
11dc2c656eSThomas Weißschuh #define _NOLIBC_POLL_H
12dc2c656eSThomas Weißschuh 
13dc2c656eSThomas Weißschuh #include "arch.h"
14dc2c656eSThomas Weißschuh #include "sys.h"
15dc2c656eSThomas Weißschuh 
16*1f421ddfSThomas Weißschuh #include <linux/poll.h>
17dc2c656eSThomas Weißschuh #include <linux/time.h>
18dc2c656eSThomas Weißschuh 
19dc2c656eSThomas Weißschuh /*
20dc2c656eSThomas Weißschuh  * int poll(struct pollfd *fds, int nfds, int timeout);
21dc2c656eSThomas Weißschuh  */
22dc2c656eSThomas Weißschuh 
23dc2c656eSThomas Weißschuh static __attribute__((unused))
sys_poll(struct pollfd * fds,int nfds,int timeout)24dc2c656eSThomas Weißschuh int sys_poll(struct pollfd *fds, int nfds, int timeout)
25dc2c656eSThomas Weißschuh {
26dc2c656eSThomas Weißschuh #if defined(__NR_ppoll)
27dc2c656eSThomas Weißschuh 	struct timespec t;
28dc2c656eSThomas Weißschuh 
29dc2c656eSThomas Weißschuh 	if (timeout >= 0) {
30dc2c656eSThomas Weißschuh 		t.tv_sec  = timeout / 1000;
31dc2c656eSThomas Weißschuh 		t.tv_nsec = (timeout % 1000) * 1000000;
32dc2c656eSThomas Weißschuh 	}
33dc2c656eSThomas Weißschuh 	return my_syscall5(__NR_ppoll, fds, nfds, (timeout >= 0) ? &t : NULL, NULL, 0);
34dc2c656eSThomas Weißschuh #elif defined(__NR_ppoll_time64)
35dc2c656eSThomas Weißschuh 	struct __kernel_timespec t;
36dc2c656eSThomas Weißschuh 
37dc2c656eSThomas Weißschuh 	if (timeout >= 0) {
38dc2c656eSThomas Weißschuh 		t.tv_sec  = timeout / 1000;
39dc2c656eSThomas Weißschuh 		t.tv_nsec = (timeout % 1000) * 1000000;
40dc2c656eSThomas Weißschuh 	}
41dc2c656eSThomas Weißschuh 	return my_syscall5(__NR_ppoll_time64, fds, nfds, (timeout >= 0) ? &t : NULL, NULL, 0);
42dc2c656eSThomas Weißschuh #elif defined(__NR_poll)
43dc2c656eSThomas Weißschuh 	return my_syscall3(__NR_poll, fds, nfds, timeout);
44dc2c656eSThomas Weißschuh #else
45dc2c656eSThomas Weißschuh 	return __nolibc_enosys(__func__, fds, nfds, timeout);
46dc2c656eSThomas Weißschuh #endif
47dc2c656eSThomas Weißschuh }
48dc2c656eSThomas Weißschuh 
49dc2c656eSThomas Weißschuh static __attribute__((unused))
poll(struct pollfd * fds,int nfds,int timeout)50dc2c656eSThomas Weißschuh int poll(struct pollfd *fds, int nfds, int timeout)
51dc2c656eSThomas Weißschuh {
52dc2c656eSThomas Weißschuh 	return __sysret(sys_poll(fds, nfds, timeout));
53dc2c656eSThomas Weißschuh }
54dc2c656eSThomas Weißschuh 
55dc2c656eSThomas Weißschuh #endif /* _NOLIBC_POLL_H */
56