libsys: don't expose sigwait wrapper

Long ago (e129c18a83) __sys_sigwait was wrapped to prevent sigwait()
from returning with EINTR.  Through a series of changes this wrapper
become __libc_sigwait which was internal to libc and used solely in the
interposing table.  To support a move of sigwait back to libc, move this
wrapper into libsys and rename it with an __libsys_ prefix.

Reviewed by:	kib
Differential Revision:	https://reviews.freebsd.org/D44238
This commit is contained in:
Brooks Davis 2024-03-13 17:04:07 +00:00
parent a3a4bea49c
commit f7dbbbd176
6 changed files with 49 additions and 20 deletions

View File

@ -414,8 +414,7 @@ int __libc_sigaction(int, const struct sigaction *,
int __libc_sigprocmask(int, const __sigset_t *, __sigset_t *)
__hidden;
int __libc_sigsuspend(const __sigset_t *) __hidden;
int __libc_sigwait(const __sigset_t * __restrict,
int * restrict sig);
int __libsys_sigwait(const __sigset_t *, int *) __hidden;
int __libc_system(const char *);
int __libc_tcdrain(int);

View File

@ -37,7 +37,8 @@ SRCS+= \
__getosreldate.c \
getpagesize.c \
getpagesizes.c \
interposing_table.c
interposing_table.c \
libsys_sigwait.c
SRCS+= getdents.c lstat.c mknod.c stat.c

View File

@ -433,7 +433,6 @@ FBSD_1.8 {
FBSDprivate_1.0 {
/* Add entries in sort(1) order */
__libc_sigwait;
__libsys_interposing_slot;
__set_error_selector;
__sigwait;

View File

@ -59,7 +59,7 @@ interpos_func_t __libsys_interposing[INTERPOS_MAX] = {
SLOT(sigaction, __sys_sigaction),
SLOT(sigprocmask, __sys_sigprocmask),
SLOT(sigsuspend, __sys_sigsuspend),
SLOT(sigwait, __libc_sigwait),
SLOT(sigwait, __libsys_sigwait),
SLOT(sigtimedwait, __sys_sigtimedwait),
SLOT(sigwaitinfo, __sys_sigwaitinfo),
SLOT(swapcontext, __sys_swapcontext),

View File

@ -0,0 +1,45 @@
/*-
* SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (c) 2010 davidxu@freebsd.org
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
#include <errno.h>
#include <signal.h>
#include "libc_private.h"
/* XXX: why does this symbol exist? */
__weak_reference(__libsys_sigwait, __sigwait);
int
__libsys_sigwait(const sigset_t *set, int *sig)
{
int ret;
/* POSIX does not allow EINTR to be returned */
do {
ret = __sys_sigwait(set, sig);
} while (ret == EINTR);
return (ret);
}

View File

@ -25,12 +25,9 @@
* SUCH DAMAGE.
*/
#include <errno.h>
#include <signal.h>
#include "libc_private.h"
__weak_reference(__libc_sigwait, __sigwait);
#pragma weak sigwait
int
sigwait(const sigset_t *set, int *sig)
@ -38,15 +35,3 @@ sigwait(const sigset_t *set, int *sig)
return (((int (*)(const sigset_t *, int *))
__libsys_interposing[INTERPOS_sigwait])(set, sig));
}
int
__libc_sigwait(const sigset_t *set, int *sig)
{
int ret;
/* POSIX does not allow EINTR to be returned */
do {
ret = __sys_sigwait(set, sig);
} while (ret == EINTR);
return (ret);
}