From patchwork Wed Apr 18 20:17:38 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Albert ARIBAUD X-Patchwork-Id: 26801 Received: (qmail 109569 invoked by alias); 18 Apr 2018 20:20:13 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 109460 invoked by uid 89); 18 Apr 2018 20:20:13 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.8 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LAZY_DOMAIN_SECURITY, KAM_NUMSUBJECT, RCVD_IN_DNSWL_LOW, RCVD_IN_RP_RNBL autolearn=ham version=3.3.2 spammy= X-HELO: smtp3-g21.free.fr From: "Albert ARIBAUD (3ADEV)" To: libc-alpha@sourceware.org Cc: "Albert ARIBAUD (3ADEV)" Subject: [[PATCH RFC 2] 22/63] Y2038: add function __sigtimedwait64 Date: Wed, 18 Apr 2018 22:17:38 +0200 Message-Id: <20180418201819.15952-23-albert.aribaud@3adev.fr> In-Reply-To: <20180418201819.15952-22-albert.aribaud@3adev.fr> References: <20180418201819.15952-1-albert.aribaud@3adev.fr> <20180418201819.15952-2-albert.aribaud@3adev.fr> <20180418201819.15952-3-albert.aribaud@3adev.fr> <20180418201819.15952-4-albert.aribaud@3adev.fr> <20180418201819.15952-5-albert.aribaud@3adev.fr> <20180418201819.15952-6-albert.aribaud@3adev.fr> <20180418201819.15952-7-albert.aribaud@3adev.fr> <20180418201819.15952-8-albert.aribaud@3adev.fr> <20180418201819.15952-9-albert.aribaud@3adev.fr> <20180418201819.15952-10-albert.aribaud@3adev.fr> <20180418201819.15952-11-albert.aribaud@3adev.fr> <20180418201819.15952-12-albert.aribaud@3adev.fr> <20180418201819.15952-13-albert.aribaud@3adev.fr> <20180418201819.15952-14-albert.aribaud@3adev.fr> <20180418201819.15952-15-albert.aribaud@3adev.fr> <20180418201819.15952-16-albert.aribaud@3adev.fr> <20180418201819.15952-17-albert.aribaud@3adev.fr> <20180418201819.15952-18-albert.aribaud@3adev.fr> <20180418201819.15952-19-albert.aribaud@3adev.fr> <20180418201819.15952-20-albert.aribaud@3adev.fr> <20180418201819.15952-21-albert.aribaud@3adev.fr> <20180418201819.15952-22-albert.aribaud@3adev.fr> --- signal/sigtimedwait.c | 10 +++++ sysdeps/unix/sysv/linux/sigtimedwait.c | 76 ++++++++++++++++++++++++++++++++++ time/Versions | 1 + 3 files changed, 87 insertions(+) diff --git a/signal/sigtimedwait.c b/signal/sigtimedwait.c index 308b9b95d7..d8d7165375 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/sigtimedwait.c b/sysdeps/unix/sysv/linux/sigtimedwait.c index b4de8856dd..4fe1b66517 100644 --- a/sysdeps/unix/sysv/linux/sigtimedwait.c +++ b/sysdeps/unix/sysv/linux/sigtimedwait.c @@ -18,6 +18,9 @@ #include #include #include +//#include + +//#include #include int @@ -39,3 +42,76 @@ __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 (! timespec64_to_timespec(timeout, &ts32)) + { + errno = EOVERFLOW; + return -1; + } + 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; +} + diff --git a/time/Versions b/time/Versions index e41c661970..eec5f95610 100644 --- a/time/Versions +++ b/time/Versions @@ -81,5 +81,6 @@ libc { __timespec_get64; __futimens64; __utimensat64; + __sigtimedwait64; } }