diff options
Diffstat (limited to 'sys/kern/kern_fork.c')
-rw-r--r-- | sys/kern/kern_fork.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index a1f6c859fe89..ef38e011908e 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -36,7 +36,7 @@ * SUCH DAMAGE. * * @(#)kern_fork.c 8.6 (Berkeley) 4/8/94 - * $Id: kern_fork.c,v 1.51 1998/01/22 17:29:46 dyson Exp $ + * $Id: kern_fork.c,v 1.52 1998/11/09 15:07:41 truckman Exp $ */ #include "opt_ktrace.h" @@ -62,6 +62,10 @@ #include <vm/vm_extern.h> #include <vm/vm_zone.h> +#ifdef COMPAT_LINUX_THREADS +#include <machine/frame.h> + +#endif /* COMPAT_LINUX_THREADS */ #ifdef SMP static int fast_vfork = 0; /* Doesn't work on SMP yet. */ #else @@ -325,6 +329,24 @@ again: p2->p_cred->p_refcnt = 1; crhold(p1->p_ucred); +#ifdef COMPAT_LINUX_THREADS + if (flags & RFSIGSHARE) { + p2->p_procsig->ps_refcnt++; + } else { + p2->p_procsig = malloc(sizeof(struct procsig), M_TEMP, M_WAITOK); + p2->p_procsig->ps_refcnt = 1; + p2->p_procsig->ps_posix = 0; + bcopy(&p1->p_procsig->ps_begincopy, &p2->p_procsig->ps_begincopy, + (unsigned)&p1->p_procsig->ps_endcopy - + (unsigned)&p1->p_procsig->ps_begincopy); + } + if (flags & RFLINUXTHPN) { + p2->p_sigparent = SIGUSR1; + } + p2->p_sigacts = &p2->p_procsig->ps_sigacts; + if((flags & RFTHREAD) != 0 && (flags & RFPOSIXSIG) != 0) + p2->p_procsig->ps_posix = 1; +#endif /* COMPAT_LINUX_THREADS */ /* bump references to the text vnode (for procfs) */ p2->p_textvp = p1->p_textvp; if (p2->p_textvp) |