From nobody Sun Feb 1 21:41:10 2026 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4f438l0xM9z6Qjvl for ; Sun, 01 Feb 2026 21:41:11 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R13" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4f438k5QnNz3G4w for ; Sun, 01 Feb 2026 21:41:10 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1769982070; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=LQjV1AJU3YXCVkDVhqf/waevssJ/HG/gOFBQxLVrLS8=; b=P7XeNVVnB6IyECxMPcmje8FVqZFkX3vOKYHYRAM6bucDhRcETxL1aKoZ+z0FLlF9xOpkut aiEdTXJj/wWCvKs9V4S4y4tGmMXnpjIjS8IQIUUypbtEsVUTRGRuP7Af6qv5dXRf6FZTSp Walw3iRBoYPdL1Zn3frRwQIeeEoV2J4wdPOUdVgPeB/QtICiotmkV+HWGwvEv0iVkBqM89 aKA2ipMWKfFk2B/wEJUSUh4J7grdc1yPUzUuKnEnhYDje3Rx/dyelfk+nCJe/iaWFeJ8Q2 c7103gwPYpOuSGkmczTpolwRryRR7U0jdS62AzmN1ugScessZHGCWsIqDn8HAA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1769982070; a=rsa-sha256; cv=none; b=gRwNWrr12uUfSU8bg24piVSNe319enE0+BXijCFFOMp+tkEl9/g6Agj7nKEf7cfT+RjtnM ckJ7cr6QfdODgZIxdsagccy9iH3y1OJbVEUPoW4WdJQ02fWe0GdctSF2vtn7VZU0q8reru ewcIZHkkZgsfIXN/U0NggC/MBBHTgwSElscDg0qC+gON0OH6pnhpkp9uOIUXWP8SnBDBZq Mh9neu+CGES2oqQ34hVQJk9R0n0AKB1ioPplwmdqQbfwjk3QcpDAOuURCiFXNnBrpAzyA/ M1AXK2j5j8LEHMRSO0Nwb9nHzA1wZXtmHTAn3fozM2ecmRJewzWOUU/RPuVhKQ== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1769982070; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=LQjV1AJU3YXCVkDVhqf/waevssJ/HG/gOFBQxLVrLS8=; b=YQC8nxbG4s6BBYSBgpRwaOAMvFIDKoic8+A98CVyHcNOx/muZlKMSc0CV/sn0hi39k+MQp MFczLAUlaXkn2BkVLmLxHM7gapYoDBfBHCGt5jlrG6Wf9xk9iLoUPPp5abaJ5ACi5SynLv cFQBKMx9aUEyhZC7TJCNIRRgjGi9jxuLLTCR/bOWN897BuJ8P5E1Q67njbjR7wE5I/ox/9 cY8Sz1y0IQFJ1eqznEap0ezgO5EXg1N7mjJ9658Ljd6GerD5ZQ3sppIAVBYmf4mcBrkVL+ z8Ln5bkWrNaLUA2haMEeRPE0YpNCz4GCI2GyWo3FbCTW/rPc9zxHIkvShtbhzw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4f438k4zV2zxNM for ; Sun, 01 Feb 2026 21:41:10 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 3c96f by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Sun, 01 Feb 2026 21:41:10 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Konstantin Belousov Subject: git: f68ddd04ae06 - stable/15 - libc: add posix_spawnattr_{get,set}procdescp_np List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: kib X-Git-Repository: src X-Git-Refname: refs/heads/stable/15 X-Git-Reftype: branch X-Git-Commit: f68ddd04ae06f7a30a87e3cfb868442a46fba919 Auto-Submitted: auto-generated Date: Sun, 01 Feb 2026 21:41:10 +0000 Message-Id: <697fc876.3c96f.78be3a23@gitrepo.freebsd.org> The branch stable/15 has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=f68ddd04ae06f7a30a87e3cfb868442a46fba919 commit f68ddd04ae06f7a30a87e3cfb868442a46fba919 Author: Konstantin Belousov AuthorDate: 2026-01-25 17:40:48 +0000 Commit: Konstantin Belousov CommitDate: 2026-02-01 21:38:50 +0000 libc: add posix_spawnattr_{get,set}procdescp_np (cherry picked from commit 080d8ed7dd29ba537ce4cca286ed3369aca61ef5) --- include/spawn.h | 4 ++++ lib/libc/gen/Symbol.map | 2 ++ lib/libc/gen/posix_spawn.c | 54 +++++++++++++++++++++++++++++++++++++++++----- 3 files changed, 55 insertions(+), 5 deletions(-) diff --git a/include/spawn.h b/include/spawn.h index a8f40e49dce0..636b20755238 100644 --- a/include/spawn.h +++ b/include/spawn.h @@ -126,8 +126,12 @@ int posix_spawnattr_setsigmask(posix_spawnattr_t * __restrict, #if __BSD_VISIBLE int posix_spawnattr_setexecfd_np(posix_spawnattr_t * __restrict, int); +int posix_spawnattr_setprocdescp_np(const posix_spawnattr_t * __restrict, + int * __restrict, int); int posix_spawnattr_getexecfd_np(const posix_spawnattr_t * __restrict, int * __restrict); +int posix_spawnattr_getprocdescp_np(const posix_spawnattr_t * __restrict, + int ** __restrict, int * __restrict); #endif __END_DECLS diff --git a/lib/libc/gen/Symbol.map b/lib/libc/gen/Symbol.map index 19170768ef7c..ddbd0522e13f 100644 --- a/lib/libc/gen/Symbol.map +++ b/lib/libc/gen/Symbol.map @@ -476,7 +476,9 @@ FBSD_1.8 { FBSD_1.9 { posix_spawnattr_getexecfd_np; + posix_spawnattr_getprocdescp_np; posix_spawnattr_setexecfd_np; + posix_spawnattr_setprocdescp_np; }; FBSDprivate_1.0 { diff --git a/lib/libc/gen/posix_spawn.c b/lib/libc/gen/posix_spawn.c index fc327e15bbf0..c64915078317 100644 --- a/lib/libc/gen/posix_spawn.c +++ b/lib/libc/gen/posix_spawn.c @@ -29,6 +29,7 @@ #include "namespace.h" #include #include +#include #include #include @@ -37,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -51,6 +53,8 @@ struct __posix_spawnattr { sigset_t sa_sigdefault; sigset_t sa_sigmask; int sa_execfd; + int *sa_pdrfork_fdp; + int sa_pdflags; }; struct __posix_spawn_file_actions { @@ -281,6 +285,8 @@ do_posix_spawn(pid_t *pid, const char *path, { struct posix_spawn_args psa; pid_t p; + int pfd; + bool do_pfd; #ifdef _RFORK_THREAD_STACK_SIZE char *stack; size_t cnt, stacksz; @@ -322,6 +328,8 @@ do_posix_spawn(pid_t *pid, const char *path, psa.use_env_path = use_env_path; psa.error = 0; + do_pfd = sa != NULL && (*sa)->sa_pdrfork_fdp != NULL; + /* * Passing RFSPAWN to rfork(2) gives us effectively a vfork that drops * non-ignored signal handlers. We'll fall back to the slightly less @@ -341,10 +349,20 @@ do_posix_spawn(pid_t *pid, const char *path, * parent. Because of this, we must use rfork_thread instead while * almost every other arch stores the return address in a register. */ - p = rfork_thread(RFSPAWN, stack + stacksz, _posix_spawn_thr, &psa); + if (do_pfd) { + p = pdrfork_thread(&pfd, PD_CLOEXEC | (*sa)->sa_pdflags, + RFSPAWN, stack + stacksz, _posix_spawn_thr, &psa); + } else { + p = rfork_thread(RFSPAWN, stack + stacksz, _posix_spawn_thr, + &psa); + } free(stack); #else - p = rfork(RFSPAWN); + if (do_pfd) { + p = pdrfork(&pfd, PD_CLOEXEC | (*sa)->sa_pdflags, RFSPAWN); + } else { + p = rfork(RFSPAWN); + } if (p == 0) /* _posix_spawn_thr does not return */ _posix_spawn_thr(&psa); @@ -356,6 +374,8 @@ do_posix_spawn(pid_t *pid, const char *path, */ if (p == -1 && errno == EINVAL) { + if (do_pfd) + return (EOPNOTSUPP); p = vfork(); if (p == 0) /* _posix_spawn_thr does not return */ @@ -363,12 +383,18 @@ do_posix_spawn(pid_t *pid, const char *path, } if (p == -1) return (errno); - if (psa.error != 0) + if (psa.error != 0) { /* Failed; ready to reap */ - _waitpid(p, NULL, WNOHANG); - else if (pid != NULL) + if (do_pfd) + (void)_close(pfd); + else + _waitpid(p, NULL, WNOHANG); + } else if (pid != NULL) { /* exec succeeded */ *pid = p; + if (do_pfd) + *((*sa)->sa_pdrfork_fdp) = pfd; + } return (psa.error); } @@ -651,6 +677,15 @@ posix_spawnattr_getexecfd_np(const posix_spawnattr_t * __restrict sa, return (0); } +int +posix_spawnattr_getprocdescp_np(const posix_spawnattr_t * __restrict sa, + int ** __restrict fdpp, int * __restrict pdrflagsp) +{ + *fdpp = (*sa)->sa_pdrfork_fdp; + *pdrflagsp = (*sa)->sa_pdflags; + return (0); +} + int posix_spawnattr_setflags(posix_spawnattr_t *sa, short flags) { @@ -708,3 +743,12 @@ posix_spawnattr_setexecfd_np(posix_spawnattr_t * __restrict sa, (*sa)->sa_execfd = execfd; return (0); } + +int +posix_spawnattr_setprocdescp_np(const posix_spawnattr_t * __restrict sa, + int * __restrict fdp, int pdrflags) +{ + (*sa)->sa_pdrfork_fdp = fdp; + (*sa)->sa_pdflags = pdrflags; + return (0); +}