From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 7759 invoked by alias); 7 Sep 2017 22:46:07 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Received: (qmail 5254 invoked by uid 89); 7 Sep 2017 22:46:03 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.6 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_LAZY_DOMAIN_SECURITY,RCVD_IN_DNSWL_LOW autolearn=ham version=3.3.2 spammy= X-HELO: smtp6-g21.free.fr From: "Albert ARIBAUD (3ADEV)" To: libc-alpha@sourceware.org Cc: "Albert ARIBAUD (3ADEV)" Subject: [RFC PATCH 49/52] Y2038: add function pselect Date: Thu, 07 Sep 2017 22:46:00 -0000 Message-Id: <20170907224219.12483-50-albert.aribaud@3adev.fr> In-Reply-To: <20170907224219.12483-49-albert.aribaud@3adev.fr> References: <20170907224219.12483-1-albert.aribaud@3adev.fr> <20170907224219.12483-2-albert.aribaud@3adev.fr> <20170907224219.12483-3-albert.aribaud@3adev.fr> <20170907224219.12483-4-albert.aribaud@3adev.fr> <20170907224219.12483-5-albert.aribaud@3adev.fr> <20170907224219.12483-6-albert.aribaud@3adev.fr> <20170907224219.12483-7-albert.aribaud@3adev.fr> <20170907224219.12483-8-albert.aribaud@3adev.fr> <20170907224219.12483-9-albert.aribaud@3adev.fr> <20170907224219.12483-10-albert.aribaud@3adev.fr> <20170907224219.12483-11-albert.aribaud@3adev.fr> <20170907224219.12483-12-albert.aribaud@3adev.fr> <20170907224219.12483-13-albert.aribaud@3adev.fr> <20170907224219.12483-14-albert.aribaud@3adev.fr> <20170907224219.12483-15-albert.aribaud@3adev.fr> <20170907224219.12483-16-albert.aribaud@3adev.fr> <20170907224219.12483-17-albert.aribaud@3adev.fr> <20170907224219.12483-18-albert.aribaud@3adev.fr> <20170907224219.12483-19-albert.aribaud@3adev.fr> <20170907224219.12483-20-albert.aribaud@3adev.fr> <20170907224219.12483-21-albert.aribaud@3adev.fr> <20170907224219.12483-22-albert.aribaud@3adev.fr> <20170907224219.12483-23-albert.aribaud@3adev.fr> <20170907224219.12483-24-albert.aribaud@3adev.fr> <20170907224219.12483-25-albert.aribaud@3adev.fr> <20170907224219.12483-26-albert.aribaud@3adev.fr> <20170907224219.12483-27-albert.aribaud@3adev.fr> <20170907224219.12483-28-albert.aribaud@3adev.fr> <20170907224219.12483-29-albert.aribaud@3adev.fr> <20170907224219.12483-30-albert.aribaud@3adev.fr> <20170907224219.12483-31-albert.aribaud@3adev.fr> <20170907224219.12483-32-albert.aribaud@3adev.fr> <20170907224219.12483-33-albert.aribaud@3adev.fr> <20170907224219.12483-34-albert.aribaud@3adev.fr> <20170907224219.12483-35-albert.aribaud@3adev.fr> <20170907224219.12483-36-albert.aribaud@3adev.fr> <20170907224219.12483-37-albert.aribaud@3adev.fr> <20170907224219.12483-38-albert.aribaud@3adev.fr> <20170907224219.12483-39-albert.aribaud@3adev.fr> <20170907224219.12483-40-albert.aribaud@3adev.fr> <20170907224219.12483-41-albert.aribaud@3adev.fr> <20170907224219.12483-42-albert.aribaud@3adev.fr> <20170907224219.12483-43-albert.aribaud@3adev.fr> <20170907224219.12483-44-albert.aribaud@3adev.fr> <20170907224219.12483-45-albert.aribaud@3adev.fr> <20170907224219.12483-46-albert.aribaud@3adev.fr> <20170907224219.12483-47-albert.aribaud@3adev.fr> <20170907224219.12483-48-albert.aribaud@3adev.fr> <20170907224219.12483-49-albert.aribaud@3adev.fr> X-SW-Source: 2017-09/txt/msg00365.txt.bz2 Signed-off-by: Albert ARIBAUD (3ADEV) --- include/sys/select.h | 10 +++++++ sysdeps/unix/sysv/linux/pselect.c | 61 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 71 insertions(+) diff --git a/include/sys/select.h b/include/sys/select.h index 07bb49b994..3eb76faf9d 100644 --- a/include/sys/select.h +++ b/include/sys/select.h @@ -3,6 +3,9 @@ #ifndef _ISOMAC /* Now define the internal interfaces. */ + +#include + extern int __pselect (int __nfds, fd_set *__readfds, fd_set *__writefds, fd_set *__exceptfds, const struct timespec *__timeout, @@ -14,5 +17,12 @@ extern int __select (int __nfds, fd_set *__restrict __readfds, struct timeval *__restrict __timeout); libc_hidden_proto (__select) +/* 64-bit time version */ + +extern int __pselect_t64 (int __nfds, fd_set *__readfds, + fd_set *__writefds, fd_set *__exceptfds, + const struct __timespec64 *__timeout, + const __sigset_t *__sigmask); + #endif #endif diff --git a/sysdeps/unix/sysv/linux/pselect.c b/sysdeps/unix/sysv/linux/pselect.c index b5e8c7fbcd..ce8db34843 100644 --- a/sysdeps/unix/sysv/linux/pselect.c +++ b/sysdeps/unix/sysv/linux/pselect.c @@ -79,6 +79,67 @@ __pselect (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, } weak_alias (__pselect, pselect) +/* 64-bit time version */ + +extern int __y2038_linux_support; + +int +__pselect_t64 (int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, + const struct __timespec64 *timeout, const sigset_t *sigmask) +{ + struct timespec tval32, *timeout32 = NULL; + + if (__y2038_linux_support) + { + /* TODO: implement using Linux kernel system call */ + } + + /* The Linux kernel can in some situations update the timeout value. + We do not want that so use a local variable. */ + if (timeout != NULL) + { + if (timeout->tv_sec > INT_MAX) + { + errno = EOVERFLOW; + return -1; + } + tval32.tv_sec = timeout->tv_sec; + tval32.tv_nsec = timeout->tv_nsec; + timeout32 = &tval32; + } + + /* Note: the system call expects 7 values but on most architectures + 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. */ + struct + { + __syscall_ulong_t ss; + __syscall_ulong_t ss_len; + } data; + + data.ss = (__syscall_ulong_t) (uintptr_t) sigmask; + data.ss_len = _NSIG / 8; + + int result; + +#ifndef CALL_PSELECT6 +# define CALL_PSELECT6(nfds, readfds, writefds, exceptfds, timeout, data) \ + SYSCALL_CANCEL (pselect6, nfds, readfds, writefds, exceptfds, timeout32, data) +#endif + + result = CALL_PSELECT6 (nfds, readfds, writefds, exceptfds, timeout32, + &data); + +# ifndef __ASSUME_PSELECT + if (result == -1 && errno == ENOSYS) + result = __generic_pselect (nfds, readfds, writefds, exceptfds, timeout32, + sigmask); +# endif + + return result; +} + # ifndef __ASSUME_PSELECT # define __pselect static __generic_pselect # endif -- 2.11.0