summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/common
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2007-09-15 10:57:09 +0000
committerMike Frysinger <vapier@gentoo.org>2007-09-15 10:57:09 +0000
commitf032afc5fd03f45ecc346b1dbb00b9b3dc0e0e2a (patch)
tree32493a2e59a2b3a2324630b03cc20a1f536a27f9 /libc/sysdeps/linux/common
parentf5582f19d919de215b4d07af3fb18b6416a43344 (diff)
if __NR__newselect and __NR_select are unavailable, fall back to __NR_pselect6
Diffstat (limited to 'libc/sysdeps/linux/common')
-rw-r--r--libc/sysdeps/linux/common/select.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/common/select.c b/libc/sysdeps/linux/common/select.c
index 9c065226b..03fda35b7 100644
--- a/libc/sysdeps/linux/common/select.c
+++ b/libc/sysdeps/linux/common/select.c
@@ -12,6 +12,27 @@
extern __typeof(select) __libc_select;
+#if !defined(__NR__newselect) && !defined(__NR_select)
+
+# define __NR___libc_pselect6 __NR_pselect6
+_syscall6(int, __libc_pselect6, int, n, fd_set *, readfds, fd_set *, writefds,
+ fd_set *, exceptfds, const struct timespec *, timeout,
+ const sigset_t *, sigmask);
+
+int __libc_select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
+ struct timeval *timeout)
+{
+ struct timespec _ts, *ts = 0;
+ if (timeout) {
+ _ts.tv_sec = timeout->tv_sec;
+ _ts.tv_nsec = timeout->tv_usec * 1000;
+ ts = &_ts;
+ }
+ return __libc_pselect6(n, readfds, writefds, exceptfds, ts, 0);
+}
+
+#else
+
#ifdef __NR__newselect
# define __NR___libc_select __NR__newselect
#else
@@ -19,6 +40,9 @@ extern __typeof(select) __libc_select;
#endif
_syscall5(int, __libc_select, int, n, fd_set *, readfds, fd_set *, writefds,
fd_set *, exceptfds, struct timeval *, timeout);
+
+#endif
+
libc_hidden_proto(select)
weak_alias(__libc_select,select)
libc_hidden_weak(select)