Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F140109396
D31133.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
11 KB
Referenced Files
None
Subscribers
None
D31133.diff
View Options
Index: lib/libc/sys/pdfork.2
===================================================================
--- lib/libc/sys/pdfork.2
+++ lib/libc/sys/pdfork.2
@@ -46,6 +46,8 @@
.In sys/procdesc.h
.Ft pid_t
.Fn pdfork "int *fdp" "int flags"
+.Ft pid_t
+.Fn pdvfork "int *fdp" "int flags"
.Ft int
.Fn pdgetpid "int fd" "pid_t *pidp"
.Ft int
@@ -82,6 +84,14 @@
Set close-on-exec on process descriptor.
.El
.Pp
+.Fn pdvfork
+accepts the same parameters and produces the same return value as
+.Fn pdfork
+but behaves as
+.Xr vfork 2 ,
+rather than
+.Xr fork 2 .
+.Pp
.Fn pdgetpid
queries the process ID (PID) in the process descriptor
.Fa fd .
Index: sys/bsm/audit_kevents.h
===================================================================
--- sys/bsm/audit_kevents.h
+++ sys/bsm/audit_kevents.h
@@ -662,6 +662,7 @@
#define AUE_SPECIALFD 43266 /* FreeBSD-specific. */
#define AUE_AIO_WRITEV 43267 /* FreeBSD-specific. */
#define AUE_AIO_READV 43268 /* FreeBSD-specific. */
+#define AUE_PDVFORK 43269 /* FreeBSD-specific. */
/*
* Darwin BSM uses a number of AUE_O_* definitions, which are aliased to the
Index: sys/compat/freebsd32/freebsd32_syscall.h
===================================================================
--- sys/compat/freebsd32/freebsd32_syscall.h
+++ sys/compat/freebsd32/freebsd32_syscall.h
@@ -506,4 +506,5 @@
#define FREEBSD32_SYS___specialfd 577
#define FREEBSD32_SYS_freebsd32_aio_writev 578
#define FREEBSD32_SYS_freebsd32_aio_readv 579
-#define FREEBSD32_SYS_MAXSYSCALL 580
+#define FREEBSD32_SYS_pdvfork 580
+#define FREEBSD32_SYS_MAXSYSCALL 581
Index: sys/compat/freebsd32/freebsd32_syscalls.c
===================================================================
--- sys/compat/freebsd32/freebsd32_syscalls.c
+++ sys/compat/freebsd32/freebsd32_syscalls.c
@@ -616,4 +616,5 @@
"__specialfd", /* 577 = __specialfd */
"freebsd32_aio_writev", /* 578 = freebsd32_aio_writev */
"freebsd32_aio_readv", /* 579 = freebsd32_aio_readv */
+ "pdvfork", /* 580 = pdvfork */
};
Index: sys/compat/freebsd32/freebsd32_sysent.c
===================================================================
--- sys/compat/freebsd32/freebsd32_sysent.c
+++ sys/compat/freebsd32/freebsd32_sysent.c
@@ -669,4 +669,5 @@
{ .sy_narg = AS(__specialfd_args), .sy_call = (sy_call_t *)sys___specialfd, .sy_auevent = AUE_SPECIALFD, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 577 = __specialfd */
{ .sy_narg = AS(freebsd32_aio_writev_args), .sy_call = (sy_call_t *)freebsd32_aio_writev, .sy_auevent = AUE_AIO_WRITEV, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 578 = freebsd32_aio_writev */
{ .sy_narg = AS(freebsd32_aio_readv_args), .sy_call = (sy_call_t *)freebsd32_aio_readv, .sy_auevent = AUE_AIO_READV, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 579 = freebsd32_aio_readv */
+ { .sy_narg = AS(pdvfork_args), .sy_call = (sy_call_t *)sys_pdvfork, .sy_auevent = AUE_PDVFORK, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 580 = pdvfork */
};
Index: sys/compat/freebsd32/freebsd32_systrace_args.c
===================================================================
--- sys/compat/freebsd32/freebsd32_systrace_args.c
+++ sys/compat/freebsd32/freebsd32_systrace_args.c
@@ -3407,6 +3407,14 @@
*n_args = 1;
break;
}
+ /* pdvfork */
+ case 580: {
+ struct pdvfork_args *p = params;
+ uarg[0] = (intptr_t)p->fdp; /* int * */
+ iarg[1] = p->flags; /* int */
+ *n_args = 2;
+ break;
+ }
default:
*n_args = 0;
break;
@@ -9183,6 +9191,19 @@
break;
};
break;
+ /* pdvfork */
+ case 580:
+ switch (ndx) {
+ case 0:
+ p = "userland int *";
+ break;
+ case 1:
+ p = "int";
+ break;
+ default:
+ break;
+ };
+ break;
default:
break;
};
@@ -11102,6 +11123,11 @@
if (ndx == 0 || ndx == 1)
p = "int";
break;
+ /* pdvfork */
+ case 580:
+ if (ndx == 0 || ndx == 1)
+ p = "int";
+ break;
default:
break;
};
Index: sys/compat/freebsd32/syscalls.master
===================================================================
--- sys/compat/freebsd32/syscalls.master
+++ sys/compat/freebsd32/syscalls.master
@@ -1174,5 +1174,6 @@
struct aiocb32 *aiocbp); }
579 AUE_AIO_READV STD { int freebsd32_aio_readv( \
struct aiocb32 *aiocbp); }
+580 AUE_PDVFORK NOPROTO { int pdvfork(int *fdp, int flags); }
; vim: syntax=off
Index: sys/kern/init_sysent.c
===================================================================
--- sys/kern/init_sysent.c
+++ sys/kern/init_sysent.c
@@ -635,4 +635,5 @@
{ .sy_narg = AS(__specialfd_args), .sy_call = (sy_call_t *)sys___specialfd, .sy_auevent = AUE_SPECIALFD, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 577 = __specialfd */
{ .sy_narg = AS(aio_writev_args), .sy_call = (sy_call_t *)sys_aio_writev, .sy_auevent = AUE_AIO_WRITEV, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 578 = aio_writev */
{ .sy_narg = AS(aio_readv_args), .sy_call = (sy_call_t *)sys_aio_readv, .sy_auevent = AUE_AIO_READV, .sy_flags = SYF_CAPENABLED, .sy_thrcnt = SY_THR_STATIC }, /* 579 = aio_readv */
+ { .sy_narg = AS(pdvfork_args), .sy_call = (sy_call_t *)sys_pdvfork, .sy_auevent = AUE_PDVFORK, .sy_flags = 0, .sy_thrcnt = SY_THR_STATIC }, /* 580 = pdvfork */
};
Index: sys/kern/kern_fork.c
===================================================================
--- sys/kern/kern_fork.c
+++ sys/kern/kern_fork.c
@@ -98,67 +98,75 @@
};
#endif
-/* ARGSUSED */
-int
-sys_fork(struct thread *td, struct fork_args *uap)
+/**
+ * Helper for the pd- and v-fork calls containing the shared logic for fork,
+ * vfork, pdfork, and pdvfork. If `is_vfork` is set, then this does a
+ * [pd]vfork operation. If `outpid` is not null then this does a pd[v]fork
+ * operation. `pdfork_flags` contains the flags from a pdfork call and is
+ * ignured if `outpid` is null.
+ */
+static int
+do_pdvfork(struct thread *td, bool is_vfork, pid_t *outpid, int pdfork_flags)
{
struct fork_req fr;
- int error, pid;
+ int error, pid, fd;
bzero(&fr, sizeof(fr));
- fr.fr_flags = RFFDG | RFPROC;
+ fr.fr_flags = RFFDG | RFPROC | ((is_vfork) ? RFPPWAIT | RFMEM : 0);
+ if (outpid) {
+ fr.fr_flags |= RFPROCDESC;
+ fr.fr_pd_fd = &fd;
+ fr.fr_pd_flags = pdfork_flags;
+ }
fr.fr_pidp = &pid;
error = fork1(td, &fr);
+ /*
+ * It is necessary to return fd by reference because 0 is a valid file
+ * descriptor number, and the child needs to be able to distinguish
+ * itself from the parent using the return value.
+ */
if (error == 0) {
td->td_retval[0] = pid;
td->td_retval[1] = 0;
+ if (outpid) {
+ error = copyout(&fd, outpid, sizeof(fd));
+ }
}
return (error);
}
+/* ARGSUSED */
+int
+sys_fork(struct thread *td, struct fork_args *uap)
+{
+
+ return (do_pdvfork(td, false, NULL, 0));
+}
+
/* ARGUSED */
int
sys_pdfork(struct thread *td, struct pdfork_args *uap)
{
- struct fork_req fr;
- int error, fd, pid;
- bzero(&fr, sizeof(fr));
- fr.fr_flags = RFFDG | RFPROC | RFPROCDESC;
- fr.fr_pidp = &pid;
- fr.fr_pd_fd = &fd;
- fr.fr_pd_flags = uap->flags;
AUDIT_ARG_FFLAGS(uap->flags);
- /*
- * It is necessary to return fd by reference because 0 is a valid file
- * descriptor number, and the child needs to be able to distinguish
- * itself from the parent using the return value.
- */
- error = fork1(td, &fr);
- if (error == 0) {
- td->td_retval[0] = pid;
- td->td_retval[1] = 0;
- error = copyout(&fd, uap->fdp, sizeof(fd));
- }
- return (error);
+ return (do_pdvfork(td, false, uap->fdp, uap->flags));
}
/* ARGSUSED */
int
sys_vfork(struct thread *td, struct vfork_args *uap)
{
- struct fork_req fr;
- int error, pid;
- bzero(&fr, sizeof(fr));
- fr.fr_flags = RFFDG | RFPROC | RFPPWAIT | RFMEM;
- fr.fr_pidp = &pid;
- error = fork1(td, &fr);
- if (error == 0) {
- td->td_retval[0] = pid;
- td->td_retval[1] = 0;
- }
- return (error);
+ return (do_pdvfork(td, true, NULL, 0));
+}
+
+/* ARGSUSED */
+int
+sys_pdvfork(struct thread *td, struct pdvfork_args *uap)
+{
+
+ AUDIT_ARG_FFLAGS(uap->flags);
+ return (do_pdvfork(td, true, uap->fdp, uap->flags));
}
int
Index: sys/kern/syscalls.c
===================================================================
--- sys/kern/syscalls.c
+++ sys/kern/syscalls.c
@@ -586,4 +586,5 @@
"__specialfd", /* 577 = __specialfd */
"aio_writev", /* 578 = aio_writev */
"aio_readv", /* 579 = aio_readv */
+ "pdvfork", /* 580 = pdvfork */
};
Index: sys/kern/syscalls.master
===================================================================
--- sys/kern/syscalls.master
+++ sys/kern/syscalls.master
@@ -3238,6 +3238,12 @@
_Inout_ struct aiocb *aiocbp
);
}
+580 AUE_PDVFORK STD {
+ int pdvfork(
+ _Out_ int *fdp,
+ int flags
+ );
+ }
; Please copy any additions and changes to the following compatability tables:
; sys/compat/freebsd32/syscalls.master
Index: sys/kern/systrace_args.c
===================================================================
--- sys/kern/systrace_args.c
+++ sys/kern/systrace_args.c
@@ -3399,6 +3399,14 @@
*n_args = 1;
break;
}
+ /* pdvfork */
+ case 580: {
+ struct pdvfork_args *p = params;
+ uarg[0] = (intptr_t)p->fdp; /* int * */
+ iarg[1] = p->flags; /* int */
+ *n_args = 2;
+ break;
+ }
default:
*n_args = 0;
break;
@@ -9088,6 +9096,19 @@
break;
};
break;
+ /* pdvfork */
+ case 580:
+ switch (ndx) {
+ case 0:
+ p = "userland int *";
+ break;
+ case 1:
+ p = "int";
+ break;
+ default:
+ break;
+ };
+ break;
default:
break;
};
@@ -11034,6 +11055,11 @@
if (ndx == 0 || ndx == 1)
p = "int";
break;
+ /* pdvfork */
+ case 580:
+ if (ndx == 0 || ndx == 1)
+ p = "int";
+ break;
default:
break;
};
Index: sys/sys/procdesc.h
===================================================================
--- sys/sys/procdesc.h
+++ sys/sys/procdesc.h
@@ -122,6 +122,7 @@
*/
__BEGIN_DECLS
pid_t pdfork(int *, int);
+pid_t pdvfork(int *, int);
int pdkill(int, int);
int pdgetpid(int, pid_t *);
__END_DECLS
Index: sys/sys/syscall.h
===================================================================
--- sys/sys/syscall.h
+++ sys/sys/syscall.h
@@ -515,4 +515,5 @@
#define SYS___specialfd 577
#define SYS_aio_writev 578
#define SYS_aio_readv 579
-#define SYS_MAXSYSCALL 580
+#define SYS_pdvfork 580
+#define SYS_MAXSYSCALL 581
Index: sys/sys/syscall.mk
===================================================================
--- sys/sys/syscall.mk
+++ sys/sys/syscall.mk
@@ -420,4 +420,5 @@
rpctls_syscall.o \
__specialfd.o \
aio_writev.o \
- aio_readv.o
+ aio_readv.o \
+ pdvfork.o
Index: sys/sys/sysproto.h
===================================================================
--- sys/sys/sysproto.h
+++ sys/sys/sysproto.h
@@ -1847,6 +1847,10 @@
struct aio_readv_args {
char aiocbp_l_[PADL_(struct aiocb *)]; struct aiocb * aiocbp; char aiocbp_r_[PADR_(struct aiocb *)];
};
+struct pdvfork_args {
+ char fdp_l_[PADL_(int *)]; int * fdp; char fdp_r_[PADR_(int *)];
+ char flags_l_[PADL_(int)]; int flags; char flags_r_[PADR_(int)];
+};
int nosys(struct thread *, struct nosys_args *);
void sys_sys_exit(struct thread *, struct sys_exit_args *);
int sys_fork(struct thread *, struct fork_args *);
@@ -2241,6 +2245,7 @@
int sys___specialfd(struct thread *, struct __specialfd_args *);
int sys_aio_writev(struct thread *, struct aio_writev_args *);
int sys_aio_readv(struct thread *, struct aio_readv_args *);
+int sys_pdvfork(struct thread *, struct pdvfork_args *);
#ifdef COMPAT_43
@@ -3175,6 +3180,7 @@
#define SYS_AUE___specialfd AUE_SPECIALFD
#define SYS_AUE_aio_writev AUE_AIO_WRITEV
#define SYS_AUE_aio_readv AUE_AIO_READV
+#define SYS_AUE_pdvfork AUE_PDVFORK
#undef PAD_
#undef PADL_
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Dec 21, 8:46 AM (6 h, 51 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27110471
Default Alt Text
D31133.diff (11 KB)
Attached To
Mode
D31133: Add a pdvfork system call.
Attached
Detach File
Event Timeline
Log In to Comment