From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-oi1-x22a.google.com (mail-oi1-x22a.google.com [IPv6:2607:f8b0:4864:20::22a]) by sourceware.org (Postfix) with ESMTPS id 17BBD3858412 for ; Mon, 24 Jan 2022 17:48:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 17BBD3858412 Received: by mail-oi1-x22a.google.com with SMTP id s127so26695477oig.2 for ; Mon, 24 Jan 2022 09:48:49 -0800 (PST) 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:cc:references:from:in-reply-to :content-transfer-encoding; bh=X+6grClsL/RLdbY3Fn+C2mEJ/6FrD6RPl3LTP/+RqqU=; b=SLIJyg/7+8Fx9KvlwTKTMgW+Quj3Nm61eDYw5AjMoVaYKmqvmKnokrIBStxgNLPoJF IMZEWVhOr1EQBn0i9s4B6XczNBH4s0zPBjCTwWbMOvtRLx6zbqeuYDbrdSoApHnmZIE7 ux/Km46DoabrOIeedl28VVHYpHTDyw+BRyZ7L7ZnnV83T4Wq5v5rHNZYIFJ6oUUL7X4U 9xclVvTDJo6DP0dT/h0y8s56S9K3Pp2dz5ZStpqXcYeVIFEea55RncTW4pte8KoC270N pexdpb+R/UIyIVeY8Nf7pXh4xqEoMYdiqvA2egjwgsx9gEocOdeVzLH/BHCZUVnJbB2Y jq9Q== X-Gm-Message-State: AOAM530CtGqs7E1AY17R/qHgfb8Lrzrx9uocGMti7gfQNb98N67Zzvjs LRmyqNJTg1xtUfxFB8U/rZD85w== X-Google-Smtp-Source: ABdhPJwOuPw9CE2TxC8kfAgCL+LGeHvrU/KZGfpIdTJ9Lnd3Iq7phWfRZVcfEVJYVf/XjLIvNRH14w== X-Received: by 2002:a05:6808:f11:: with SMTP id m17mr2412872oiw.77.1643046527972; Mon, 24 Jan 2022 09:48:47 -0800 (PST) Received: from ?IPV6:2804:431:c7cb:27f8:c505:63c0:de61:b716? ([2804:431:c7cb:27f8:c505:63c0:de61:b716]) by smtp.gmail.com with ESMTPSA id j9sm3154475otp.23.2022.01.24.09.48.46 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 24 Jan 2022 09:48:47 -0800 (PST) Message-ID: <12cd6b4d-8d8b-a77c-5470-38ec182c4956@linaro.org> Date: Mon, 24 Jan 2022 14:48:45 -0300 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.5.0 Subject: Re: [PATCH v6] posix: Add terminal control setting support for posix_spawn Content-Language: en-US To: Carlos O'Donell , libc-alpha@sourceware.org Cc: Siddhesh Poyarekar References: <20220113143941.816573-1-adhemerval.zanella@linaro.org> From: Adhemerval Zanella In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, NICE_REPLY_A, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, 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: Mon, 24 Jan 2022 17:48:54 -0000 On 24/01/2022 14:25, Carlos O'Donell wrote: > On 1/13/22 09:39, Adhemerval Zanella via Libc-alpha wrote: >> 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. > > Please post v7 with changes (and Florian's suggestions). > - NEWS text changes. > - Update dates to 2022. > > Agreed, this is a real problem with an identified solution (rather than an abstract API > that we're adding for a future use case). > > The fix looks very good to me, and I'm ready to give Reviewed-by and Tested-by once you > post v7 with the fixes for inclusion in glibc 2.35. > >> 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. > > OK. > >> 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). > > OK. In general you need an fd (int) and pgrp (pid_t). > >> 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); > > OK. > >> >> 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 >> --- >> v6: Rebased against master and added or1k abilist. >> v5: Rebased against master. >> v3: Properly added posix/tst-spawn6 on tests. >> v4: Rebased against master. >> --- >> 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 | 173 ++++++++++++++++++ >> sysdeps/mach/hurd/libhurduser.abilist | 0 >> sysdeps/mach/hurd/spawni.c | 13 ++ >> sysdeps/mach/libmachuser.abilist | 0 >> 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 + >> sysdeps/unix/sysv/linux/or1k/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 +- >> 49 files changed, 356 insertions(+), 8 deletions(-) >> create mode 100644 posix/spawnattr_tcgetpgrp.c >> create mode 100644 posix/spawnattr_tcsetpgrp.c >> create mode 100644 posix/tst-spawn6.c >> delete mode 100644 sysdeps/mach/hurd/libhurduser.abilist >> delete mode 100644 sysdeps/mach/libmachuser.abilist >> >> diff --git a/NEWS b/NEWS >> index a957b19fdc..0ee67c5f29 100644 >> --- a/NEWS >> +++ b/NEWS >> @@ -120,6 +120,11 @@ Major new features: >> The OpenRISC ABI is 32-bit big-endian and uses 64-bit time (y2038 safe) and >> 64-bit file offsets (LFS default). >> >> +* 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 > > Change: > s/non race manner/race free manner/g. Ack. > >> + functions are GNU extensions. > > > >> + >> Deprecated and removed features, and other changes affecting compatibility: >> >> * On x86-64, the LD_PREFER_MAP_32BIT_EXEC environment variable support >> diff --git a/include/unistd.h b/include/unistd.h >> index 2bcdd494e1..6e71d80015 100644 >> --- a/include/unistd.h >> +++ b/include/unistd.h >> @@ -183,6 +183,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); > > Florian noted __getpgrp not used. > Ack. >> >> /* 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 24d8bfd303..6291b1158a 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 \ > > OK. Two additions. > >> posix_madvise \ >> get_child_max sched_cpucount sched_cpualloc sched_cpufree \ >> streams-compat \ >> @@ -108,7 +109,7 @@ tests := test-errno tstgetopt testfnm runtests runptests \ >> 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-sched_getaffinity >> + tst-sched_getaffinity tst-spawn6 > > OK. tst-spawn6 test. > >> >> # Test for the glob symbol version that was replaced in glibc 2.27. >> ifeq ($(have-GLIBC_2.26)$(build-shared),yesyes) >> @@ -287,8 +288,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) > > OK. Though the other line didn't have to move? I have moved tst-spawn-static-ARGS back to its original place. > >> 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; >> + } > > OK. Two new functions. > >> GLIBC_PRIVATE { >> __libc_fork; __libc_pread; __libc_pwrite; >> __nanosleep_nocancel; __pause_nocancel; >> diff --git a/posix/spawn.h b/posix/spawn.h >> index 58f17d1277..7779020250 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]; > > OK. Add the fd. > >> } 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 > > OK. Consume another flag. > >> #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)); > > OK. First arg non-null. > >> + >> +/* 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)); > > OK. First and second args non-null. > >> +#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 3e6fe4ef03..603bfcf911 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) > > OK. > >> >> /* 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..2c037b21b5 >> --- /dev/null >> +++ b/posix/spawnattr_tcgetpgrp.c >> @@ -0,0 +1,26 @@ >> +/* Get the controlling terminal option. >> + Copyright (C) 2021 Free Software Foundation, Inc. > > Wrong date. Ack, I have fixed on two other files as well. > >> + 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; > > OK. > >> +} >> 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; >> +} > > OK. > >> diff --git a/posix/tst-spawn6.c b/posix/tst-spawn6.c >> new file mode 100644 >> index 0000000000..e3abb0f945 >> --- /dev/null >> +++ b/posix/tst-spawn6.c >> @@ -0,0 +1,173 @@ >> +/* 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) >> +{ >> + 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 (strcmp (argv1, "setgrpr") != 0) >> + 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; > > OK. > >> + >> + 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; I also added a test to check if 'i' does not overflow the 'spargv' size. >> + >> + 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: > > Suggest: > - Four parameters left if called initially: Ack. > >> + + 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); > > OK. Set. > >> + >> + int fd; >> + TEST_COMPARE (posix_spawnattr_tcgetpgrp_np (&attr, &fd), 0); >> + TEST_COMPARE (tcfd, fd); > > OK. Get and compare. > >> + } >> + >> + /* 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); > > OK. exp_err is 0, so it should run, and not change the pgrp. > >> + } >> + >> + /* 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); > > OK. Doing both. > >> + >> + run_subprogram (argc, argv, &attr, 0); > > OK. > >> + } >> + >> + /* 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); > > OK. exp_err is ENOTTY. Good check. > >> + } >> + >> + xclose (tcfd); >> + >> + return 0; >> +} >> + >> +#define TEST_FUNCTION_ARGV do_test >> +#include >> diff --git a/sysdeps/mach/hurd/libhurduser.abilist b/sysdeps/mach/hurd/libhurduser.abilist >> deleted file mode 100644 >> index e69de29bb2..0000000000 >> diff --git a/sysdeps/mach/hurd/spawni.c b/sysdeps/mach/hurd/spawni.c >> index ebf2b5e27f..bccdd013bf 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) > > OK. Good, check for previous error otherwise try to do this. > >> + { >> + 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); > > OK. Set the pgrp... then... > >> + if (!err) >> + err = __tcsetpgrp (attrp->__ctty_fd, pgrp); > > OK. Call tcsetpgrp with fd and pgrp. > > OK. Err is set and exposed with earlier errors not being overriden. > >> + } >> + >> /* Set the effective user and group IDs. */ >> if (!err && (flags & POSIX_SPAWN_RESETIDS) != 0) >> { >> diff --git a/sysdeps/mach/libmachuser.abilist b/sysdeps/mach/libmachuser.abilist >> deleted file mode 100644 >> index e69de29bb2..0000000000 >> diff --git a/sysdeps/unix/bsd/tcsetpgrp.c b/sysdeps/unix/bsd/tcsetpgrp.c >> index a7c34ae8d5..272f207c3d 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) > > OK. > >> { >> 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 fed942ed4b..67300eb86a 100644 >> --- a/sysdeps/unix/sysv/linux/aarch64/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/aarch64/libc.abilist >> @@ -2614,3 +2614,5 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 2867932704..3aee0b5cc0 100644 >> --- a/sysdeps/unix/sysv/linux/alpha/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/alpha/libc.abilist >> @@ -2711,6 +2711,8 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 239db7bab0..633ac44852 100644 >> --- a/sysdeps/unix/sysv/linux/arc/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/arc/libc.abilist >> @@ -2375,3 +2375,5 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 bc79dcfe8a..40bd490a47 100644 >> --- a/sysdeps/unix/sysv/linux/arm/be/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/arm/be/libc.abilist >> @@ -493,6 +493,8 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 614607fd6b..eaecc3a2c4 100644 >> --- a/sysdeps/unix/sysv/linux/arm/le/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/arm/le/libc.abilist >> @@ -490,6 +490,8 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 2b61543f0d..1ca0677a9d 100644 >> --- a/sysdeps/unix/sysv/linux/csky/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/csky/libc.abilist >> @@ -2649,3 +2649,5 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 6b3cb1adb4..8a7fb90c6b 100644 >> --- a/sysdeps/unix/sysv/linux/hppa/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/hppa/libc.abilist >> @@ -2598,6 +2598,8 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 7f608c1b64..c2bfceb01e 100644 >> --- a/sysdeps/unix/sysv/linux/i386/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/i386/libc.abilist >> @@ -2782,6 +2782,8 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 865deec43f..16a8b3f141 100644 >> --- a/sysdeps/unix/sysv/linux/ia64/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/ia64/libc.abilist >> @@ -2549,6 +2549,8 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 a172d74632..ed03495796 100644 >> --- a/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/m68k/coldfire/libc.abilist >> @@ -494,6 +494,8 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 174e9c7739..d69aac0863 100644 >> --- a/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/m68k/m680x0/libc.abilist >> @@ -2725,6 +2725,8 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 d042be1369..14e96a0d09 100644 >> --- a/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/microblaze/be/libc.abilist >> @@ -2698,3 +2698,5 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 332da62de2..32176ecc85 100644 >> --- a/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/microblaze/le/libc.abilist >> @@ -2695,3 +2695,5 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 2d6ec0d0e8..6382e8fd4f 100644 >> --- a/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/mips/mips32/fpu/libc.abilist >> @@ -2690,6 +2690,8 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 6c5befa72b..6f1ea0edd0 100644 >> --- a/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/mips/mips32/nofpu/libc.abilist >> @@ -2688,6 +2688,8 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 5fb24c97e1..a07f0b558c 100644 >> --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/libc.abilist >> @@ -2696,6 +2696,8 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 f4f29fc15e..33be3c6545 100644 >> --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/libc.abilist >> @@ -2600,6 +2600,8 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 2e7300cd05..cd150f8e86 100644 >> --- a/sysdeps/unix/sysv/linux/nios2/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/nios2/libc.abilist >> @@ -2737,3 +2737,5 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object F >> +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F >> +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F >> diff --git a/sysdeps/unix/sysv/linux/or1k/libc.abilist b/sysdeps/unix/sysv/linux/or1k/libc.abilist >> index eea4e3dc3f..04a888a296 100644 >> --- a/sysdeps/unix/sysv/linux/or1k/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/or1k/libc.abilist >> @@ -1394,6 +1394,8 @@ GLIBC_2.35 posix_spawnattr_setschedparam F >> GLIBC_2.35 posix_spawnattr_setschedpolicy F >> GLIBC_2.35 posix_spawnattr_setsigdefault F >> GLIBC_2.35 posix_spawnattr_setsigmask F >> +GLIBC_2.35 posix_spawnattr_tcgetpgrp_np F >> +GLIBC_2.35 posix_spawnattr_tcsetpgrp_np F >> GLIBC_2.35 posix_spawnp F >> GLIBC_2.35 ppoll F >> GLIBC_2.35 prctl F >> diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist >> index 129a2f16a7..ca95ab708f 100644 >> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/fpu/libc.abilist >> @@ -2752,6 +2752,8 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 7e23226779..e2a5b871ba 100644 >> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/nofpu/libc.abilist >> @@ -2785,6 +2785,8 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 6f97392b70..ae343bfc69 100644 >> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/be/libc.abilist >> @@ -2508,6 +2508,8 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 29058a041a..e2a94dca60 100644 >> --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/le/libc.abilist >> @@ -2810,3 +2810,5 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 d2924766d2..fed2375d8e 100644 >> --- a/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/riscv/rv32/libc.abilist >> @@ -2377,3 +2377,5 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 b770e05da3..cfa0be4ea2 100644 >> --- a/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/riscv/rv64/libc.abilist >> @@ -2577,3 +2577,5 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 bed3433a2b..74af810cb1 100644 >> --- a/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/s390/s390-32/libc.abilist >> @@ -2750,6 +2750,8 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 4f1a143da5..066ad16f19 100644 >> --- a/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/s390/s390-64/libc.abilist >> @@ -2545,6 +2545,8 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 92c8dec8ec..a096cf3e2b 100644 >> --- a/sysdeps/unix/sysv/linux/sh/be/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/sh/be/libc.abilist >> @@ -2605,6 +2605,8 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 263da58cb7..89ad4c54e9 100644 >> --- a/sysdeps/unix/sysv/linux/sh/le/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/sh/le/libc.abilist >> @@ -2602,6 +2602,8 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 0171efe7db..bcd2bd2b76 100644 >> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/libc.abilist >> @@ -2745,6 +2745,8 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 7f8d45f362..b9db516d26 100644 >> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/libc.abilist >> @@ -2572,6 +2572,8 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 4c2d4195cd..93359c708b 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) > > OK. Both operations in one. > >> + 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 c93c0d8193..3a21af8a4d 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 > > OK. Adding alias. > >> 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 c2f1a8ecc6..6876db985b 100644 >> --- a/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/x86_64/64/libc.abilist >> @@ -2523,6 +2523,8 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 8b43acf100..5cb17d8c82 100644 >> --- a/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist >> +++ b/sysdeps/unix/sysv/linux/x86_64/x32/libc.abilist >> @@ -2629,3 +2629,5 @@ GLIBC_2.34 tss_get F >> GLIBC_2.34 tss_set F >> GLIBC_2.35 __memcmpeq F >> GLIBC_2.35 _dl_find_object 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 581328b12a..1e4ff0987d 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) > > OK. > >> { >> 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) > > OK. > >> >> stub_warning (tcsetpgrp) > >