From patchwork Thu Jun 17 17:57:50 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 43881 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 627BC3894C3B for ; Thu, 17 Jun 2021 17:58:20 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 627BC3894C3B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1623952700; bh=OfwaiVA5qKUaTTvvA8FTx5J/UVr9HDL9sDQ1/6xeEPs=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=NzcEbNxhxQwuMz9yCdeExTxEwuLZY5guLMz+yvGHba+fsv46SqAXtnssyP2ZwMiEW 9rHBT7bSqwf3fdPptc5ctUhakoJ/5mbpgjDomv9Re6ffq7su88xk4h9wRsSOaS1AnQ Rg5E6ZcpQz5qz9L0/28S6dVQvj+owyEaUhEDg18c= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-qt1-x832.google.com (mail-qt1-x832.google.com [IPv6:2607:f8b0:4864:20::832]) by sourceware.org (Postfix) with ESMTPS id 48B53383D83F for ; Thu, 17 Jun 2021 17:57:57 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 48B53383D83F Received: by mail-qt1-x832.google.com with SMTP id o19so5431437qtp.5 for ; Thu, 17 Jun 2021 10:57:57 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=OfwaiVA5qKUaTTvvA8FTx5J/UVr9HDL9sDQ1/6xeEPs=; b=C/ybp8lq+3iXwdBiR5aqYUlF8iSzIhBEdEVThLS8lKK4SiqH2p61a1K7vIwQgdQs/z NGSX476k9jJ2yrCmpg23CY0ZgEz8Dtpo9maJph/Hdv6ZJLU2x8Q4+d2RmmEx/54nx1HH Z8NwvCNuCu9hJ++UqV+tHUxo03OT+I+P3/kCFW6fcvvqkfR706U/ZlhdgSMSLkNz2scg nz8BoqP+oWJQebhcHdYMa97iWzhQaU87haFBGbi8yI+vjixTei1qzlXw0sAMdC1vPuXq FE2DrrGAeLAmF4bAB+ZhryxIEO38XRkr/lEvFHNkITXnVEw4w9x6alhHC84SJJ/637FB TAxA== X-Gm-Message-State: AOAM533IdlaBNUWktKFDgnGzlHoY9JwJ/MGIRC0hUps4Vh1iOnVpBNaZ 9TX0mBP1F/1G3Ne6wepemqtbT0dTtpauNA== X-Google-Smtp-Source: ABdhPJyQsAioYHh2al1a0RTgN/CXcc/CRJeGQwAEsdOUUmTtjItiDtqSFzTWCeDNZZT3MIh9ad1TNQ== X-Received: by 2002:aed:3071:: with SMTP id 104mr6358868qte.119.1623952676376; Thu, 17 Jun 2021 10:57:56 -0700 (PDT) Received: from birita.. ([177.194.59.218]) by smtp.googlemail.com with ESMTPSA id m189sm2153542qkd.107.2021.06.17.10.57.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 17 Jun 2021 10:57:56 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH 1/2] posix: Remove spawni.c Date: Thu, 17 Jun 2021 14:57:50 -0300 Message-Id: <20210617175751.1619846-1-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.30.2 MIME-Version: 1.0 X-Spam-Status: No, score=-12.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Cc: Godmar Back Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" Although it provide an alternate implementation that communicates using pipe() instead of shared memory, no port uses and it adds extra burden for posix_spawn() extensions. --- sysdeps/posix/spawni.c | 339 ----------------------------------------- 1 file changed, 339 deletions(-) delete mode 100644 sysdeps/posix/spawni.c diff --git a/sysdeps/posix/spawni.c b/sysdeps/posix/spawni.c deleted file mode 100644 index a649788668..0000000000 --- a/sysdeps/posix/spawni.c +++ /dev/null @@ -1,339 +0,0 @@ -/* Guts of POSIX spawn interface. Generic POSIX.1 version. - Copyright (C) 2000-2021 Free Software Foundation, Inc. - This file is part of the GNU C Library. - - The GNU C Library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - The GNU C Library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with the GNU C Library; if not, see - . */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "spawn_int.h" - - -/* The Unix standard contains a long explanation of the way to signal - an error after the fork() was successful. Since no new wait status - was wanted there is no way to signal an error using one of the - available methods. The committee chose to signal an error by a - normal program exit with the exit code 127. */ -#define SPAWN_ERROR 127 - -struct posix_spawn_args -{ - sigset_t oldmask; - const char *file; - int (*exec) (const char *, char *const *, char *const *); - const posix_spawn_file_actions_t *fa; - const posix_spawnattr_t *restrict attr; - char *const *argv; - ptrdiff_t argc; - char *const *envp; - int xflags; - int pipe[2]; -}; - -/* Older version requires that shell script without shebang definition - to be called explicitly using /bin/sh (_PATH_BSHELL). */ -static void -maybe_script_execute (struct posix_spawn_args *args) -{ - if (SHLIB_COMPAT (libc, GLIBC_2_2, GLIBC_2_15) - && (args->xflags & SPAWN_XFLAGS_TRY_SHELL) && errno == ENOEXEC) - { - char *const *argv = args->argv; - ptrdiff_t argc = args->argc; - - /* Construct an argument list for the shell. */ - char *new_argv[argc + 2]; - new_argv[0] = (char *) _PATH_BSHELL; - new_argv[1] = (char *) args->file; - if (argc > 1) - memcpy (new_argv + 2, argv + 1, argc * sizeof (char *)); - else - new_argv[2] = NULL; - - /* Execute the shell. */ - args->exec (new_argv[0], new_argv, args->envp); - } -} - -/* Function used in the clone call to setup the signals mask, posix_spawn - attributes, and file actions. */ -static int -__spawni_child (void *arguments) -{ - struct posix_spawn_args *args = arguments; - const posix_spawnattr_t *restrict attr = args->attr; - const posix_spawn_file_actions_t *file_actions = args->fa; - int ret; - - __close (args->pipe[0]); - - /* Set signal default action. */ - if ((attr->__flags & POSIX_SPAWN_SETSIGDEF) != 0) - { - /* We have to iterate over all signals. This could possibly be - done better but it requires system specific solutions since - the sigset_t data type can be very different on different - architectures. */ - int sig; - struct sigaction sa; - - memset (&sa, '\0', sizeof (sa)); - sa.sa_handler = SIG_DFL; - - for (sig = 1; sig <= _NSIG; ++sig) - if (__sigismember (&attr->__sd, sig) != 0 - && __sigaction (sig, &sa, NULL) != 0) - goto fail; - } - -#ifdef _POSIX_PRIORITY_SCHEDULING - /* Set the scheduling algorithm and parameters. */ - if ((attr->__flags & (POSIX_SPAWN_SETSCHEDPARAM | POSIX_SPAWN_SETSCHEDULER)) - == POSIX_SPAWN_SETSCHEDPARAM) - { - if (__sched_setparam (0, &attr->__sp) == -1) - goto fail; - } - else if ((attr->__flags & POSIX_SPAWN_SETSCHEDULER) != 0) - { - if (__sched_setscheduler (0, attr->__policy, &attr->__sp) == -1) - goto fail; - } -#endif - - /* Set the process session ID. */ - if ((attr->__flags & POSIX_SPAWN_SETSID) != 0 - && __setsid () < 0) - goto fail; - - /* Set the process group ID. */ - if ((attr->__flags & POSIX_SPAWN_SETPGROUP) != 0 - && __setpgid (0, attr->__pgrp) != 0) - goto fail; - - /* Set the effective user and group IDs. */ - if ((attr->__flags & POSIX_SPAWN_RESETIDS) != 0 - && (local_seteuid (__getuid ()) != 0 - || local_setegid (__getgid ())) != 0) - goto fail; - - /* Execute the file actions. */ - if (file_actions != NULL) - { - int cnt; - struct rlimit64 fdlimit; - bool have_fdlimit = false; - - for (cnt = 0; cnt < file_actions->__used; ++cnt) - { - struct __spawn_action *action = &file_actions->__actions[cnt]; - - switch (action->tag) - { - case spawn_do_close: - if (__close_nocancel (action->action.close_action.fd) != 0) - { - if (have_fdlimit == 0) - { - __getrlimit64 (RLIMIT_NOFILE, &fdlimit); - have_fdlimit = true; - } - - /* Only signal errors for file descriptors out of range. */ - if (action->action.close_action.fd < 0 - || action->action.close_action.fd >= fdlimit.rlim_cur) - goto fail; - } - break; - - case spawn_do_open: - { - /* POSIX states that if fildes was already an open file descriptor, - it shall be closed before the new file is opened. This avoid - pontential issues when posix_spawn plus addopen action is called - with the process already at maximum number of file descriptor - opened and also for multiple actions on single-open special - paths (like /dev/watchdog). */ - __close_nocancel (action->action.open_action.fd); - - int new_fd = __open_nocancel (action->action.open_action.path, - action->action.open_action.oflag - | O_LARGEFILE, - action->action.open_action.mode); - - if (new_fd == -1) - goto fail; - - /* Make sure the desired file descriptor is used. */ - if (new_fd != action->action.open_action.fd) - { - if (__dup2 (new_fd, action->action.open_action.fd) - != action->action.open_action.fd) - goto fail; - - if (__close_nocancel (new_fd) != 0) - goto fail; - } - } - break; - - case spawn_do_dup2: - /* Austin Group issue #411 requires adddup2 action with source - and destination being equal to remove close-on-exec flag. */ - if (action->action.dup2_action.fd - == action->action.dup2_action.newfd) - { - int fd = action->action.dup2_action.newfd; - int flags = __fcntl (fd, F_GETFD, 0); - if (flags == -1) - goto fail; - if (__fcntl (fd, F_SETFD, flags & ~FD_CLOEXEC) == -1) - goto fail; - } - else if (__dup2 (action->action.dup2_action.fd, - action->action.dup2_action.newfd) - != action->action.dup2_action.newfd) - goto fail; - break; - - case spawn_do_chdir: - if (__chdir (action->action.chdir_action.path) != 0) - goto fail; - break; - - case spawn_do_fchdir: - if (__fchdir (action->action.fchdir_action.fd) != 0) - goto fail; - break; - } - } - } - - /* Set the initial signal mask of the child if POSIX_SPAWN_SETSIGMASK - is set, otherwise restore the previous one. */ - __sigprocmask (SIG_SETMASK, (attr->__flags & POSIX_SPAWN_SETSIGMASK) - ? &attr->__ss : &args->oldmask, 0); - - args->exec (args->file, args->argv, args->envp); - - /* This is compatibility function required to enable posix_spawn run - script without shebang definition for older posix_spawn versions - (2.15). */ - maybe_script_execute (args); - -fail: - /* errno should have an appropriate non-zero value; otherwise, - there's a bug in glibc or the kernel. For lack of an error code - (EINTERNALBUG) describing that, use ECHILD. Another option would - be to set args->err to some negative sentinel and have the parent - abort(), but that seems needlessly harsh. */ - ret = errno ? : ECHILD; - if (ret) - /* Since sizeof errno < PIPE_BUF, the write is atomic. */ - while (__write_nocancel (args->pipe[1], &ret, sizeof (ret)) < 0); - - _exit (SPAWN_ERROR); -} - -/* Spawn a new process executing PATH with the attributes describes in *ATTRP. - Before running the process perform the actions described in FILE-ACTIONS. */ -int -__spawnix (pid_t *pid, const char *file, - const posix_spawn_file_actions_t *file_actions, - const posix_spawnattr_t *attrp, char *const argv[], - char *const envp[], int xflags, - int (*exec) (const char *, char *const *, char *const *)) -{ - struct posix_spawn_args args; - int ec; - - if (__pipe2 (args.pipe, O_CLOEXEC)) - return errno; - - /* Disable asynchronous cancellation. */ - int state; - __libc_ptf_call (__pthread_setcancelstate, - (PTHREAD_CANCEL_DISABLE, &state), 0); - - ptrdiff_t argc = 0; - ptrdiff_t limit = INT_MAX - 1; - while (argv[argc++] != NULL) - if (argc == limit) - { - errno = E2BIG; - return errno; - } - - args.file = file; - args.exec = exec; - args.fa = file_actions; - args.attr = attrp ? attrp : &(const posix_spawnattr_t) { 0 }; - args.argv = argv; - args.argc = argc; - args.envp = envp; - args.xflags = xflags; - - /* Generate the new process. */ - pid_t new_pid = __fork (); - - if (new_pid == 0) - __spawni_child (&args); - else if (new_pid > 0) - { - __close (args.pipe[1]); - - if (__read (args.pipe[0], &ec, sizeof ec) != sizeof ec) - ec = 0; - else - __waitpid (new_pid, &(int) { 0 }, 0); - } - else - ec = errno; - - __close (args.pipe[0]); - - if ((ec == 0) && (pid != NULL)) - *pid = new_pid; - - __libc_ptf_call (__pthread_setcancelstate, (state, NULL), 0); - - return ec; -} - -int -__spawni (pid_t * pid, const char *file, - const posix_spawn_file_actions_t * acts, - const posix_spawnattr_t * attrp, char *const argv[], - char *const envp[], int xflags) -{ - /* It uses __execvpex to avoid run ENOEXEC in non compatibility mode (it - will be handled by maybe_script_execute). */ - return __spawnix (pid, file, acts, attrp, argv, envp, xflags, - xflags & SPAWN_XFLAGS_USE_PATH ? __execvpex : __execve); -} From patchwork Thu Jun 17 17:57:51 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adhemerval Zanella Netto X-Patchwork-Id: 43882 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id ED49339960CC for ; Thu, 17 Jun 2021 17:59:04 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org ED49339960CC DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1623952745; bh=CVMuNbpM1rQm0N2FncHwLtDB0d6zNhKbov3122qqG3Y=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=wmJclXxBkWE4rr5yGYC2m/qOL7Ul4nYhHwojO9d3QP0jY1RWY1BMWT/hvHUJFnMDr QT3IuAOikMFw0ujRK61fOAdZWQ6dEwlq9+/ks8skj5pvyHUSV3WgSPClpkoM3ayvSl ZiemAd2ARqNPjxbPB3K494vRGc7pBizFihjcc8SQ= X-Original-To: libc-alpha@sourceware.org Delivered-To: libc-alpha@sourceware.org Received: from mail-qt1-x82e.google.com (mail-qt1-x82e.google.com [IPv6:2607:f8b0:4864:20::82e]) by sourceware.org (Postfix) with ESMTPS id 3BDF1383B803 for ; Thu, 17 Jun 2021 17:57:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 3BDF1383B803 Received: by mail-qt1-x82e.google.com with SMTP id g12so5455415qtb.2 for ; Thu, 17 Jun 2021 10:57:59 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=CVMuNbpM1rQm0N2FncHwLtDB0d6zNhKbov3122qqG3Y=; b=MPAGlTZedXaKDnoRjm7n7tsJU9Oujggfw2mOTGc+7RBHEnQpg4M+bEzRgMOIE3tinp 3Rfbg28irArcB+Cvx01RCMg8yZTReEcyQj/u+7UTu6yKs5H5/Z0OlV7YulGJzOzU+MFV C5mjR1sXeogQitz1tOsRaNHcc+DrZFiwj5MTkF2SHm52++Jjla9gfjqPG3FlQ31xOeSa EamOUyBc6l2d/IGreOX7h+visMbgKbjf7VHAp/xT6LERND76s40EU7i3ew/tLHb9sMPs 5grDoy6KtzAU9Zmv5e5ka3HQtSjSgFS3WgPAI42crs5BeYkxHbkaKrd1rDWsnNIhFdxS a/OA== X-Gm-Message-State: AOAM5333ONqy4KTwHs3DLIzttS67XBD9pzmLIdCNRbElN4hWuMCWMhTZ a35vsnn0vIrStJ8MKrfDfiuIwVFewJjFEQ== X-Google-Smtp-Source: ABdhPJwPTjGr54SXsslizMRmHIWa6VrIaS2koEvMDUgsPfvLJdkx3vkA4I/Txy8SWPfSULKG+ZetVA== X-Received: by 2002:ac8:7768:: with SMTP id h8mr6301658qtu.235.1623952677996; Thu, 17 Jun 2021 10:57:57 -0700 (PDT) Received: from birita.. ([177.194.59.218]) by smtp.googlemail.com with ESMTPSA id m189sm2153542qkd.107.2021.06.17.10.57.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 17 Jun 2021 10:57:57 -0700 (PDT) To: libc-alpha@sourceware.org Subject: [PATCH 2/2] posix: Add terminal control setting support for posix_spawn Date: Thu, 17 Jun 2021 14:57:51 -0300 Message-Id: <20210617175751.1619846-2-adhemerval.zanella@linaro.org> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20210617175751.1619846-1-adhemerval.zanella@linaro.org> References: <20210617175751.1619846-1-adhemerval.zanella@linaro.org> MIME-Version: 1.0 X-Spam-Status: No, score=-12.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: libc-alpha@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libc-alpha mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Adhemerval Zanella via Libc-alpha From: Adhemerval Zanella Netto Reply-To: Adhemerval Zanella Cc: Godmar Back Errors-To: libc-alpha-bounces+patchwork=sourceware.org@sourceware.org Sender: "Libc-alpha" Currently there is no proper way to set the controlling terminal through posix_spawn() in race free manner [1]. This forces shell implementations to keep using fork()+exec() when launching background process groups, even when using posix_spawn() yields better performance. This patch adds a new GNU extension so the creating process can configure the creating process terminal group. This is done with a new flag, POSIX_SPAWN_TCSETPGROUP, along with two new attribute functions, posix_spawnattr_tcsetpgrp_np(), and posix_spawnattr_tcgetpgrp_np(). The function sets a new attribute, spawn-tcgroupfd, that references to the controlling terminal. The controlling terminal is set after the spawn-pgroup attribute, and uses the spawn-tcgroupfd along with current creating process group (so it is composable with POSIX_SPAWN_SETPGROUP). To create a process and set the controlling terminal, one can use the following sequence: posix_spawnattr_t attr; posix_spawnattr_init (&attr); posix_spawnattr_setflags (&attr, POSIX_SPAWN_TCSETPGROUP); posix_spawnattr_tcsetpgrp_np (&attr, tcfd); If the idea is also to create a new process groups: posix_spawnattr_t attr; posix_spawnattr_init (&attr); posix_spawnattr_setflags (&attr, POSIX_SPAWN_TCSETPGROUP | POSIX_SPAWN_SETPGROUP); posix_spawnattr_tcsetpgrp_np (&attr, 0); posix_spawnattr_setpgroup (&attr, 0), 0); The controlling terminal file descriptor is ignored if the new flag is not set. This interface is slight different than the one provided by QNX [2], which it only provides the POSIX_SPAWN_TCSETPGROUP flag. The QNX documentation is not on how the controlling terminal is obtained not how it iteracts with POSIX_SPAWN_SETPGROUP. Since a glibc implementation is library based, I moving the controlling terminal open to the caller should be more straighforward since it mimics the tcsetpgrp(), and allow less error handling by posix_spawn(). Checked on x86_64-linux-gnu and i686-linux-gnu. [1] https://github.com/ksh93/ksh/issues/79 [2] https://www.qnx.com/developers/docs/7.0.0/index.html#com.qnx.doc.neutrino.lib_ref/topic/p/posix_spawn.html --- NEWS | 5 + include/unistd.h | 5 +- posix/Makefile | 4 +- posix/Versions | 2 + posix/spawn.h | 16 +- posix/spawnattr_setflags.c | 3 +- posix/spawnattr_tcgetpgrp.c | 26 +++ posix/spawnattr_tcsetpgrp.c | 26 +++ posix/tst-spawn5.c | 152 ++++++++++++++++++ sysdeps/generic/libc.abilist | 2 + sysdeps/mach/hurd/i386/libc.abilist | 2 + sysdeps/mach/hurd/spawni.c | 13 ++ sysdeps/unix/bsd/tcsetpgrp.c | 4 +- sysdeps/unix/sysv/linux/aarch64/libc.abilist | 2 + sysdeps/unix/sysv/linux/alpha/libc.abilist | 2 + sysdeps/unix/sysv/linux/arc/libc.abilist | 2 + sysdeps/unix/sysv/linux/arm/be/libc.abilist | 2 + sysdeps/unix/sysv/linux/arm/le/libc.abilist | 2 + sysdeps/unix/sysv/linux/csky/libc.abilist | 2 + sysdeps/unix/sysv/linux/hppa/libc.abilist | 2 + sysdeps/unix/sysv/linux/i386/libc.abilist | 2 + sysdeps/unix/sysv/linux/ia64/libc.abilist | 2 + .../sysv/linux/m68k/coldfire/libc.abilist | 2 + .../unix/sysv/linux/m68k/m680x0/libc.abilist | 2 + .../sysv/linux/microblaze/be/libc.abilist | 2 + .../sysv/linux/microblaze/le/libc.abilist | 2 + .../sysv/linux/mips/mips32/fpu/libc.abilist | 2 + .../sysv/linux/mips/mips32/nofpu/libc.abilist | 2 + .../sysv/linux/mips/mips64/n32/libc.abilist | 2 + .../sysv/linux/mips/mips64/n64/libc.abilist | 2 + sysdeps/unix/sysv/linux/nios2/libc.abilist | 2 + .../linux/powerpc/powerpc32/fpu/libc.abilist | 2 + .../powerpc/powerpc32/nofpu/libc.abilist | 2 + .../linux/powerpc/powerpc64/be/libc.abilist | 2 + .../linux/powerpc/powerpc64/le/libc.abilist | 2 + .../unix/sysv/linux/riscv/rv32/libc.abilist | 2 + .../unix/sysv/linux/riscv/rv64/libc.abilist | 2 + .../unix/sysv/linux/s390/s390-32/libc.abilist | 2 + .../unix/sysv/linux/s390/s390-64/libc.abilist | 2 + sysdeps/unix/sysv/linux/sh/be/libc.abilist | 2 + sysdeps/unix/sysv/linux/sh/le/libc.abilist | 2 + .../sysv/linux/sparc/sparc32/libc.abilist | 2 + .../sysv/linux/sparc/sparc64/libc.abilist | 2 + sysdeps/unix/sysv/linux/spawni.c | 14 ++ sysdeps/unix/sysv/linux/syscalls.list | 2 +- .../unix/sysv/linux/x86_64/64/libc.abilist | 2 + .../unix/sysv/linux/x86_64/x32/libc.abilist | 2 + termios/tcsetpgrp.c | 5 +- 48 files changed, 337 insertions(+), 8 deletions(-) create mode 100644 posix/spawnattr_tcgetpgrp.c create mode 100644 posix/spawnattr_tcsetpgrp.c create mode 100644 posix/tst-spawn5.c diff --git a/NEWS b/NEWS index 58cf1dab68..c892f0ebfa 100644 --- a/NEWS +++ b/NEWS @@ -39,6 +39,11 @@ Major new features: supported when LFS (_FILE_OFFSET_BITS=64) is also enabled. It is only enabled for Linux and the full support requires a minimum version of 5.1. +* The functions posix_spawnattr_tcsetpgrp_np and posix_spawnattr_tcgetpgrp_np + have benn added, enabling posix_spawn and posix_spawnp to set the + controlling terminal in the new process in a non race manner. These + functions are GNU extensions. + Deprecated and removed features, and other changes affecting compatibility: * The function pthread_mutex_consistent_np has been deprecated; programs diff --git a/include/unistd.h b/include/unistd.h index 8ed8b1ea4b..ecca5b8a6d 100644 --- a/include/unistd.h +++ b/include/unistd.h @@ -167,7 +167,10 @@ extern int __ftruncate64 (int __fd, __off64_t __length) attribute_hidden; extern int __truncate (const char *path, __off_t __length); extern void *__sbrk (intptr_t __delta); libc_hidden_proto (__sbrk) - +extern int __tcsetpgrp (int fd, __pid_t pgrp); +libc_hidden_proto (__tcsetpgrp) +extern pid_t __getpgrp (void); +libc_hidden_proto (__getpgrp); /* This variable is set nonzero at startup if the process's effective IDs differ from its real IDs, or it is otherwise indicated that diff --git a/posix/Makefile b/posix/Makefile index 8d139e54f6..1942ff9ddb 100644 --- a/posix/Makefile +++ b/posix/Makefile @@ -63,6 +63,7 @@ routines := \ spawnattr_getpgroup spawnattr_setpgroup spawn spawnp spawni \ spawnattr_getsigmask spawnattr_getschedpolicy spawnattr_getschedparam \ spawnattr_setsigmask spawnattr_setschedpolicy spawnattr_setschedparam \ + spawnattr_tcgetpgrp spawnattr_tcsetpgrp \ posix_madvise \ get_child_max sched_cpucount sched_cpualloc sched_cpufree \ streams-compat \ @@ -106,7 +107,7 @@ tests := test-errno tstgetopt testfnm runtests runptests \ tst-sysconf-empty-chroot tst-glob_symlinks tst-fexecve \ tst-glob-tilde test-ssize-max tst-spawn4 bug-regex37 \ bug-regex38 tst-regcomp-truncated tst-spawn-chdir \ - tst-wordexp-nocmd tst-execveat + tst-wordexp-nocmd tst-execveat tst-spawn5 # Test for the glob symbol version that was replaced in glibc 2.27. ifeq ($(have-GLIBC_2.26)$(build-shared),yesyes) @@ -274,6 +275,7 @@ tst-exec-ARGS = -- $(host-test-program-cmd) tst-exec-static-ARGS = $(tst-exec-ARGS) tst-execvpe5-ARGS = -- $(host-test-program-cmd) tst-spawn-ARGS = -- $(host-test-program-cmd) +tst-spawn5-ARGS = -- $(host-test-program-cmd) tst-spawn-static-ARGS = $(tst-spawn-ARGS) tst-dir-ARGS = `pwd` `cd $(common-objdir)/$(subdir); pwd` `cd $(common-objdir); pwd` $(objpfx)tst-dir tst-chmod-ARGS = $(objdir) diff --git a/posix/Versions b/posix/Versions index 5983144d01..da1b8c50c3 100644 --- a/posix/Versions +++ b/posix/Versions @@ -153,6 +153,8 @@ libc { } GLIBC_2.34 { execveat; + posix_spawnattr_tcgetpgrp_np; + posix_spawnattr_tcsetpgrp_np; } GLIBC_PRIVATE { __libc_fork; __libc_pread; __libc_pwrite; diff --git a/posix/spawn.h b/posix/spawn.h index a29da028cc..34f3e9eee1 100644 --- a/posix/spawn.h +++ b/posix/spawn.h @@ -34,7 +34,8 @@ typedef struct sigset_t __ss; struct sched_param __sp; int __policy; - int __pad[16]; + int __tcpgrp; + int __pad[15]; } posix_spawnattr_t; @@ -59,6 +60,7 @@ typedef struct #ifdef __USE_GNU # define POSIX_SPAWN_USEVFORK 0x40 # define POSIX_SPAWN_SETSID 0x80 +# define POSIX_SPAWN_TCSETPGROUP 0x100 #endif @@ -166,6 +168,18 @@ extern int posix_spawnattr_setschedparam (posix_spawnattr_t *__restrict __attr, __restrict __schedparam) __THROW __nonnull ((1, 2)); +#ifdef __USE_GNU +/* Make the spawned process the foreground process group on the terminal + associated with FD (which must be a controlling terminal, and still be + associated with its section. */ +extern int posix_spawnattr_tcsetpgrp_np (posix_spawnattr_t *__attr, int fd) + __THROW __nonnull ((1)); + +/* Returh the associated terminal FD in the attribute structure. */ +extern int posix_spawnattr_tcgetpgrp_np (const posix_spawnattr_t * + __restrict __attr, int *fd) + __THROW __nonnull ((1, 2)); +#endif /* Initialize data structure for file attribute for `spawn' call. */ extern int posix_spawn_file_actions_init (posix_spawn_file_actions_t * diff --git a/posix/spawnattr_setflags.c b/posix/spawnattr_setflags.c index 2b033a50fc..95f521d04d 100644 --- a/posix/spawnattr_setflags.c +++ b/posix/spawnattr_setflags.c @@ -26,7 +26,8 @@ | POSIX_SPAWN_SETSCHEDPARAM \ | POSIX_SPAWN_SETSCHEDULER \ | POSIX_SPAWN_SETSID \ - | POSIX_SPAWN_USEVFORK) + | POSIX_SPAWN_USEVFORK \ + | POSIX_SPAWN_TCSETPGROUP) /* Store flags in the attribute structure. */ int diff --git a/posix/spawnattr_tcgetpgrp.c b/posix/spawnattr_tcgetpgrp.c new file mode 100644 index 0000000000..5823943b41 --- /dev/null +++ b/posix/spawnattr_tcgetpgrp.c @@ -0,0 +1,26 @@ +/* Get the controlling terminal option. + Copyright (C) 2000-2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include + +int +posix_spawnattr_tcgetpgrp_np (const posix_spawnattr_t *attr, int *fd) +{ + *fd = attr->__tcpgrp; + return 0; +} diff --git a/posix/spawnattr_tcsetpgrp.c b/posix/spawnattr_tcsetpgrp.c new file mode 100644 index 0000000000..e729cad701 --- /dev/null +++ b/posix/spawnattr_tcsetpgrp.c @@ -0,0 +1,26 @@ +/* Set the controlling terminal option. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include + +int +posix_spawnattr_tcsetpgrp_np (posix_spawnattr_t *attr, int fd) +{ + attr->__tcpgrp = fd; + return 0; +} diff --git a/posix/tst-spawn5.c b/posix/tst-spawn5.c new file mode 100644 index 0000000000..4fb4e965b6 --- /dev/null +++ b/posix/tst-spawn5.c @@ -0,0 +1,152 @@ +/* Check posix_spawn set controlling terminal extension. + Copyright (C) 2021 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +static int +handle_restart (const char *argv1) +{ + bool setpgrp = strcmp (argv1, "setgrpr") == 0; + int fd = xopen (_PATH_TTY, O_RDONLY, 0600); + + /* If process group is not changed (POSIX_SPAWN_SETPGROUP), then check + the creating process one, otherwise check against the process group + itself. */ + pid_t pgrp; + if (!setpgrp) + TEST_COMPARE (sscanf (argv1, "%d", &pgrp), 1); + else + pgrp = getpgrp (); + TEST_COMPARE (tcgetpgrp (fd), pgrp); + + xclose (fd); + return 0; +} + +static int restart; +#define CMDLINE_OPTIONS \ + { "restart", no_argument, &restart, 1 }, + +static void +run_subprogram (int argc, char *argv[], const posix_spawnattr_t *attr, + int exp_err) +{ + short int flags; + TEST_COMPARE (posix_spawnattr_getflags (attr, &flags), 0); + bool setpgrp = flags & POSIX_SPAWN_SETPGROUP; + + char *spargv[9]; + char pgrp[INT_STRLEN_BOUND (pid_t)]; + + int i = 0; + for (; i < 4; i++) + spargv[i] = argv[i + 1]; + spargv[i++] = (char *) "--direct"; + spargv[i++] = (char *) "--restart"; + if (setpgrp) + spargv[i++] = (char *) "setgrpr"; + else + { + snprintf (pgrp, sizeof pgrp, "%d", getpgrp ()); + spargv[i++] = pgrp; + } + spargv[i] = NULL; + + pid_t pid; + TEST_COMPARE (posix_spawn (&pid, argv[1], NULL, attr, spargv, environ), + exp_err); + if (exp_err != 0) + return; + + int status; + TEST_COMPARE (xwaitpid (pid, &status, 0), pid); + TEST_VERIFY (WIFEXITED (status)); + TEST_VERIFY (!WIFSIGNALED (status)); + TEST_COMPARE (WEXITSTATUS (status), 0); +} + +static int +do_test (int argc, char *argv[]) +{ + /* We must have either: + - One our fource parameters left if called initially: + + path to ld.so optional + + "--library-path" optional + + the library path optional + + the application name + - six parameters left if called through re-execution: + + --setgrpr optional + */ + + if (restart) + return handle_restart (argv[1]); + + { + int tcfd = xopen (_PATH_TTY, O_RDONLY, 0600); + + posix_spawnattr_t attr; + TEST_COMPARE (posix_spawnattr_init (&attr), 0); + TEST_COMPARE (posix_spawnattr_setflags (&attr, POSIX_SPAWN_TCSETPGROUP), + 0); + TEST_COMPARE (posix_spawnattr_tcsetpgrp_np (&attr, tcfd), 0); + + int fd; + TEST_COMPARE (posix_spawnattr_tcgetpgrp_np (&attr, &fd), 0); + TEST_COMPARE (tcfd, fd); + + run_subprogram (argc, argv, &attr, 0); + + xclose (tcfd); + } + + { + posix_spawnattr_t attr; + TEST_COMPARE (posix_spawnattr_init (&attr), 0); + TEST_COMPARE (posix_spawnattr_setflags (&attr, POSIX_SPAWN_TCSETPGROUP + | POSIX_SPAWN_SETPGROUP), + 0); + TEST_COMPARE (posix_spawnattr_setpgroup (&attr, 0), 0); + + run_subprogram (argc, argv, &attr, 0); + } + + { + posix_spawnattr_t attr; + TEST_COMPARE (posix_spawnattr_init (&attr), 0); + TEST_COMPARE (posix_spawnattr_setflags (&attr, POSIX_SPAWN_TCSETPGROUP + | POSIX_SPAWN_SETSID), 0); + + run_subprogram (argc, argv, &attr, ENOTTY); + } + + return 0; +} + +#define TEST_FUNCTION_ARGV do_test +#include diff --git a/sysdeps/generic/libc.abilist b/sysdeps/generic/libc.abilist index e69de29bb2..72f9b9c5b0 100644 --- a/sysdeps/generic/libc.abilist +++ b/sysdeps/generic/libc.abilist @@ -0,0 +1,2 @@ +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F diff --git a/sysdeps/mach/hurd/i386/libc.abilist b/sysdeps/mach/hurd/i386/libc.abilist index f651989962..09ffa89dd6 100644 --- a/sysdeps/mach/hurd/i386/libc.abilist +++ b/sysdeps/mach/hurd/i386/libc.abilist @@ -2226,6 +2226,8 @@ GLIBC_2.34 dlopen F GLIBC_2.34 dlsym F GLIBC_2.34 dlvsym F GLIBC_2.34 execveat F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 timespec_getres F GLIBC_2.4 __confstr_chk F GLIBC_2.4 __fgets_chk F diff --git a/sysdeps/mach/hurd/spawni.c b/sysdeps/mach/hurd/spawni.c index b5c92365f2..2646ad128a 100644 --- a/sysdeps/mach/hurd/spawni.c +++ b/sysdeps/mach/hurd/spawni.c @@ -390,6 +390,19 @@ retry: if (!err && (flags & POSIX_SPAWN_SETPGROUP) != 0) err = __proc_setpgrp (proc, new_pid, attrp->__pgrp); + /* Set the controlling terminal. */ + if (!err && (flags & POSIX_SPAWN_TCSETPGROUP) != 0) + { + pid_t pgrp; + /* Check if it is possible to avoid an extra syscall. */ + if ((attrp->__flags & POSIX_SPAWN_SETPGROUP) != 0 && attrp->__pgrp != 0) + pgrp = attrp->__pgrp; + else + err = __proc_getpgrp (proc, new_pid, &pgrp); + if (!err) + err = __tcsetpgrp (attrp->__tcpgrp, pgrp); + } + /* Set the effective user and group IDs. */ if (!err && (flags & POSIX_SPAWN_RESETIDS) != 0) { diff --git a/sysdeps/unix/bsd/tcsetpgrp.c b/sysdeps/unix/bsd/tcsetpgrp.c index 98c88db3ae..3930b4f674 100644 --- a/sysdeps/unix/bsd/tcsetpgrp.c +++ b/sysdeps/unix/bsd/tcsetpgrp.c @@ -22,7 +22,9 @@ /* Set the foreground process group ID of FD set PGRP_ID. */ int -tcsetpgrp (int fd, pid_t pgrp_id) +__tcsetpgrp (int fd, pid_t pgrp_id) { return __ioctl (fd, TIOCSPGRP, &pgrp_id); } +weak_alias (__tcsetpgrp, tcsetpgrp) +libc_hidden_def (__tcsetpgrp) diff --git a/sysdeps/unix/sysv/linux/aarch64/libc.abilist b/sysdeps/unix/sysv/linux/aarch64/libc.abilist index ad4c83787d..6636cd6f02 100644 --- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist +++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist @@ -2369,6 +2369,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist index 30dfd0baa1..b40195a3d2 100644 --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist @@ -2462,6 +2462,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/arc/libc.abilist b/sysdeps/unix/sysv/linux/arc/libc.abilist index 72ff8c5bdc..ae4fc6131b 100644 --- a/sysdeps/unix/sysv/linux/arc/libc.abilist +++ b/sysdeps/unix/sysv/linux/arc/libc.abilist @@ -2128,6 +2128,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/arm/be/libc.abilist b/sysdeps/unix/sysv/linux/arm/be/libc.abilist index 4c870e6abb..85d49a4a1a 100644 --- a/sysdeps/unix/sysv/linux/arm/be/libc.abilist +++ b/sysdeps/unix/sysv/linux/arm/be/libc.abilist @@ -301,6 +301,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/arm/le/libc.abilist b/sysdeps/unix/sysv/linux/arm/le/libc.abilist index 1f0dbc990a..a30b5ec5e1 100644 --- a/sysdeps/unix/sysv/linux/arm/le/libc.abilist +++ b/sysdeps/unix/sysv/linux/arm/le/libc.abilist @@ -298,6 +298,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist index 9756eaeccf..231e075178 100644 --- a/sysdeps/unix/sysv/linux/csky/libc.abilist +++ b/sysdeps/unix/sysv/linux/csky/libc.abilist @@ -2388,6 +2388,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist index e78cb54597..62676ecd04 100644 --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist @@ -2342,6 +2342,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist index d1583a5465..507aca35bf 100644 --- a/sysdeps/unix/sysv/linux/i386/libc.abilist +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist @@ -2526,6 +2526,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist index 4a608b5d29..795b3d6236 100644 --- a/sysdeps/unix/sysv/linux/ia64/libc.abilist +++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist @@ -2302,6 +2302,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist index 72db6c699b..54f7a1e929 100644 --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist @@ -302,6 +302,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist index bd4166dbb1..4068d844d7 100644 --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist @@ -2469,6 +2469,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist index 83a6edae67..18bd67e126 100644 --- a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist +++ b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist @@ -2439,6 +2439,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist index accdc16e0c..9aa2941429 100644 --- a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist +++ b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist @@ -2436,6 +2436,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist index 26149e7d3c..c8f84b6d37 100644 --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist @@ -2434,6 +2434,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist index 8f9b7f088d..56d2d2aa2d 100644 --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist @@ -2432,6 +2432,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist index 57500f91ce..b3d7a5e0fe 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist @@ -2440,6 +2440,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist index 485a0121dd..4db0cb900c 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist @@ -2358,6 +2358,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist index d07e736980..1ee9db21d9 100644 --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist @@ -2478,6 +2478,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist index 5a87b36192..fc53a61f07 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist @@ -2496,6 +2496,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist index 413bb1d87a..247b3cf79a 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist @@ -2529,6 +2529,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist index 3ff4d977f7..81c1dcbb08 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist @@ -2266,6 +2266,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist index c2c5c605ac..a80c60ed77 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist @@ -2565,6 +2565,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist index 2abe414bda..3c75c8c69e 100644 --- a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist +++ b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist @@ -2130,6 +2130,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist index 947fc8072d..7d5faba14a 100644 --- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist +++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist @@ -2330,6 +2330,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist index 1da934084c..b411caab9c 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist @@ -2494,6 +2494,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist index 084b419cf6..5a4c785b6d 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist @@ -2303,6 +2303,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/sh/be/libc.abilist b/sysdeps/unix/sysv/linux/sh/be/libc.abilist index 240e315a05..e2c5cbb8c1 100644 --- a/sysdeps/unix/sysv/linux/sh/be/libc.abilist +++ b/sysdeps/unix/sysv/linux/sh/be/libc.abilist @@ -2349,6 +2349,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/sh/le/libc.abilist b/sysdeps/unix/sysv/linux/sh/le/libc.abilist index c8b6e4745e..b927d7a946 100644 --- a/sysdeps/unix/sysv/linux/sh/le/libc.abilist +++ b/sysdeps/unix/sysv/linux/sh/le/libc.abilist @@ -2346,6 +2346,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist index 3ed972b8c9..3b6fbda777 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist @@ -2487,6 +2487,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist index 27b3443394..42f11bf242 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist @@ -2323,6 +2323,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/spawni.c b/sysdeps/unix/sysv/linux/spawni.c index 501f8fbccd..1fe94f0582 100644 --- a/sysdeps/unix/sysv/linux/spawni.c +++ b/sysdeps/unix/sysv/linux/spawni.c @@ -33,6 +33,9 @@ #include #include "spawn_int.h" +_Static_assert (sizeof (posix_spawnattr_t) == 336, + "sizeof (posix_spawnattr_t) != 336"); + /* The Linux implementation of posix_spawn{p} uses the clone syscall directly with CLONE_VM and CLONE_VFORK flags and an allocated stack. The new stack and start function solves most the vfork limitation (possible parent @@ -184,6 +187,17 @@ __spawni_child (void *arguments) && __setpgid (0, attr->__pgrp) != 0) goto fail; + /* Set the controlling terminal. */ + if ((attr->__flags & POSIX_SPAWN_TCSETPGROUP) != 0) + { + /* Check if it is possible to avoid an extra syscall. */ + pid_t pgrp = (attr->__flags & POSIX_SPAWN_SETPGROUP) != 0 + && attr->__pgrp != 0 + ? attr->__pgrp : __getpgrp (); + if (__tcsetpgrp (attr->__tcpgrp, pgrp) != 0) + goto fail; + } + /* Set the effective user and group IDs. */ if ((attr->__flags & POSIX_SPAWN_RESETIDS) != 0 && (local_seteuid (__getuid ()) != 0 diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list index 01ec2bfa95..07f9cfbe2d 100644 --- a/sysdeps/unix/sysv/linux/syscalls.list +++ b/sysdeps/unix/sysv/linux/syscalls.list @@ -17,7 +17,7 @@ getpid - getpid Ei: __getpid getpid getegid - getegid Ei: __getegid getegid geteuid - geteuid Ei: __geteuid geteuid getpgid - getpgid i:i __getpgid getpgid -getpgrp - getpgrp Ei: getpgrp +getpgrp - getpgrp Ei: __getpgrp getpgrp getppid - getppid Ei: __getppid getppid getresuid - getresuid i:ppp getresuid getresgid - getresgid i:ppp getresgid diff --git a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist index 2e5c5957b0..d9b76589d5 100644 --- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist @@ -2281,6 +2281,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist index 0b0d1ac43f..601499f829 100644 --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist @@ -2384,6 +2384,8 @@ GLIBC_2.34 mtx_lock F GLIBC_2.34 mtx_timedlock F GLIBC_2.34 mtx_trylock F GLIBC_2.34 mtx_unlock F +GLIBC_2.34 posix_spawnattr_tcgetpgrp_np F +GLIBC_2.34 posix_spawnattr_tcsetpgrp_np F GLIBC_2.34 pthread_attr_getaffinity_np F GLIBC_2.34 pthread_attr_getguardsize F GLIBC_2.34 pthread_attr_getstack F diff --git a/termios/tcsetpgrp.c b/termios/tcsetpgrp.c index 05630cd04c..9bd94a70bc 100644 --- a/termios/tcsetpgrp.c +++ b/termios/tcsetpgrp.c @@ -21,7 +21,7 @@ /* Set the foreground process group ID of FD set PGRP_ID. */ int -tcsetpgrp (int fd, pid_t pgrp_id) +__tcsetpgrp (int fd, pid_t pgrp_id) { if (fd < 0) { @@ -32,6 +32,7 @@ tcsetpgrp (int fd, pid_t pgrp_id) __set_errno (ENOSYS); return -1; } - +weak_alias (__tcsetpgrp, tcsetpgrp); +libc_hidden_def (__tcsetpgrp) stub_warning (tcsetpgrp)