From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 72102 invoked by alias); 7 Sep 2017 22:43:29 -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 71966 invoked by uid 89); 7 Sep 2017 22:43:29 -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 14/52] Y2038: add function __sigtimedwait64 Date: Thu, 07 Sep 2017 22:43:00 -0000 Message-Id: <20170907224219.12483-15-albert.aribaud@3adev.fr> In-Reply-To: <20170907224219.12483-14-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> X-SW-Source: 2017-09/txt/msg00330.txt.bz2 Signed-off-by: Albert ARIBAUD (3ADEV) --- signal/sigtimedwait.c | 10 +++++ sysdeps/unix/sysv/linux/arm/Versions | 1 + sysdeps/unix/sysv/linux/sigtimedwait.c | 75 ++++++++++++++++++++++++++++++++++ 3 files changed, 86 insertions(+) diff --git a/signal/sigtimedwait.c b/signal/sigtimedwait.c index 3b42003e26..c1e0d4375c 100644 --- a/signal/sigtimedwait.c +++ b/signal/sigtimedwait.c @@ -30,3 +30,13 @@ libc_hidden_def (__sigtimedwait) weak_alias (__sigtimedwait, sigtimedwait) stub_warning (sigtimedwait) + +int +__sigtimedwait64 (const sigset_t *set, siginfo_t *info, + const struct __timespec64 *timeout) +{ + __set_errno (ENOSYS); + return -1; +} + +stub_warning (__sigtimedwait64) diff --git a/sysdeps/unix/sysv/linux/arm/Versions b/sysdeps/unix/sysv/linux/arm/Versions index 2620d81fdc..630e3f8569 100644 --- a/sysdeps/unix/sysv/linux/arm/Versions +++ b/sysdeps/unix/sysv/linux/arm/Versions @@ -35,5 +35,6 @@ libc { __clock_nanosleep64; __futimens64; __utimensat64; + __sigtimedwait64; } } diff --git a/sysdeps/unix/sysv/linux/sigtimedwait.c b/sysdeps/unix/sysv/linux/sigtimedwait.c index ab1a84ef1c..f79850dcfe 100644 --- a/sysdeps/unix/sysv/linux/sigtimedwait.c +++ b/sysdeps/unix/sysv/linux/sigtimedwait.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -64,6 +65,80 @@ __sigtimedwait (const sigset_t *set, siginfo_t *info, } libc_hidden_def (__sigtimedwait) weak_alias (__sigtimedwait, sigtimedwait) + +/* 64-bit time version */ + +extern int __y2038_linux_support; + +int +__sigtimedwait64 (const sigset_t *set, siginfo_t *info, + const struct __timespec64 *timeout) +{ + int result; + struct __timespec64 ts64; + struct timespec ts32; + +#ifdef SIGCANCEL + sigset_t tmpset; + if (set != NULL + && (__builtin_expect (__sigismember (set, SIGCANCEL), 0) +# ifdef SIGSETXID + || __builtin_expect (__sigismember (set, SIGSETXID), 0) +# endif + )) + { + /* Create a temporary mask without the bit for SIGCANCEL set. */ + // We are not copying more than we have to. + memcpy (&tmpset, set, _NSIG / 8); + __sigdelset (&tmpset, SIGCANCEL); +# ifdef SIGSETXID + __sigdelset (&tmpset, SIGSETXID); +# endif + set = &tmpset; + } +#endif + + /* XXX The size argument hopefully will have to be changed to the + real size of the user-level sigset_t. */ + + if (__y2038_linux_support) + { + if (timeout) + { + ts64.tv_sec = timeout->tv_sec; + ts64.tv_nsec = timeout->tv_nsec; + ts64.tv_pad = 0; + result = SYSCALL_CANCEL (rt_sigtimedwait, set, info, &ts64, _NSIG / 8); + } + else + result = SYSCALL_CANCEL (rt_sigtimedwait, set, info, NULL, _NSIG / 8); + } + else + { + if (timeout) + { + if (timeout->tv_sec > INT32_MAX) + { + errno = EOVERFLOW; + return -1; + } + ts32.tv_sec = timeout->tv_sec; + ts32.tv_nsec = timeout->tv_nsec; + result = SYSCALL_CANCEL (rt_sigtimedwait, set, info, &ts32, _NSIG / 8); + } + else + result = SYSCALL_CANCEL (rt_sigtimedwait, set, info, NULL, _NSIG / 8); + } + + /* The kernel generates a SI_TKILL code in si_code in case tkill is + used. tkill is transparently used in raise(). Since having + SI_TKILL as a code is useful in general we fold the results + here. */ + if (result != -1 && info != NULL && info->si_code == SI_TKILL) + info->si_code = SI_USER; + + return result; +} #else # include #endif -- 2.11.0