From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) by sourceware.org (Postfix) with ESMTP id A70D73858408 for ; Tue, 28 Sep 2021 14:05:10 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org A70D73858408 Received: from mail-qk1-f198.google.com (mail-qk1-f198.google.com [209.85.222.198]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-189-RJhkrwwsPSWQN25sfuMLPQ-1; Tue, 28 Sep 2021 10:05:05 -0400 X-MC-Unique: RJhkrwwsPSWQN25sfuMLPQ-1 Received: by mail-qk1-f198.google.com with SMTP id q10-20020a05620a0d8a00b0045de482ae16so52885839qkl.12 for ; Tue, 28 Sep 2021 07:05:05 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:message-id:date:mime-version:user-agent:subject :content-language:to:references:from:organization:in-reply-to :content-transfer-encoding; bh=UR1ynZcTcVDmyyb6jN1BQjciGnCo7010LU5uJoSLK1c=; b=108PR5dDlat8m+cGhVvGAFBeIhVY0xcgw/MHNy/RLW48X0qUjOegor5iMAEa4Zmu8v gXBZlCpx0zTloiX9UtJAyLQatPprxU3g7KYVD1jPxFgw15+P2xezsAGYW+Zh1XlBFoMP fPc9ED1nY0/PnNWyBDHw8JGvIYgURa2WNp6MzIK6TK4T3UVOJgWMU/1IrWi4KscudE6j aWBYU6xAH6bX7nFiWn7A1JlL+SYIrvrLjsLAo90aDFXtQQgNwXTPtBUxY1A6QDNZsBGN h44SYftm9N5hEyEeih0V0LoxeqZUrt9NoYdSxtaXfdxrCpmA27o6sk1+oXK/aXqk+0Zr QGjw== X-Gm-Message-State: AOAM53254AZ7XECkF0uGvSce57soZXXOqvRXrrMKkjnZFP19xLGWjOyD EKRo7RjDnUuvMZRPyeq0BkJzTY880A38VzBtE8HWp0t1/CT0n0GdpcRpupb8Sw0Z9RjWFOjmvEo Ezq5/RnU+GwAO9G1FWLl6 X-Received: by 2002:a0c:914f:: with SMTP id q73mr5957888qvq.39.1632837904115; Tue, 28 Sep 2021 07:05:04 -0700 (PDT) X-Google-Smtp-Source: ABdhPJySvpWYmc4jplOIcGh/6rg62vzCuJR78g5xPiVJ1rwsYEc4A874PGDumuycPi2HFBRfEM/JIg== X-Received: by 2002:a0c:914f:: with SMTP id q73mr5957825qvq.39.1632837903455; Tue, 28 Sep 2021 07:05:03 -0700 (PDT) Received: from [192.168.1.16] (198-84-214-74.cpe.teksavvy.com. [198.84.214.74]) by smtp.gmail.com with ESMTPSA id l19sm9327205qkk.12.2021.09.28.07.05.02 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 28 Sep 2021 07:05:02 -0700 (PDT) Message-ID: Date: Tue, 28 Sep 2021 10:05:01 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.1.0 Subject: Re: [PATCH v3] posix: Add terminal control setting support for posix_spawn To: Adhemerval Zanella , libc-alpha@sourceware.org References: <20210927162345.3924996-1-adhemerval.zanella@linaro.org> From: Carlos O'Donell Organization: Red Hat In-Reply-To: <20210927162345.3924996-1-adhemerval.zanella@linaro.org> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-13.1 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, NICE_REPLY_A, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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-List-Received-Date: Tue, 28 Sep 2021 14:05:15 -0000 On 9/27/21 12:23, Adhemerval Zanella via Libc-alpha wrote: > Changes from v2: > > - Properly add posix/tst-spawn6 on tests. This needs rebasing please. Fails to apply to dev branch. https://www.delorie.com/trybots/apply_patch/45479.txt > -- > > 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 created 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, tcfd); > posix_spawnattr_setpgroup (&attr, 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 only provides the POSIX_SPAWN_TCSETPGROUP flag. The QNX > documentation does not specify how the controlling terminal is obtained > nor how it iteracts with POSIX_SPAWN_SETPGROUP. Since a glibc > implementation is library based, it is more straightforward and avoid > requires additional file descriptor operations to request the caller > to setup the controlling terminal file descriptor (and it also allows > a bit 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 | 4 + > posix/Makefile | 6 +- > posix/Versions | 4 + > posix/spawn.h | 16 +- > posix/spawnattr_setflags.c | 3 +- > posix/spawnattr_tcgetpgrp.c | 26 +++ > posix/spawnattr_tcsetpgrp.c | 26 +++ > posix/tst-spawn6.c | 174 ++++++++++++++++++ > 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 | 11 ++ > 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 +- > 47 files changed, 356 insertions(+), 9 deletions(-) > create mode 100644 posix/spawnattr_tcgetpgrp.c > create mode 100644 posix/spawnattr_tcsetpgrp.c > create mode 100644 posix/tst-spawn6.c > > diff --git a/NEWS b/NEWS > index 79c895e382..90c506ed51 100644 > --- a/NEWS > +++ b/NEWS > @@ -9,7 +9,10 @@ Version 2.35 > > Major new features: > > - [Add new features here] > +* The functions posix_spawnattr_tcsetpgrp_np and posix_spawnattr_tcgetpgrp_np > + have been 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: > > diff --git a/include/unistd.h b/include/unistd.h > index 7849562c42..d7eaea3eef 100644 > --- a/include/unistd.h > +++ b/include/unistd.h > @@ -173,6 +173,10 @@ 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 059efb3cd2..fe2fc45c72 100644 > --- a/posix/Makefile > +++ b/posix/Makefile > @@ -64,6 +64,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 \ > @@ -107,7 +108,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-spawn5 > + tst-wordexp-nocmd tst-execveat tst-spawn5 tst-spawn6 > > # Test for the glob symbol version that was replaced in glibc 2.27. > ifeq ($(have-GLIBC_2.26)$(build-shared),yesyes) > @@ -276,8 +277,9 @@ 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-spawn-static-ARGS = $(tst-spawn-ARGS) > tst-spawn5-ARGS = -- $(host-test-program-cmd) > +tst-spawn-static-ARGS = $(tst-spawn-ARGS) > +tst-spawn6-ARGS = -- $(host-test-program-cmd) > tst-dir-ARGS = `pwd` `cd $(common-objdir)/$(subdir); pwd` `cd $(common-objdir); pwd` $(objpfx)tst-dir > tst-chmod-ARGS = $(objdir) > tst-vfork3-ARGS = --test-dir=$(objpfx) > diff --git a/posix/Versions b/posix/Versions > index a78792135f..e4f4f649b0 100644 > --- a/posix/Versions > +++ b/posix/Versions > @@ -156,6 +156,10 @@ libc { > execveat; > posix_spawn_file_actions_addclosefrom_np; > } > + GLIBC_2.35 { > + posix_spawnattr_tcgetpgrp_np; > + posix_spawnattr_tcsetpgrp_np; > + } > GLIBC_PRIVATE { > __libc_fork; __libc_pread; __libc_pwrite; > __nanosleep_nocancel; __pause_nocancel; > diff --git a/posix/spawn.h b/posix/spawn.h > index 990d8a6ba2..742d4cb625 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 __ctty_fd; > + 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 session). */ > +extern int posix_spawnattr_tcsetpgrp_np (posix_spawnattr_t *__attr, int fd) > + __THROW __nonnull ((1)); > + > +/* Return 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..6d5dcd438b > --- /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->__ctty_fd; > + return 0; > +} > diff --git a/posix/spawnattr_tcsetpgrp.c b/posix/spawnattr_tcsetpgrp.c > new file mode 100644 > index 0000000000..b1b5d5dba0 > --- /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->__ctty_fd = fd; > + return 0; > +} > diff --git a/posix/tst-spawn6.c b/posix/tst-spawn6.c > new file mode 100644 > index 0000000000..67a1096a26 > --- /dev/null > +++ b/posix/tst-spawn6.c > @@ -0,0 +1,174 @@ > +/* 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 (); > + /* Check if a new process group was actually created. */ > + pid_t ppid = getppid (); > + pid_t pgid = getpgid (ppid); > + TEST_VERIFY (pgid != pgrp); > + } > + > + 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 < argc - 1; 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, WUNTRACED), pid); > + TEST_VERIFY (WIFEXITED (status)); > + TEST_VERIFY (!WIFSTOPPED (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); > + > + /* Check getters and setters. */ > + { > + posix_spawnattr_t attr; > + TEST_COMPARE (posix_spawnattr_init (&attr), 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); > + } > + > + /* Check setting the controlling terminal without changing the group. */ > + { > + 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); > + > + run_subprogram (argc, argv, &attr, 0); > + } > + > + /* Check setting both the controlling terminal and the create a new process > + group. */ > + { > + 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); > + TEST_COMPARE (posix_spawnattr_tcsetpgrp_np (&attr, tcfd), 0); > + > + run_subprogram (argc, argv, &attr, 0); > + } > + > + /* Trying to set the controlling terminal after a setsid() incurs in a ENOTTY > + from tcsetpgrp. */ > + { > + posix_spawnattr_t attr; > + TEST_COMPARE (posix_spawnattr_init (&attr), 0); > + TEST_COMPARE (posix_spawnattr_setflags (&attr, POSIX_SPAWN_TCSETPGROUP > + | POSIX_SPAWN_SETSID), 0); > + TEST_COMPARE (posix_spawnattr_tcsetpgrp_np (&attr, tcfd), 0); > + > + run_subprogram (argc, argv, &attr, ENOTTY); > + } > + > + xclose (tcfd); > + > + return 0; > +} > + > +#define TEST_FUNCTION_ARGV do_test > +#include > diff --git a/sysdeps/mach/hurd/i386/libc.abilist b/sysdeps/mach/hurd/i386/libc.abilist > index c5da10a0cd..9db40e5dcc 100644 > --- a/sysdeps/mach/hurd/i386/libc.abilist > +++ b/sysdeps/mach/hurd/i386/libc.abilist > @@ -2285,6 +2285,8 @@ GLIBC_2.34 res_send F > GLIBC_2.34 shm_open F > GLIBC_2.34 shm_unlink F > GLIBC_2.34 timespec_getres F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > GLIBC_2.4 __confstr_chk F > GLIBC_2.4 __fgets_chk F > GLIBC_2.4 __fgets_unlocked_chk F > diff --git a/sysdeps/mach/hurd/spawni.c b/sysdeps/mach/hurd/spawni.c > index 060e389bbb..4d71181643 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->__ctty_fd, 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 21a2e50a88..618afab10e 100644 > --- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist > @@ -2612,3 +2612,5 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > diff --git a/sysdeps/unix/sysv/linux/alpha/libc.abilist b/sysdeps/unix/sysv/linux/alpha/libc.abilist > index a201fd69ba..71c8723354 100644 > --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist > +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist > @@ -2709,6 +2709,8 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > GLIBC_2.4 _IO_fprintf F > GLIBC_2.4 _IO_printf F > GLIBC_2.4 _IO_sprintf F > diff --git a/sysdeps/unix/sysv/linux/arc/libc.abilist b/sysdeps/unix/sysv/linux/arc/libc.abilist > index 2611436937..e5914da07a 100644 > --- a/sysdeps/unix/sysv/linux/arc/libc.abilist > +++ b/sysdeps/unix/sysv/linux/arc/libc.abilist > @@ -2373,3 +2373,5 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > diff --git a/sysdeps/unix/sysv/linux/arm/be/libc.abilist b/sysdeps/unix/sysv/linux/arm/be/libc.abilist > index a426241965..eb99b9daa5 100644 > --- a/sysdeps/unix/sysv/linux/arm/be/libc.abilist > +++ b/sysdeps/unix/sysv/linux/arm/be/libc.abilist > @@ -491,6 +491,8 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > GLIBC_2.4 _Exit F > GLIBC_2.4 _IO_2_1_stderr_ D 0xa0 > GLIBC_2.4 _IO_2_1_stdin_ D 0xa0 > diff --git a/sysdeps/unix/sysv/linux/arm/le/libc.abilist b/sysdeps/unix/sysv/linux/arm/le/libc.abilist > index 02f80418cc..5d271973ad 100644 > --- a/sysdeps/unix/sysv/linux/arm/le/libc.abilist > +++ b/sysdeps/unix/sysv/linux/arm/le/libc.abilist > @@ -488,6 +488,8 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > GLIBC_2.4 _Exit F > GLIBC_2.4 _IO_2_1_stderr_ D 0xa0 > GLIBC_2.4 _IO_2_1_stdin_ D 0xa0 > diff --git a/sysdeps/unix/sysv/linux/csky/libc.abilist b/sysdeps/unix/sysv/linux/csky/libc.abilist > index b7676eb372..4cfe377afb 100644 > --- a/sysdeps/unix/sysv/linux/csky/libc.abilist > +++ b/sysdeps/unix/sysv/linux/csky/libc.abilist > @@ -2647,3 +2647,5 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > diff --git a/sysdeps/unix/sysv/linux/hppa/libc.abilist b/sysdeps/unix/sysv/linux/hppa/libc.abilist > index f6965c9d95..f81a953a2f 100644 > --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist > +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist > @@ -2596,6 +2596,8 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > GLIBC_2.4 __confstr_chk F > GLIBC_2.4 __fgets_chk F > GLIBC_2.4 __fgets_unlocked_chk F > diff --git a/sysdeps/unix/sysv/linux/i386/libc.abilist b/sysdeps/unix/sysv/linux/i386/libc.abilist > index 2e7603d9ed..523656c240 100644 > --- a/sysdeps/unix/sysv/linux/i386/libc.abilist > +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist > @@ -2780,6 +2780,8 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > GLIBC_2.4 __confstr_chk F > GLIBC_2.4 __fgets_chk F > GLIBC_2.4 __fgets_unlocked_chk F > diff --git a/sysdeps/unix/sysv/linux/ia64/libc.abilist b/sysdeps/unix/sysv/linux/ia64/libc.abilist > index dd3a56d3fe..5c8a61f3e0 100644 > --- a/sysdeps/unix/sysv/linux/ia64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist > @@ -2547,6 +2547,8 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > GLIBC_2.4 __confstr_chk F > GLIBC_2.4 __fgets_chk F > GLIBC_2.4 __fgets_unlocked_chk F > diff --git a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist > index c1e0ea9c10..16ea270119 100644 > --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist > +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist > @@ -492,6 +492,8 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > GLIBC_2.4 _Exit F > GLIBC_2.4 _IO_2_1_stderr_ D 0x98 > GLIBC_2.4 _IO_2_1_stdin_ D 0x98 > diff --git a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist > index 93161048ca..47579d5f0a 100644 > --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist > +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist > @@ -2723,6 +2723,8 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > GLIBC_2.4 __confstr_chk F > GLIBC_2.4 __fgets_chk F > GLIBC_2.4 __fgets_unlocked_chk F > diff --git a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist > index 0aaeec8a27..51d0575b7a 100644 > --- a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist > +++ b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist > @@ -2696,3 +2696,5 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > diff --git a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist > index bec5f456c9..2c78533f94 100644 > --- a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist > +++ b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist > @@ -2693,3 +2693,5 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > diff --git a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist > index 97d2127f78..83352f77fe 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist > +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist > @@ -2688,6 +2688,8 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > GLIBC_2.4 __confstr_chk F > GLIBC_2.4 __fgets_chk F > GLIBC_2.4 __fgets_unlocked_chk F > diff --git a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist > index acb0756c11..f94e2a3b96 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist > +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist > @@ -2686,6 +2686,8 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > GLIBC_2.4 __confstr_chk F > GLIBC_2.4 __fgets_chk F > GLIBC_2.4 __fgets_unlocked_chk F > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist > index ebc21dde1e..c4b949c476 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist > +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist > @@ -2694,6 +2694,8 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > GLIBC_2.4 __confstr_chk F > GLIBC_2.4 __fgets_chk F > GLIBC_2.4 __fgets_unlocked_chk F > diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist > index c68f7e3c6c..027dd91a11 100644 > --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist > @@ -2598,6 +2598,8 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > GLIBC_2.4 __confstr_chk F > GLIBC_2.4 __fgets_chk F > GLIBC_2.4 __fgets_unlocked_chk F > diff --git a/sysdeps/unix/sysv/linux/nios2/libc.abilist b/sysdeps/unix/sysv/linux/nios2/libc.abilist > index e5b6834f14..c7d4a091b3 100644 > --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist > +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist > @@ -2735,3 +2735,5 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist > index 132707c8ad..b79513af92 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist > @@ -2750,6 +2750,8 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > GLIBC_2.4 _IO_fprintf F > GLIBC_2.4 _IO_printf F > GLIBC_2.4 _IO_sprintf F > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist > index 0af2be31a0..389203bef3 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist > @@ -2783,6 +2783,8 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > GLIBC_2.4 _IO_fprintf F > GLIBC_2.4 _IO_printf F > GLIBC_2.4 _IO_sprintf F > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist > index cf864632d0..cf1a602c38 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist > @@ -2506,6 +2506,8 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > GLIBC_2.4 _IO_fprintf F > GLIBC_2.4 _IO_printf F > GLIBC_2.4 _IO_sprintf F > diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist > index d566d675d0..30d0e6f443 100644 > --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist > +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist > @@ -2808,3 +2808,5 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > diff --git a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist > index c9a7eacb32..5305f972b6 100644 > --- a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist > +++ b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist > @@ -2375,3 +2375,5 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > diff --git a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist > index 8299131cb2..d14578af93 100644 > --- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist > @@ -2575,3 +2575,5 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist > index c3fe78f77f..cbb9b7a21e 100644 > --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist > +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist > @@ -2748,6 +2748,8 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > GLIBC_2.4 _IO_fprintf F > GLIBC_2.4 _IO_printf F > GLIBC_2.4 _IO_sprintf F > diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist > index 83e542aa8c..f79b4c9b08 100644 > --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist > @@ -2543,6 +2543,8 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > GLIBC_2.4 _IO_fprintf F > GLIBC_2.4 _IO_printf F > GLIBC_2.4 _IO_sprintf F > diff --git a/sysdeps/unix/sysv/linux/sh/be/libc.abilist b/sysdeps/unix/sysv/linux/sh/be/libc.abilist > index dc502f6833..418283101b 100644 > --- a/sysdeps/unix/sysv/linux/sh/be/libc.abilist > +++ b/sysdeps/unix/sysv/linux/sh/be/libc.abilist > @@ -2603,6 +2603,8 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > GLIBC_2.4 __confstr_chk F > GLIBC_2.4 __fgets_chk F > GLIBC_2.4 __fgets_unlocked_chk F > diff --git a/sysdeps/unix/sysv/linux/sh/le/libc.abilist b/sysdeps/unix/sysv/linux/sh/le/libc.abilist > index cba1abb556..0aeb958a11 100644 > --- a/sysdeps/unix/sysv/linux/sh/le/libc.abilist > +++ b/sysdeps/unix/sysv/linux/sh/le/libc.abilist > @@ -2600,6 +2600,8 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > GLIBC_2.4 __confstr_chk F > GLIBC_2.4 __fgets_chk F > GLIBC_2.4 __fgets_unlocked_chk F > diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist > index d4a516fb47..9d311932b4 100644 > --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist > +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist > @@ -2743,6 +2743,8 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > GLIBC_2.4 _IO_fprintf F > GLIBC_2.4 _IO_printf F > GLIBC_2.4 _IO_sprintf F > diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist > index 6268875ba3..a84761b855 100644 > --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist > @@ -2570,6 +2570,8 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > GLIBC_2.4 __confstr_chk F > GLIBC_2.4 __fgets_chk F > GLIBC_2.4 __fgets_unlocked_chk F > diff --git a/sysdeps/unix/sysv/linux/spawni.c b/sysdeps/unix/sysv/linux/spawni.c > index 6b0bade4d4..601850638d 100644 > --- a/sysdeps/unix/sysv/linux/spawni.c > +++ b/sysdeps/unix/sysv/linux/spawni.c > @@ -164,6 +164,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 : __getpgid (0); > + if (__tcsetpgrp (attr->__ctty_fd, 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 29899eb264..c89c18e764 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 095e914b73..0ef949d649 100644 > --- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist > +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist > @@ -2521,6 +2521,8 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F > GLIBC_2.4 __confstr_chk F > GLIBC_2.4 __fgets_chk F > GLIBC_2.4 __fgets_unlocked_chk F > diff --git a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist > index dd910f7fe9..11ec9f4fda 100644 > --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist > +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist > @@ -2627,3 +2627,5 @@ GLIBC_2.34 tss_create F > GLIBC_2.34 tss_delete F > GLIBC_2.34 tss_get F > GLIBC_2.34 tss_set F > +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F > +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np 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) > -- Cheers, Carlos.