From nobody Mon Jan 26 19:30:58 2026 X-Original-To: dev-commits-src-main@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 4f0JYH2JkRz6PVLQ for ; Mon, 26 Jan 2026 19:30:59 +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 4f0JYG70Mrz3psX for ; Mon, 26 Jan 2026 19:30:58 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1769455859; 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=BqByGIOg67whrGt1HeqVB9vMnq3I7KZZ2Lx9yavSHno=; b=rDQ0BaKfz7hHO9GtDmPqypke1x2ylVr5CVpe5EcRs07tV6FsOYpsputZQp1kvnyCf7Wxes SLh0i7YUSP8ms3b93OP5q/sWz3nsfZV4Wux/iwEvsLK0bwyq+vLKrZ6YV6fIwRTLGeIy1w DC6ZnpOKGkQ6gjG/n4Z1pz/rX34yUHE1mtBYGD59+LBNZ7J9JJRSN19GMCeddtcNT/5Ukg WVH8s60w2WD1xE6nBDpVd+9+H8kWdEzoOhTmNlfFb7haS55FWR7V9+KxBAhDftrppJEMkp YSoyPCtRkGXtKwQzBIEBzxKiNu5d6svZDd0bXZ70EFggEZaLZYBGeMm1AKU4vg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1769455859; 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=BqByGIOg67whrGt1HeqVB9vMnq3I7KZZ2Lx9yavSHno=; b=balqVbhJutD92GnS1pYjG0X9u3YI37OMFriWqSx1Uf/+bGh2jLlPvD2asW6hEJNs+2fBnS WJwlJ/ehOtUUf5MmKR6RtiG1kqQiNaoLQN8K8e0zkxlSZc20a1P0O9XTrD+NbGWnz1t7CL CSv3hcWbFTJmdXY8t7A4SGv44Ml3xqN6nhcj5Hu9cTbDw236bc/zbJ/dJMlwJzYCctFsg0 DpzTfFv/xIE4D2J4OeaO6HPWkYxuTsfoHrZq6650rWC25kP32NJzVPk77/YLHFNjkpbESV PngptCmk5ml4zx9LLF4lZKuPds+yvHgbQdHihXLMlVoa/nObMSVuksDZX7BkQQ== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1769455859; a=rsa-sha256; cv=none; b=w4fDfhU/2gUc6io05cFEtFhpb2mAyG8QBfMv9mZSPrxUuyVkqCSc2Zc5hghOg3bI1a6bIC JFwNv9wz+emJxhFNi2v2HAz3bImNOeLkymd74qd9OiWM7mpJ3e7Mdbl3mWqZSbFWz3wIti cULBHXerbsgq4nHF8aBftbUTDrkOKXtdqkx4kFJv0kxLX6dc4P7IEQinq/+aWh2ym46OMj MONUMucGCghpyV+vsLKQJIWcb3U55V6Hxn3PwwHNkHALkUPj5DTn9jEPqqOhkIpvy02In0 cg7RaT4McVCnbWJ4/yEAAJtCSz8SBW8a9W3q2Gyunax/il2QM7L73JYr6bsIIg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4f0JYG6YdQzZmg for ; Mon, 26 Jan 2026 19:30:58 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id f24e by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Mon, 26 Jan 2026 19:30:58 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Konstantin Belousov Subject: git: 080d8ed7dd29 - main - libc: add posix_spawnattr_{get,set}procdescp_np List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@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/main X-Git-Reftype: branch X-Git-Commit: 080d8ed7dd29ba537ce4cca286ed3369aca61ef5 Auto-Submitted: auto-generated Date: Mon, 26 Jan 2026 19:30:58 +0000 Message-Id: <6977c0f2.f24e.12f1bf8d@gitrepo.freebsd.org> The branch main has been updated by kib: URL: https://cgit.FreeBSD.org/src/commit/?id=080d8ed7dd29ba537ce4cca286ed3369aca61ef5 commit 080d8ed7dd29ba537ce4cca286ed3369aca61ef5 Author: Konstantin Belousov AuthorDate: 2026-01-25 17:40:48 +0000 Commit: Konstantin Belousov CommitDate: 2026-01-26 19:30:14 +0000 libc: add posix_spawnattr_{get,set}procdescp_np Reviewed by: asomers Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D54879 --- 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); +}