diff options
-rw-r--r-- | sys/compat/netbsd/netbsd_misc.c | 5 | ||||
-rw-r--r-- | sys/kern/init_main.c | 4 | ||||
-rw-r--r-- | sys/kern/kern_fork.c | 102 | ||||
-rw-r--r-- | sys/kern/kern_kthread.c | 4 | ||||
-rw-r--r-- | sys/sys/proc.h | 19 |
5 files changed, 58 insertions, 76 deletions
diff --git a/sys/compat/netbsd/netbsd_misc.c b/sys/compat/netbsd/netbsd_misc.c index 0c46834efa1..90ffab99d0f 100644 --- a/sys/compat/netbsd/netbsd_misc.c +++ b/sys/compat/netbsd/netbsd_misc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: netbsd_misc.c,v 1.6 2000/01/28 19:45:04 art Exp $ */ +/* $OpenBSD: netbsd_misc.c,v 1.7 2000/01/31 01:09:11 deraadt Exp $ */ /* * Copyright (c) 1982, 1986, 1989, 1991, 1993 @@ -61,8 +61,7 @@ netbsd_sys___vfork14(p, v, retval) void *v; register_t *retval; { - /* XXX - should add FORK_SHAREVM */ - return (fork1(p, FORK_VFORK|FORK_PPWAIT, NULL, 0, retval)); + return (fork1(p, ISVFORK, 0, NULL, 0, retval)); } /* XXX syncs whole file */ diff --git a/sys/kern/init_main.c b/sys/kern/init_main.c index 4bf07b1ff1c..c71301dd274 100644 --- a/sys/kern/init_main.c +++ b/sys/kern/init_main.c @@ -1,4 +1,4 @@ -/* $OpenBSD: init_main.c,v 1.44 2000/01/28 19:45:04 art Exp $ */ +/* $OpenBSD: init_main.c,v 1.45 2000/01/31 01:09:10 deraadt Exp $ */ /* $NetBSD: init_main.c,v 1.84.4.1 1996/06/02 09:08:06 mrg Exp $ */ /* @@ -399,7 +399,7 @@ main(framep) siginit(p); /* Create process 1 (init(8)). */ - if (fork1(p, FORK_FORK, NULL, 0, rval)) + if (fork1(p, ISFORK, 0, NULL, 0, rval)) panic("fork init"); #ifdef cpu_set_init_frame /* XXX should go away */ if (rval[1]) { diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index 3afd104709e..f355abab4a7 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_fork.c,v 1.25 2000/01/28 19:45:04 art Exp $ */ +/* $OpenBSD: kern_fork.c,v 1.26 2000/01/31 01:09:10 deraadt Exp $ */ /* $NetBSD: kern_fork.c,v 1.29 1996/02/09 18:59:34 christos Exp $ */ /* @@ -78,7 +78,7 @@ sys_fork(p, v, retval) void *v; register_t *retval; { - return (fork1(p, FORK_FORK, NULL, 0, retval)); + return (fork1(p, ISFORK, 0, NULL, 0, retval)); } /*ARGSUSED*/ @@ -88,7 +88,7 @@ sys_vfork(p, v, retval) void *v; register_t *retval; { - return (fork1(p, FORK_VFORK|FORK_PPWAIT, NULL, 0, retval)); + return (fork1(p, ISVFORK, 0, NULL, 0, retval)); } int @@ -100,41 +100,15 @@ sys_rfork(p, v, retval) struct sys_rfork_args /* { syscallarg(int) flags; } */ *uap = v; - int rforkflags; - int flags; - - flags = FORK_RFORK; - rforkflags = SCARG(uap, flags); - - if ((rforkflags & RFPROC) == 0) - return (EINVAL); - - switch(rforkflags & (RFFDG|RFCFDG)) { - case (RFFDG|RFCFDG): - return EINVAL; - case RFCFDG: - flags |= FORK_CLEANFILES; - break; - case RFFDG: - break; - default: - flags |= FORK_SHAREFILES; - break; - } - - if (rforkflags & RFNOWAIT) - flags |= FORK_NOZOMBIE; - if (rforkflags & RFMEM) - flags |= FORK_SHAREVM; - - return (fork1(p, flags, NULL, 0, retval)); + return (fork1(p, ISRFORK, SCARG(uap, flags), NULL, 0, retval)); } int -fork1(p1, flags, stack, stacksize, retval) +fork1(p1, forktype, rforkflags, stack, stacksize, retval) register struct proc *p1; - int flags; + int forktype; + int rforkflags; void *stack; size_t stacksize; register_t *retval; @@ -145,8 +119,21 @@ fork1(p1, flags, stack, stacksize, retval) struct vmspace *vm; int count; static int pidchecked = 0; + int dupfd = 1, cleanfd = 0; vaddr_t uaddr; + if (forktype == ISRFORK) { + dupfd = 0; + if ((rforkflags & RFPROC) == 0) + return (EINVAL); + if ((rforkflags & (RFFDG|RFCFDG)) == (RFFDG|RFCFDG)) + return (EINVAL); + if (rforkflags & RFFDG) + dupfd = 1; + if (rforkflags & RFCFDG) + cleanfd = 1; + } + /* * Although process entries are dynamically created, we still keep * a global limit on the maximum number we will create. We reserve @@ -270,12 +257,12 @@ again: if (p2->p_textvp) VREF(p2->p_textvp); - if (flags & FORK_CLEANFILES) + if (cleanfd) p2->p_fd = fdinit(p1); - else if (flags & FORK_SHAREFILES) - p2->p_fd = fdshare(p1); - else + else if (dupfd) p2->p_fd = fdcopy(p1); + else + p2->p_fd = fdshare(p1); /* * If p_limit is still copy-on-write, bump refcnt, @@ -292,11 +279,11 @@ again: if (p1->p_session->s_ttyvp != NULL && p1->p_flag & P_CONTROLT) p2->p_flag |= P_CONTROLT; - if (flags & FORK_PPWAIT) + if (forktype == ISVFORK) p2->p_flag |= P_PPWAIT; LIST_INSERT_AFTER(p1, p2, p_pglist); p2->p_pptr = p1; - if (flags & FORK_NOZOMBIE) + if (forktype == ISRFORK && (rforkflags & RFNOWAIT)) p2->p_flag |= P_NOZOMBIE; LIST_INSERT_HEAD(&p1->p_children, p2, p_sibling); LIST_INIT(&p2->p_children); @@ -306,7 +293,7 @@ again: * Copy traceflag and tracefile if enabled. * If not inherited, these were zeroed above. */ - if (p1->p_traceflag & KTRFAC_INHERIT) { + if (p1->p_traceflag&KTRFAC_INHERIT) { p2->p_traceflag = p1->p_traceflag; if ((p2->p_tracep = p1->p_tracep) != NULL) VREF(p2->p_tracep); @@ -327,7 +314,7 @@ again: p1->p_holdcnt++; #if !defined(UVM) /* We do this later for UVM */ - if (flags & FORK_SHAREVM) + if (forktype == ISRFORK && (rforkflags & RFMEM)) { /* share as much address space as possible */ (void) vm_map_inherit(&p1->p_vmspace->vm_map, VM_MIN_ADDRESS, VM_MAXUSER_ADDRESS - MAXSSIZ, @@ -357,23 +344,28 @@ again: * different path later. */ #if defined(UVM) - uvm_fork(p1, p2, ((flags & FORK_SHAREVM) ? TRUE : FALSE), stack, - stacksize); + uvm_fork(p1, p2, + (forktype == ISRFORK && (rforkflags & RFMEM)) ? TRUE : FALSE, + stack, stacksize); #else /* UVM */ vm_fork(p1, p2, stack, stacksize); #endif /* UVM */ #endif vm = p2->p_vmspace; - if (flags & FORK_FORK) { - forkstat.cntfork++; - forkstat.sizfork += vm->vm_dsize + vm->vm_ssize; - } else if (flags & FORK_VFORK) { - forkstat.cntvfork++; - forkstat.sizvfork += vm->vm_dsize + vm->vm_ssize; - } else if (flags & FORK_RFORK) { - forkstat.cntrfork++; - forkstat.sizrfork += vm->vm_dsize + vm->vm_ssize; + switch (forktype) { + case ISFORK: + forkstat.cntfork++; + forkstat.sizfork += vm->vm_dsize + vm->vm_ssize; + break; + case ISVFORK: + forkstat.cntvfork++; + forkstat.sizvfork += vm->vm_dsize + vm->vm_ssize; + break; + case ISRFORK: + forkstat.cntrfork++; + forkstat.sizrfork += vm->vm_dsize + vm->vm_ssize; + break; } /* @@ -393,9 +385,9 @@ again: #if defined(UVM) uvmexp.forks++; - if (flags & FORK_PPWAIT) + if (forktype == ISVFORK) uvmexp.forks_ppwait++; - if (flags & FORK_SHAREVM) + if (forktype == ISRFORK && (rforkflags & RFMEM)) uvmexp.forks_sharevm++; #endif @@ -404,7 +396,7 @@ again: * child to exec or exit, set P_PPWAIT on child, and sleep on our * proc (in case of exit). */ - if (flags & FORK_PPWAIT) + if (forktype == ISVFORK) while (p2->p_flag & P_PPWAIT) tsleep(p1, PWAIT, "ppwait", 0); diff --git a/sys/kern/kern_kthread.c b/sys/kern/kern_kthread.c index c5daef62143..b4eef9770f5 100644 --- a/sys/kern/kern_kthread.c +++ b/sys/kern/kern_kthread.c @@ -1,4 +1,4 @@ -/* $OpenBSD: kern_kthread.c,v 1.5 2000/01/28 19:45:04 art Exp $ */ +/* $OpenBSD: kern_kthread.c,v 1.6 2000/01/31 01:09:10 deraadt Exp $ */ /* $NetBSD: kern_kthread.c,v 1.3 1998/12/22 21:21:36 kleink Exp $ */ /*- @@ -83,7 +83,7 @@ kthread_create(func, arg, newpp, fmt, va_alist) * descriptors and don't leave the exit status around for the * parent to wait for. */ - error = fork1(&proc0, FORK_RFORK|FORK_SHAREVM|FORK_NOZOMBIE, NULL, + error = fork1(&proc0, ISRFORK, RFPROC | RFMEM | RFFDG | RFNOWAIT, NULL, 0, rv); if (error) return (error); diff --git a/sys/sys/proc.h b/sys/sys/proc.h index c6246b0312e..adc5dddc645 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -1,4 +1,4 @@ -/* $OpenBSD: proc.h,v 1.26 2000/01/28 19:45:03 art Exp $ */ +/* $OpenBSD: proc.h,v 1.27 2000/01/31 01:09:09 deraadt Exp $ */ /* $NetBSD: proc.h,v 1.44 1996/04/22 01:23:21 christos Exp $ */ /*- @@ -283,18 +283,6 @@ struct pcred { #endif #define PRELE(p) (--(p)->p_holdcnt) -/* - * Flags to fork1(). - */ -#define FORK_FORK 0x00000001 -#define FORK_VFORK 0x00000002 -#define FORK_RFORK 0x00000004 -#define FORK_PPWAIT 0x00000008 -#define FORK_SHAREFILES 0x00000010 -#define FORK_CLEANFILES 0x00000020 -#define FORK_NOZOMBIE 0x00000040 -#define FORK_SHAREVM 0x00000080 - #define PIDHASH(pid) (&pidhashtbl[(pid) & pidhash]) extern LIST_HEAD(pidhashhead, proc) *pidhashtbl; extern u_long pidhash; @@ -345,7 +333,10 @@ int tsleep __P((void *chan, int pri, char *wmesg, int timo)); void unsleep __P((struct proc *)); void wakeup __P((void *chan)); void exit1 __P((struct proc *, int)); -int fork1 __P((struct proc *, int, void *, size_t, register_t *)); +int fork1 __P((struct proc *, int, int, void *, size_t, register_t *)); +#define ISFORK 0 +#define ISVFORK 1 +#define ISRFORK 2 void kmeminit __P((void)); void rqinit __P((void)); int groupmember __P((gid_t, struct ucred *)); |