diff options
Diffstat (limited to 'sysdeps/unix/sysv')
-rw-r--r-- | sysdeps/unix/sysv/linux/microblaze/pselect32.c | 3 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/pselect.c | 47 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/pselect32.c | 6 |
3 files changed, 29 insertions, 27 deletions
diff --git a/sysdeps/unix/sysv/linux/microblaze/pselect32.c b/sysdeps/unix/sysv/linux/microblaze/pselect32.c index a4f4364..70b7b52 100644 --- a/sysdeps/unix/sysv/linux/microblaze/pselect32.c +++ b/sysdeps/unix/sysv/linux/microblaze/pselect32.c @@ -35,8 +35,7 @@ __pselect32 (int nfds, fd_set *readfds, fd_set *writefds, struct timeval tv32, *ptv32 = NULL; if (timeout != NULL) { - if (! in_time_t_range (timeout->tv_sec) - || ! valid_nanoseconds (timeout->tv_nsec)) + if (! valid_nanoseconds (timeout->tv_nsec)) { __set_errno (EINVAL); return -1; diff --git a/sysdeps/unix/sysv/linux/pselect.c b/sysdeps/unix/sysv/linux/pselect.c index 5e8a0cc..e7df6e7 100644 --- a/sysdeps/unix/sysv/linux/pselect.c +++ b/sysdeps/unix/sysv/linux/pselect.c @@ -18,7 +18,23 @@ #include <sys/select.h> #include <sysdep-cancel.h> -#include <time64-support.h> + +static int +pselect64_syscall (int nfds, fd_set *readfds, fd_set *writefds, + fd_set *exceptfds, const struct __timespec64 *timeout, + const sigset_t *sigmask) +{ +#ifndef __NR_pselect6_time64 +# define __NR_pselect6_time64 __NR_pselect6 +#endif + /* NB: This is required by ARGIFY used in x32 internal_syscallN. */ + __syscall_ulong_t data[2] = + { + (uintptr_t) sigmask, __NSIG_BYTES + }; + return SYSCALL_CANCEL (pselect6_time64, nfds, readfds, writefds, exceptfds, + timeout, data); +} int __pselect64 (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, @@ -37,30 +53,23 @@ __pselect64 (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, we can only pass in 6 directly. If there is an architecture with support for more parameters a new version of this file needs to be created. */ - -#ifndef __NR_pselect6_time64 -# define __NR_pselect6_time64 __NR_pselect6 -#endif - int r; - if (supports_time64 ()) +#ifdef __ASSUME_TIME64_SYSCALLS + return pselect64_syscall (nfds, readfds, writefds, exceptfds, timeout, + sigmask); +#else + bool need_time64 = timeout != NULL && !in_time_t_range (timeout->tv_sec); + if (need_time64) { - /* NB: This is required by ARGIFY used in x32 internal_syscallN. */ - __syscall_ulong_t data[2] = - { - (uintptr_t) sigmask, __NSIG_BYTES - }; - r = SYSCALL_CANCEL (pselect6_time64, nfds, readfds, writefds, exceptfds, - timeout, data); + int r = pselect64_syscall (nfds, readfds, writefds, exceptfds, timeout, + sigmask); if (r == 0 || errno != ENOSYS) return r; - - mark_time64_unsupported (); + __set_errno (EOVERFLOW); + return -1; } -#ifndef __ASSUME_TIME64_SYSCALLS - r = __pselect32 (nfds, readfds, writefds, exceptfds, timeout, sigmask); + return __pselect32 (nfds, readfds, writefds, exceptfds, timeout, sigmask); #endif - return r; } #if __TIMESIZE != 64 diff --git a/sysdeps/unix/sysv/linux/pselect32.c b/sysdeps/unix/sysv/linux/pselect32.c index eb59b51..48724d8 100644 --- a/sysdeps/unix/sysv/linux/pselect32.c +++ b/sysdeps/unix/sysv/linux/pselect32.c @@ -29,12 +29,6 @@ __pselect32 (int nfds, fd_set *readfds, fd_set *writefds, struct timespec ts32, *pts32 = NULL; if (timeout != NULL) { - if (! in_time_t_range (timeout->tv_sec)) - { - __set_errno (EINVAL); - return -1; - } - ts32 = valid_timespec64_to_timespec (*timeout); pts32 = &ts32; } |