The branch main has been updated by kib:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=5c2ee618d5ec21f110c4da40e9f17833b2ab8b76

commit 5c2ee618d5ec21f110c4da40e9f17833b2ab8b76
Author:     Konstantin Belousov <[email protected]>
AuthorDate: 2026-01-08 00:32:11 +0000
Commit:     Konstantin Belousov <[email protected]>
CommitDate: 2026-01-25 15:53:09 +0000

    sys: add pdrfork(2)
    
    Reviewed by:    asomers, markj
    Tested by:      pho
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Differential revision:  https://reviews.freebsd.org/D54592
---
 sys/kern/kern_fork.c     | 42 ++++++++++++++++++++++++++++++++++++++++++
 sys/kern/syscalls.master |  9 +++++++++
 2 files changed, 51 insertions(+)

diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c
index 746aaf20ce03..6313bf3bb651 100644
--- a/sys/kern/kern_fork.c
+++ b/sys/kern/kern_fork.c
@@ -189,6 +189,48 @@ sys_rfork(struct thread *td, struct rfork_args *uap)
        return (error);
 }
 
+int
+sys_pdrfork(struct thread *td, struct pdrfork_args *uap)
+{
+       struct fork_req fr;
+       int error, fd, pid;
+
+       bzero(&fr, sizeof(fr));
+       fd = -1;
+
+       AUDIT_ARG_FFLAGS(uap->pdflags);
+       AUDIT_ARG_CMD(uap->rfflags);
+
+       if ((uap->rfflags & (RFSTOPPED | RFHIGHPID)) != 0)
+               return (EXTERROR(EINVAL,
+                   "Kernel-only flags %#jx", uap->rfflags));
+
+       /* RFSPAWN must not appear with others */
+       if ((uap->rfflags & RFSPAWN) != 0) {
+               if (uap->rfflags != RFSPAWN)
+                       return (EXTERROR(EINVAL,
+                           "RFSPAWN must be the only flag %#jx",
+                           uap->rfflags));
+               fr.fr_flags = RFFDG | RFPROC | RFPPWAIT | RFMEM | RFPROCDESC;
+               fr.fr_flags2 = FR2_DROPSIG_CAUGHT;
+       } else {
+               fr.fr_flags = uap->rfflags;
+       }
+
+       fr.fr_pidp = &pid;
+       fr.fr_pd_fd = &fd;
+       fr.fr_pd_flags = uap->pdflags;
+       error = fork1(td, &fr);
+       if (error == 0) {
+               td->td_retval[0] = pid;
+               td->td_retval[1] = 0;
+               if ((fr.fr_flags & (RFPROC | RFPROCDESC)) ==
+                   (RFPROC | RFPROCDESC) || uap->rfflags == RFSPAWN)
+                       error = copyout(&fd, uap->fdp, sizeof(fd));
+       }
+       return (error);
+}
+
 int __exclusive_cache_line     nprocs = 1;             /* process 0 */
 int    lastpid = 0;
 SYSCTL_INT(_kern, OID_AUTO, lastpid, CTLFLAG_RD, &lastpid, 0,
diff --git a/sys/kern/syscalls.master b/sys/kern/syscalls.master
index ea6d2b5aa1ef..1d0608297913 100644
--- a/sys/kern/syscalls.master
+++ b/sys/kern/syscalls.master
@@ -3402,4 +3402,13 @@
                        u_long flags
                );
        }
+
+600     AUE_PDRFORK     STD|CAPENABLED {
+               int pdrfork(
+                       _Out_ int *fdp,
+                       int pdflags,
+                       int rfflags
+               );
+       }
+
 ; vim: syntax=off

Reply via email to