123374Smckusick /* 247540Skarels * Copyright (c) 1982, 1986, 1989, 1991 Regents of the University of California. 337580Smckusick * All rights reserved. 423374Smckusick * 544440Sbostic * %sccs.include.redist.c% 637580Smckusick * 7*58371Smckusick * @(#)kern_sig.c 7.55 (Berkeley) 03/02/93 823374Smckusick */ 97421Sroot 1047540Skarels #define SIGPROP /* include signal properties table */ 1156517Sbostic #include <sys/param.h> 1256517Sbostic #include <sys/signalvar.h> 1356517Sbostic #include <sys/resourcevar.h> 1456517Sbostic #include <sys/namei.h> 1556517Sbostic #include <sys/vnode.h> 1656517Sbostic #include <sys/proc.h> 1756517Sbostic #include <sys/systm.h> 1856517Sbostic #include <sys/timeb.h> 1956517Sbostic #include <sys/times.h> 2056517Sbostic #include <sys/buf.h> 2156517Sbostic #include <sys/acct.h> 2256517Sbostic #include <sys/file.h> 2356517Sbostic #include <sys/kernel.h> 2456517Sbostic #include <sys/wait.h> 2556517Sbostic #include <sys/ktrace.h> 2657533Smckusick #include <sys/syslog.h> 277421Sroot 2856517Sbostic #include <machine/cpu.h> 2949102Skarels 3056517Sbostic #include <vm/vm.h> 3156517Sbostic #include <sys/kinfo_proc.h> 3256517Sbostic #include <sys/user.h> /* for coredump */ 3337581Smckusick 3417013Smckusick /* 3547540Skarels * Can process p, with pcred pc, send the signal signo to process q? 3617013Smckusick */ 3747540Skarels #define CANSIGNAL(p, pc, q, signo) \ 3847540Skarels ((pc)->pc_ucred->cr_uid == 0 || \ 3947540Skarels (pc)->p_ruid == (q)->p_cred->p_ruid || \ 4047540Skarels (pc)->pc_ucred->cr_uid == (q)->p_cred->p_ruid || \ 4147540Skarels (pc)->p_ruid == (q)->p_ucred->cr_uid || \ 4247540Skarels (pc)->pc_ucred->cr_uid == (q)->p_ucred->cr_uid || \ 4342920Skarels ((signo) == SIGCONT && (q)->p_session == (p)->p_session)) 4439513Skarels 4554926Storek struct sigaction_args { 4654926Storek int signo; 4754926Storek struct sigaction *nsa; 4854926Storek struct sigaction *osa; 4954926Storek }; 5042920Skarels /* ARGSUSED */ 5142920Skarels sigaction(p, uap, retval) 5242920Skarels struct proc *p; 5354926Storek register struct sigaction_args *uap; 5442920Skarels int *retval; 5542920Skarels { 5639513Skarels struct sigaction vec; 5739513Skarels register struct sigaction *sa; 5847540Skarels register struct sigacts *ps = p->p_sigacts; 5912882Ssam register int sig; 6039513Skarels int bit, error; 617421Sroot 6212882Ssam sig = uap->signo; 6339513Skarels if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) 6444405Skarels return (EINVAL); 6539513Skarels sa = &vec; 6639513Skarels if (uap->osa) { 6747540Skarels sa->sa_handler = ps->ps_sigact[sig]; 6847540Skarels sa->sa_mask = ps->ps_catchmask[sig]; 6918308Smckusick bit = sigmask(sig); 7039513Skarels sa->sa_flags = 0; 7147540Skarels if ((ps->ps_sigonstack & bit) != 0) 7239513Skarels sa->sa_flags |= SA_ONSTACK; 7347540Skarels if ((ps->ps_sigintr & bit) == 0) 7439513Skarels sa->sa_flags |= SA_RESTART; 7542920Skarels if (p->p_flag & SNOCLDSTOP) 7639513Skarels sa->sa_flags |= SA_NOCLDSTOP; 7739513Skarels if (error = copyout((caddr_t)sa, (caddr_t)uap->osa, 7839513Skarels sizeof (vec))) 7944405Skarels return (error); 8012951Ssam } 8139513Skarels if (uap->nsa) { 8239513Skarels if (error = copyin((caddr_t)uap->nsa, (caddr_t)sa, 8339513Skarels sizeof (vec))) 8444405Skarels return (error); 8542920Skarels setsigvec(p, sig, sa); 8612951Ssam } 8744405Skarels return (0); 887421Sroot } 897421Sroot 9042920Skarels setsigvec(p, sig, sa) 9142920Skarels register struct proc *p; 9212951Ssam int sig; 9339513Skarels register struct sigaction *sa; 9412882Ssam { 9547540Skarels register struct sigacts *ps = p->p_sigacts; 9612951Ssam register int bit; 9712882Ssam 9817153Sbloom bit = sigmask(sig); 9912882Ssam /* 10012882Ssam * Change setting atomically. 10112882Ssam */ 10217153Sbloom (void) splhigh(); 10347540Skarels ps->ps_sigact[sig] = sa->sa_handler; 10447540Skarels ps->ps_catchmask[sig] = sa->sa_mask &~ sigcantmask; 10539513Skarels if ((sa->sa_flags & SA_RESTART) == 0) 10647540Skarels ps->ps_sigintr |= bit; 10718308Smckusick else 10847540Skarels ps->ps_sigintr &= ~bit; 10939513Skarels if (sa->sa_flags & SA_ONSTACK) 11047540Skarels ps->ps_sigonstack |= bit; 11112951Ssam else 11247540Skarels ps->ps_sigonstack &= ~bit; 11352400Storek #ifdef COMPAT_SUNOS 11452400Storek if (sa->sa_flags & SA_USERTRAMP) 11552400Storek ps->ps_usertramp |= bit; 11652400Storek else 11752400Storek ps->ps_usertramp &= ~bit; 11852400Storek #endif 11939513Skarels if (sig == SIGCHLD) { 12039513Skarels if (sa->sa_flags & SA_NOCLDSTOP) 12139513Skarels p->p_flag |= SNOCLDSTOP; 12239513Skarels else 12339513Skarels p->p_flag &= ~SNOCLDSTOP; 12439513Skarels } 12539513Skarels /* 12639513Skarels * Set bit in p_sigignore for signals that are set to SIG_IGN, 12739513Skarels * and for signals set to SIG_DFL where the default is to ignore. 12839513Skarels * However, don't put SIGCONT in p_sigignore, 12939513Skarels * as we have to restart the process. 13039513Skarels */ 13139513Skarels if (sa->sa_handler == SIG_IGN || 13247540Skarels (sigprop[sig] & SA_IGNORE && sa->sa_handler == SIG_DFL)) { 13312951Ssam p->p_sig &= ~bit; /* never to be seen again */ 13439513Skarels if (sig != SIGCONT) 13539513Skarels p->p_sigignore |= bit; /* easier in psignal */ 13612951Ssam p->p_sigcatch &= ~bit; 13712882Ssam } else { 13812951Ssam p->p_sigignore &= ~bit; 13939513Skarels if (sa->sa_handler == SIG_DFL) 14012951Ssam p->p_sigcatch &= ~bit; 14112882Ssam else 14212951Ssam p->p_sigcatch |= bit; 14312882Ssam } 14412882Ssam (void) spl0(); 14512882Ssam } 14612882Ssam 14739513Skarels /* 14839513Skarels * Initialize signal state for process 0; 14939513Skarels * set to ignore signals that are ignored by default. 15039513Skarels */ 15147540Skarels void 15239513Skarels siginit(p) 15339513Skarels struct proc *p; 1547421Sroot { 15547540Skarels register int i; 15639513Skarels 15747540Skarels for (i = 0; i < NSIG; i++) 15847540Skarels if (sigprop[i] & SA_IGNORE && i != SIGCONT) 15947540Skarels p->p_sigignore |= sigmask(i); 16039513Skarels } 16139513Skarels 16239513Skarels /* 16339513Skarels * Reset signals for an exec of the specified process. 16439513Skarels */ 16547540Skarels void 16639513Skarels execsigs(p) 16739513Skarels register struct proc *p; 16839513Skarels { 16947540Skarels register struct sigacts *ps = p->p_sigacts; 17039513Skarels register int nc, mask; 17139513Skarels 17239513Skarels /* 17339513Skarels * Reset caught signals. Held signals remain held 17439513Skarels * through p_sigmask (unless they were caught, 17539513Skarels * and are now ignored by default). 17639513Skarels */ 17739513Skarels while (p->p_sigcatch) { 17839513Skarels nc = ffs((long)p->p_sigcatch); 17939513Skarels mask = sigmask(nc); 18039513Skarels p->p_sigcatch &= ~mask; 18147540Skarels if (sigprop[nc] & SA_IGNORE) { 18239513Skarels if (nc != SIGCONT) 18339513Skarels p->p_sigignore |= mask; 18439513Skarels p->p_sig &= ~mask; 18539513Skarels } 18647540Skarels ps->ps_sigact[nc] = SIG_DFL; 18739513Skarels } 18839513Skarels /* 18939513Skarels * Reset stack state to the user stack. 19039513Skarels * Clear set of signals caught on the signal stack. 19139513Skarels */ 19253218Smckusick ps->ps_sigstk.ss_flags = SA_DISABLE; 19353218Smckusick ps->ps_sigstk.ss_size = 0; 19453218Smckusick ps->ps_sigstk.ss_base = 0; 19553218Smckusick ps->ps_flags = 0; 19639513Skarels } 19739513Skarels 19839513Skarels /* 19939513Skarels * Manipulate signal mask. 20039513Skarels * Note that we receive new mask, not pointer, 20139513Skarels * and return old mask as return value; 20239513Skarels * the library stub does the rest. 20339513Skarels */ 20454926Storek struct sigprocmask_args { 20554926Storek int how; 20654926Storek sigset_t mask; 20754926Storek }; 20842920Skarels sigprocmask(p, uap, retval) 20942920Skarels register struct proc *p; 21054926Storek struct sigprocmask_args *uap; 21142920Skarels int *retval; 21242920Skarels { 21339513Skarels int error = 0; 21439513Skarels 21542920Skarels *retval = p->p_sigmask; 21639513Skarels (void) splhigh(); 21739513Skarels 21839513Skarels switch (uap->how) { 21939513Skarels case SIG_BLOCK: 22039513Skarels p->p_sigmask |= uap->mask &~ sigcantmask; 22139513Skarels break; 22239513Skarels 22339513Skarels case SIG_UNBLOCK: 22439513Skarels p->p_sigmask &= ~uap->mask; 22539513Skarels break; 22639513Skarels 22739513Skarels case SIG_SETMASK: 22839513Skarels p->p_sigmask = uap->mask &~ sigcantmask; 22939513Skarels break; 23039513Skarels 23139513Skarels default: 23239513Skarels error = EINVAL; 23339513Skarels break; 23439513Skarels } 23539513Skarels (void) spl0(); 23644405Skarels return (error); 23739513Skarels } 23839513Skarels 23954926Storek struct sigpending_args { 24054926Storek int dummy; 24154926Storek }; 24242920Skarels /* ARGSUSED */ 24342920Skarels sigpending(p, uap, retval) 24442920Skarels struct proc *p; 24554926Storek struct sigpending_args *uap; 24642920Skarels int *retval; 24739513Skarels { 24839513Skarels 24942920Skarels *retval = p->p_sig; 25044405Skarels return (0); 25139513Skarels } 25239513Skarels 25352400Storek #if defined(COMPAT_43) || defined(COMPAT_SUNOS) 25439513Skarels /* 25539513Skarels * Generalized interface signal handler, 4.3-compatible. 25639513Skarels */ 25754926Storek struct osigvec_args { 25854926Storek int signo; 25954926Storek struct sigvec *nsv; 26054926Storek struct sigvec *osv; 26154926Storek }; 26242920Skarels /* ARGSUSED */ 26342920Skarels osigvec(p, uap, retval) 26442920Skarels struct proc *p; 26554926Storek register struct osigvec_args *uap; 26642920Skarels int *retval; 26742920Skarels { 26839513Skarels struct sigvec vec; 26947540Skarels register struct sigacts *ps = p->p_sigacts; 27039513Skarels register struct sigvec *sv; 27139513Skarels register int sig; 27239513Skarels int bit, error; 27339513Skarels 27439513Skarels sig = uap->signo; 27539513Skarels if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) 27644405Skarels return (EINVAL); 27739513Skarels sv = &vec; 27839513Skarels if (uap->osv) { 27947540Skarels *(sig_t *)&sv->sv_handler = ps->ps_sigact[sig]; 28047540Skarels sv->sv_mask = ps->ps_catchmask[sig]; 28139513Skarels bit = sigmask(sig); 28239513Skarels sv->sv_flags = 0; 28347540Skarels if ((ps->ps_sigonstack & bit) != 0) 28439513Skarels sv->sv_flags |= SV_ONSTACK; 28547540Skarels if ((ps->ps_sigintr & bit) != 0) 28639513Skarels sv->sv_flags |= SV_INTERRUPT; 28752400Storek #ifndef COMPAT_SUNOS 28842920Skarels if (p->p_flag & SNOCLDSTOP) 28939513Skarels sv->sv_flags |= SA_NOCLDSTOP; 29052400Storek #endif 29139513Skarels if (error = copyout((caddr_t)sv, (caddr_t)uap->osv, 29239513Skarels sizeof (vec))) 29344405Skarels return (error); 29439513Skarels } 29539513Skarels if (uap->nsv) { 29639513Skarels if (error = copyin((caddr_t)uap->nsv, (caddr_t)sv, 29739513Skarels sizeof (vec))) 29844405Skarels return (error); 29952400Storek #ifdef COMPAT_SUNOS 30052400Storek /* 30154344Smckusick * SunOS uses this bit (4, aka SA_DISABLE) as SV_RESETHAND, 30254344Smckusick * `reset to SIG_DFL on delivery'. We have no such option 30354344Smckusick * now or ever! 30452400Storek */ 30554344Smckusick if (sv->sv_flags & SA_DISABLE) 30652400Storek return (EINVAL); 30752400Storek sv->sv_flags |= SA_USERTRAMP; 30852400Storek #endif 30939513Skarels sv->sv_flags ^= SA_RESTART; /* opposite of SV_INTERRUPT */ 31042920Skarels setsigvec(p, sig, (struct sigaction *)sv); 31139513Skarels } 31244405Skarels return (0); 31339513Skarels } 31439513Skarels 31554926Storek struct osigblock_args { 31654926Storek int mask; 31754926Storek }; 31842920Skarels osigblock(p, uap, retval) 31942920Skarels register struct proc *p; 32054926Storek struct osigblock_args *uap; 32142920Skarels int *retval; 32239513Skarels { 3237499Sroot 32417153Sbloom (void) splhigh(); 32542920Skarels *retval = p->p_sigmask; 32639513Skarels p->p_sigmask |= uap->mask &~ sigcantmask; 32712882Ssam (void) spl0(); 32844405Skarels return (0); 3297499Sroot } 3307499Sroot 33154926Storek struct osigsetmask_args { 33254926Storek int mask; 33354926Storek }; 33442920Skarels osigsetmask(p, uap, retval) 33542920Skarels struct proc *p; 33654926Storek struct osigsetmask_args *uap; 33742920Skarels int *retval; 3387499Sroot { 3397499Sroot 34017153Sbloom (void) splhigh(); 34142920Skarels *retval = p->p_sigmask; 34239513Skarels p->p_sigmask = uap->mask &~ sigcantmask; 34312882Ssam (void) spl0(); 34444405Skarels return (0); 3457499Sroot } 34654344Smckusick #endif /* COMPAT_43 || COMPAT_SUNOS */ 3477499Sroot 34839513Skarels /* 34939513Skarels * Suspend process until signal, providing mask to be set 35039513Skarels * in the meantime. Note nonstandard calling convention: 35139513Skarels * libc stub passes mask, not pointer, to save a copyin. 35239513Skarels */ 35354926Storek struct sigsuspend_args { 35454926Storek sigset_t mask; 35554926Storek }; 35642920Skarels /* ARGSUSED */ 35742920Skarels sigsuspend(p, uap, retval) 35842920Skarels register struct proc *p; 35954926Storek struct sigsuspend_args *uap; 36042920Skarels int *retval; 3617499Sroot { 36247540Skarels register struct sigacts *ps = p->p_sigacts; 3637499Sroot 36412882Ssam /* 36512882Ssam * When returning from sigpause, we want 36612882Ssam * the old mask to be restored after the 36712882Ssam * signal handler has finished. Thus, we 36852115Skarels * save it here and mark the sigacts structure 36952115Skarels * to indicate this. 37012882Ssam */ 37147540Skarels ps->ps_oldmask = p->p_sigmask; 37253218Smckusick ps->ps_flags |= SAS_OLDMASK; 37339513Skarels p->p_sigmask = uap->mask &~ sigcantmask; 37458230Smckusick while (tsleep((caddr_t) ps, PPAUSE|PCATCH, "pause", 0) == 0) 37558230Smckusick /* void */; 37640807Smarc /* always return EINTR rather than ERESTART... */ 37744405Skarels return (EINTR); 3787499Sroot } 3797499Sroot 38054344Smckusick #if defined(COMPAT_43) || defined(COMPAT_SUNOS) 38154926Storek struct osigstack_args { 38254926Storek struct sigstack *nss; 38354926Storek struct sigstack *oss; 38454926Storek }; 38542920Skarels /* ARGSUSED */ 38653218Smckusick osigstack(p, uap, retval) 38742920Skarels struct proc *p; 38854926Storek register struct osigstack_args *uap; 38942920Skarels int *retval; 39042920Skarels { 39112951Ssam struct sigstack ss; 39253218Smckusick struct sigacts *psp; 39339513Skarels int error = 0; 3947499Sroot 39553218Smckusick psp = p->p_sigacts; 39653218Smckusick ss.ss_sp = psp->ps_sigstk.ss_base; 39753218Smckusick ss.ss_onstack = psp->ps_sigstk.ss_flags & SA_ONSTACK; 39853218Smckusick if (uap->oss && (error = copyout((caddr_t)&ss, (caddr_t)uap->oss, 39953218Smckusick sizeof (struct sigstack)))) 40044405Skarels return (error); 40139513Skarels if (uap->nss && (error = copyin((caddr_t)uap->nss, (caddr_t)&ss, 40253218Smckusick sizeof (ss))) == 0) { 40353218Smckusick psp->ps_sigstk.ss_base = ss.ss_sp; 40453218Smckusick psp->ps_sigstk.ss_size = 0; 40553218Smckusick psp->ps_sigstk.ss_flags |= ss.ss_onstack & SA_ONSTACK; 40653218Smckusick psp->ps_flags |= SAS_ALTSTACK; 40753218Smckusick } 40844405Skarels return (error); 4097499Sroot } 41054344Smckusick #endif /* COMPAT_43 || COMPAT_SUNOS */ 4117499Sroot 41254926Storek struct sigaltstack_args { 41354926Storek struct sigaltstack *nss; 41454926Storek struct sigaltstack *oss; 41554926Storek }; 41642920Skarels /* ARGSUSED */ 41753218Smckusick sigaltstack(p, uap, retval) 41853218Smckusick struct proc *p; 41954926Storek register struct sigaltstack_args *uap; 42053218Smckusick int *retval; 42153218Smckusick { 42253218Smckusick struct sigacts *psp; 42353218Smckusick struct sigaltstack ss; 42453218Smckusick int error; 42553218Smckusick 42653218Smckusick psp = p->p_sigacts; 42753218Smckusick if ((psp->ps_flags & SAS_ALTSTACK) == 0) 42853218Smckusick psp->ps_sigstk.ss_flags |= SA_DISABLE; 42953218Smckusick if (uap->oss && (error = copyout((caddr_t)&psp->ps_sigstk, 43053218Smckusick (caddr_t)uap->oss, sizeof (struct sigaltstack)))) 43153218Smckusick return (error); 43254464Smckusick if (uap->nss == 0) 43354464Smckusick return (0); 43454464Smckusick if (error = copyin((caddr_t)uap->nss, (caddr_t)&ss, sizeof (ss))) 43553218Smckusick return (error); 43653218Smckusick if (ss.ss_flags & SA_DISABLE) { 43753218Smckusick if (psp->ps_sigstk.ss_flags & SA_ONSTACK) 43853218Smckusick return (EINVAL); 43953218Smckusick psp->ps_flags &= ~SAS_ALTSTACK; 44053218Smckusick psp->ps_sigstk.ss_flags = ss.ss_flags; 44153218Smckusick return (0); 44253218Smckusick } 44353218Smckusick if (ss.ss_size < MINSIGSTKSZ) 44453218Smckusick return (ENOMEM); 44553218Smckusick psp->ps_flags |= SAS_ALTSTACK; 44653218Smckusick psp->ps_sigstk= ss; 44753218Smckusick return (0); 44853218Smckusick } 44953218Smckusick 45054926Storek struct kill_args { 45154926Storek int pid; 45254926Storek int signo; 45354926Storek }; 45453218Smckusick /* ARGSUSED */ 45542920Skarels kill(cp, uap, retval) 45642920Skarels register struct proc *cp; 45754926Storek register struct kill_args *uap; 45842920Skarels int *retval; 45942920Skarels { 46018336Smckusick register struct proc *p; 46147540Skarels register struct pcred *pc = cp->p_cred; 4628032Sroot 46339513Skarels if ((unsigned) uap->signo >= NSIG) 46444405Skarels return (EINVAL); 46518336Smckusick if (uap->pid > 0) { 46618336Smckusick /* kill single process */ 46718336Smckusick p = pfind(uap->pid); 46839513Skarels if (p == 0) 46944405Skarels return (ESRCH); 47047540Skarels if (!CANSIGNAL(cp, pc, p, uap->signo)) 47144405Skarels return (EPERM); 47239513Skarels if (uap->signo) 47318336Smckusick psignal(p, uap->signo); 47444405Skarels return (0); 47518336Smckusick } 47618336Smckusick switch (uap->pid) { 47718336Smckusick case -1: /* broadcast signal */ 47844405Skarels return (killpg1(cp, uap->signo, 0, 1)); 47918336Smckusick case 0: /* signal own process group */ 48044405Skarels return (killpg1(cp, uap->signo, 0, 0)); 48118336Smckusick default: /* negative explicit process group */ 48244405Skarels return (killpg1(cp, uap->signo, -uap->pid, 0)); 48318336Smckusick } 48439513Skarels /* NOTREACHED */ 4858032Sroot } 4868032Sroot 48752400Storek #if defined(COMPAT_43) || defined(COMPAT_SUNOS) 48854926Storek struct okillpg_args { 48954926Storek int pgid; 49054926Storek int signo; 49154926Storek }; 49242920Skarels /* ARGSUSED */ 49342920Skarels okillpg(p, uap, retval) 49442920Skarels struct proc *p; 49554926Storek register struct okillpg_args *uap; 49642920Skarels int *retval; 49742920Skarels { 4988032Sroot 49939513Skarels if ((unsigned) uap->signo >= NSIG) 50044405Skarels return (EINVAL); 50144405Skarels return (killpg1(p, uap->signo, uap->pgid, 0)); 5028032Sroot } 50354344Smckusick #endif /* COMPAT_43 || COMPAT_SUNOS */ 5048032Sroot 50542920Skarels /* 50642920Skarels * Common code for kill process group/broadcast kill. 50742920Skarels * cp is calling process. 50842920Skarels */ 50942920Skarels killpg1(cp, signo, pgid, all) 51042920Skarels register struct proc *cp; 51137581Smckusick int signo, pgid, all; 5129989Ssam { 5139989Ssam register struct proc *p; 51447540Skarels register struct pcred *pc = cp->p_cred; 51537581Smckusick struct pgrp *pgrp; 51647540Skarels int nfound = 0; 51737581Smckusick 51837581Smckusick if (all) 51937581Smckusick /* 52037581Smckusick * broadcast 5217421Sroot */ 52254758Storek for (p = (struct proc *)allproc; p != NULL; p = p->p_nxt) { 523*58371Smckusick if (p->p_pid <= 1 || p->p_flag & SSYS || 52447540Skarels p == cp || !CANSIGNAL(cp, pc, p, signo)) 52537581Smckusick continue; 52647540Skarels nfound++; 52737581Smckusick if (signo) 52837581Smckusick psignal(p, signo); 52937581Smckusick } 53037581Smckusick else { 53137581Smckusick if (pgid == 0) 53237581Smckusick /* 53337581Smckusick * zero pgid means send to my process group. 53437581Smckusick */ 53547540Skarels pgrp = cp->p_pgrp; 53637581Smckusick else { 53737581Smckusick pgrp = pgfind(pgid); 53837581Smckusick if (pgrp == NULL) 53939513Skarels return (ESRCH); 54037581Smckusick } 54137581Smckusick for (p = pgrp->pg_mem; p != NULL; p = p->p_pgrpnxt) { 542*58371Smckusick if (p->p_pid <= 1 || p->p_flag & SSYS || 54350128Skarels p->p_stat == SZOMB || !CANSIGNAL(cp, pc, p, signo)) 54437581Smckusick continue; 54547540Skarels nfound++; 54637581Smckusick if (signo) 54737581Smckusick psignal(p, signo); 54818336Smckusick } 5497421Sroot } 55047540Skarels return (nfound ? 0 : ESRCH); 5517421Sroot } 5527421Sroot 55342920Skarels /* 5547421Sroot * Send the specified signal to 55537581Smckusick * all processes with 'pgid' as 5567421Sroot * process group. 5577421Sroot */ 55847540Skarels void 55937581Smckusick gsignal(pgid, sig) 56047540Skarels int pgid, sig; 5617421Sroot { 56239513Skarels struct pgrp *pgrp; 5637421Sroot 56439513Skarels if (pgid && (pgrp = pgfind(pgid))) 56542207Smarc pgsignal(pgrp, sig, 0); 5667421Sroot } 56742920Skarels 56840807Smarc /* 56942207Smarc * Send sig to every member of a process group. 57042207Smarc * If checktty is 1, limit to members which have a controlling 57142207Smarc * terminal. 57240807Smarc */ 57347540Skarels void 57442207Smarc pgsignal(pgrp, sig, checkctty) 57539513Skarels struct pgrp *pgrp; 57647540Skarels int sig, checkctty; 57737581Smckusick { 57837581Smckusick register struct proc *p; 57937581Smckusick 58040807Smarc if (pgrp) 58140807Smarc for (p = pgrp->pg_mem; p != NULL; p = p->p_pgrpnxt) 582*58371Smckusick if (checkctty == 0 || p->p_flag & SCTTY) 58342207Smarc psignal(p, sig); 58437581Smckusick } 58537581Smckusick 5867421Sroot /* 58739513Skarels * Send a signal caused by a trap to the current process. 58839513Skarels * If it will be caught immediately, deliver it with correct code. 58939513Skarels * Otherwise, post it normally. 59039513Skarels */ 59147540Skarels void 59247540Skarels trapsignal(p, sig, code) 59347540Skarels struct proc *p; 59439513Skarels register int sig; 59539513Skarels unsigned code; 59639513Skarels { 59747540Skarels register struct sigacts *ps = p->p_sigacts; 59839513Skarels int mask; 59939513Skarels 60039513Skarels mask = sigmask(sig); 60139513Skarels if ((p->p_flag & STRC) == 0 && (p->p_sigcatch & mask) != 0 && 60239513Skarels (p->p_sigmask & mask) == 0) { 60347540Skarels p->p_stats->p_ru.ru_nsignals++; 60440807Smarc #ifdef KTRACE 60540807Smarc if (KTRPOINT(p, KTR_PSIG)) 60647540Skarels ktrpsig(p->p_tracep, sig, ps->ps_sigact[sig], 60740807Smarc p->p_sigmask, code); 60840807Smarc #endif 60947540Skarels sendsig(ps->ps_sigact[sig], sig, p->p_sigmask, code); 61047540Skarels p->p_sigmask |= ps->ps_catchmask[sig] | mask; 61139513Skarels } else { 61247540Skarels ps->ps_code = code; /* XXX for core dump/debugger */ 61339513Skarels psignal(p, sig); 61439513Skarels } 61539513Skarels } 61639513Skarels 61739513Skarels /* 61840807Smarc * Send the specified signal to the specified process. 61947540Skarels * If the signal has an action, the action is usually performed 62047540Skarels * by the target process rather than the caller; we simply add 62147540Skarels * the signal to the set of pending signals for the process. 62240807Smarc * Exceptions: 62340807Smarc * o When a stop signal is sent to a sleeping process that takes the default 62440807Smarc * action, the process is stopped without awakening it. 62540807Smarc * o SIGCONT restarts stopped processes (or puts them back to sleep) 62640807Smarc * regardless of the signal action (eg, blocked or ignored). 62740807Smarc * Other ignored signals are discarded immediately. 6287421Sroot */ 62947540Skarels void 6307421Sroot psignal(p, sig) 6317421Sroot register struct proc *p; 6327421Sroot register int sig; 6337421Sroot { 63447540Skarels register int s, prop; 63539513Skarels register sig_t action; 63617153Sbloom int mask; 6377421Sroot 63839513Skarels if ((unsigned)sig >= NSIG || sig == 0) 63939513Skarels panic("psignal sig"); 64017153Sbloom mask = sigmask(sig); 64147540Skarels prop = sigprop[sig]; 6427421Sroot 6437421Sroot /* 6447421Sroot * If proc is traced, always give parent a chance. 6457421Sroot */ 6467421Sroot if (p->p_flag & STRC) 6477421Sroot action = SIG_DFL; 6487421Sroot else { 6497421Sroot /* 65012882Ssam * If the signal is being ignored, 65112882Ssam * then we forget about it immediately. 65239513Skarels * (Note: we don't set SIGCONT in p_sigignore, 65339513Skarels * and if it is set to SIG_IGN, 65439513Skarels * action will be SIG_DFL here.) 6557421Sroot */ 65617153Sbloom if (p->p_sigignore & mask) 6577421Sroot return; 65817153Sbloom if (p->p_sigmask & mask) 65912882Ssam action = SIG_HOLD; 66017153Sbloom else if (p->p_sigcatch & mask) 66112882Ssam action = SIG_CATCH; 66242437Skarels else 66312882Ssam action = SIG_DFL; 6647421Sroot } 6657421Sroot 666*58371Smckusick if (p->p_nice > NZERO && action == SIG_DFL && (prop & SA_KILL) && 667*58371Smckusick (p->p_flag & STRC) == 0) 66847540Skarels p->p_nice = NZERO; 6697421Sroot 67047540Skarels if (prop & SA_CONT) 67139513Skarels p->p_sig &= ~stopsigmask; 67239513Skarels 67347540Skarels if (prop & SA_STOP) { 67445672Skarels /* 67545672Skarels * If sending a tty stop signal to a member of an orphaned 67645672Skarels * process group, discard the signal here if the action 67745672Skarels * is default; don't stop the process below if sleeping, 67845672Skarels * and don't clear any pending SIGCONT. 67945672Skarels */ 68047540Skarels if (prop & SA_TTYSTOP && p->p_pgrp->pg_jobc == 0 && 68147540Skarels action == SIG_DFL) 68245741Smckusick return; 68347540Skarels p->p_sig &= ~contsigmask; 6847421Sroot } 68539513Skarels p->p_sig |= mask; 68639513Skarels 6877421Sroot /* 68839513Skarels * Defer further processing for signals which are held, 68939513Skarels * except that stopped processes must be continued by SIGCONT. 6907421Sroot */ 69147540Skarels if (action == SIG_HOLD && ((prop & SA_CONT) == 0 || p->p_stat != SSTOP)) 6927421Sroot return; 69317153Sbloom s = splhigh(); 6947421Sroot switch (p->p_stat) { 6957421Sroot 6967421Sroot case SSLEEP: 6977421Sroot /* 69840807Smarc * If process is sleeping uninterruptibly 6997421Sroot * we can't interrupt the sleep... the signal will 7007421Sroot * be noticed when the process returns through 7017421Sroot * trap() or syscall(). 7027421Sroot */ 70340807Smarc if ((p->p_flag & SSINTR) == 0) 7047421Sroot goto out; 7057421Sroot /* 7067421Sroot * Process is sleeping and traced... make it runnable 7077421Sroot * so it can discover the signal in issig() and stop 7087421Sroot * for the parent. 7097421Sroot */ 710*58371Smckusick if (p->p_flag & STRC) 7117421Sroot goto run; 71239513Skarels /* 713*58371Smckusick * If SIGCONT is default (or ignored) and process is 714*58371Smckusick * asleep, we are finished; the process should not 715*58371Smckusick * be awakened. 716*58371Smckusick */ 717*58371Smckusick if ((prop & SA_CONT) && action == SIG_DFL) { 718*58371Smckusick p->p_sig &= ~mask; 719*58371Smckusick goto out; 720*58371Smckusick } 721*58371Smckusick /* 72239513Skarels * When a sleeping process receives a stop 72339513Skarels * signal, process immediately if possible. 72439513Skarels * All other (caught or default) signals 72539513Skarels * cause the process to run. 72639513Skarels */ 72747540Skarels if (prop & SA_STOP) { 7287421Sroot if (action != SIG_DFL) 72939513Skarels goto runfast; 7307421Sroot /* 73147540Skarels * If a child holding parent blocked, 73247540Skarels * stopping could cause deadlock. 7337421Sroot */ 734*58371Smckusick if (p->p_flag & SPPWAIT) 7357421Sroot goto out; 73617153Sbloom p->p_sig &= ~mask; 73743895Skarels p->p_xstat = sig; 73839513Skarels if ((p->p_pptr->p_flag & SNOCLDSTOP) == 0) 73939513Skarels psignal(p->p_pptr, SIGCHLD); 7407421Sroot stop(p); 7417421Sroot goto out; 74239513Skarels } else 74339513Skarels goto runfast; 7447421Sroot /*NOTREACHED*/ 7457421Sroot 7467421Sroot case SSTOP: 7477421Sroot /* 7487421Sroot * If traced process is already stopped, 7497421Sroot * then no further action is necessary. 7507421Sroot */ 751*58371Smckusick if (p->p_flag & STRC) 7527421Sroot goto out; 7537421Sroot 75447540Skarels /* 75547540Skarels * Kill signal always sets processes running. 75647540Skarels */ 75747540Skarels if (sig == SIGKILL) 75839513Skarels goto runfast; 7597421Sroot 76047540Skarels if (prop & SA_CONT) { 7617421Sroot /* 76239513Skarels * If SIGCONT is default (or ignored), we continue 76339513Skarels * the process but don't leave the signal in p_sig, 76439513Skarels * as it has no further action. If SIGCONT is held, 76539513Skarels * continue the process and leave the signal in p_sig. 7667421Sroot * If the process catches SIGCONT, let it handle 7677421Sroot * the signal itself. If it isn't waiting on 7687421Sroot * an event, then it goes back to run state. 7697421Sroot * Otherwise, process goes back to sleep state. 7707421Sroot */ 77139513Skarels if (action == SIG_DFL) 77239513Skarels p->p_sig &= ~mask; 77339513Skarels if (action == SIG_CATCH) 77439513Skarels goto runfast; 77539513Skarels if (p->p_wchan == 0) 7767421Sroot goto run; 7777421Sroot p->p_stat = SSLEEP; 7787421Sroot goto out; 77947540Skarels } 7807421Sroot 78147540Skarels if (prop & SA_STOP) { 7827421Sroot /* 7837421Sroot * Already stopped, don't need to stop again. 7847421Sroot * (If we did the shell could get confused.) 7857421Sroot */ 78617153Sbloom p->p_sig &= ~mask; /* take it away */ 7877421Sroot goto out; 7887421Sroot } 7897421Sroot 79047540Skarels /* 79147540Skarels * If process is sleeping interruptibly, then 79247540Skarels * simulate a wakeup so that when it is continued, 79347540Skarels * it will be made runnable and can look at the signal. 79447540Skarels * But don't setrun the process, leave it stopped. 79547540Skarels */ 79647540Skarels if (p->p_wchan && p->p_flag & SSINTR) 79747540Skarels unsleep(p); 79847540Skarels goto out; 79947540Skarels 8007421Sroot default: 8017421Sroot /* 8027421Sroot * SRUN, SIDL, SZOMB do nothing with the signal, 8037421Sroot * other than kicking ourselves if we are running. 8047421Sroot * It will either never be noticed, or noticed very soon. 8057421Sroot */ 80647650Skarels if (p == curproc) 80749102Skarels signotify(p); 8087421Sroot goto out; 8097421Sroot } 8107421Sroot /*NOTREACHED*/ 81139513Skarels 81239513Skarels runfast: 8137421Sroot /* 8147421Sroot * Raise priority to at least PUSER. 8157421Sroot */ 8167421Sroot if (p->p_pri > PUSER) 81717399Skarels p->p_pri = PUSER; 81839513Skarels run: 8197421Sroot setrun(p); 8207421Sroot out: 8217421Sroot splx(s); 8227421Sroot } 8237421Sroot 8247421Sroot /* 82540807Smarc * If the current process has a signal to process (should be caught 82640807Smarc * or cause termination, should interrupt current syscall), 82740807Smarc * return the signal number. Stop signals with default action 82840807Smarc * are processed immediately, then cleared; they aren't returned. 82947540Skarels * This is checked after each entry to the system for a syscall 83047540Skarels * or trap (though this can usually be done without actually calling 83147540Skarels * issig by checking the pending signal masks in the CURSIG macro.) 83247540Skarels * The normal call sequence is 83347540Skarels * 83447540Skarels * while (sig = CURSIG(curproc)) 83547540Skarels * psig(sig); 8367421Sroot */ 83747540Skarels issig(p) 83847540Skarels register struct proc *p; 8397421Sroot { 84047540Skarels register int sig, mask, prop; 8417421Sroot 8427421Sroot for (;;) { 84339513Skarels mask = p->p_sig &~ p->p_sigmask; 844*58371Smckusick if (p->p_flag & SPPWAIT) 84539513Skarels mask &= ~stopsigmask; 84640807Smarc if (mask == 0) /* no signal to send */ 84740807Smarc return (0); 84839513Skarels sig = ffs((long)mask); 84917153Sbloom mask = sigmask(sig); 85047540Skarels prop = sigprop[sig]; 85140807Smarc /* 85240807Smarc * We should see pending but ignored signals 85340807Smarc * only if STRC was on when they were posted. 85440807Smarc */ 855*58371Smckusick if (mask & p->p_sigignore && (p->p_flag & STRC) == 0) { 85640807Smarc p->p_sig &= ~mask; 85740807Smarc continue; 85840807Smarc } 859*58371Smckusick if (p->p_flag & STRC && (p->p_flag & SPPWAIT) == 0) { 8607421Sroot /* 8617421Sroot * If traced, always stop, and stay 8627421Sroot * stopped until released by the parent. 8637421Sroot */ 86443895Skarels p->p_xstat = sig; 86518331Skarels psignal(p->p_pptr, SIGCHLD); 8667421Sroot do { 8677421Sroot stop(p); 8687421Sroot swtch(); 869*58371Smckusick } while (!procxmt(p) && p->p_flag & STRC); 8707421Sroot 8717421Sroot /* 87214782Ssam * If the traced bit got turned off, 87340807Smarc * go back up to the top to rescan signals. 87447650Skarels * This ensures that p_sig* and ps_sigact 87547650Skarels * are consistent. 8767421Sroot */ 877*58371Smckusick if ((p->p_flag & STRC) == 0) 8787421Sroot continue; 8797421Sroot 8807421Sroot /* 8817421Sroot * If parent wants us to take the signal, 88243895Skarels * then it will leave it in p->p_xstat; 8837421Sroot * otherwise we just look for signals again. 8847421Sroot */ 88540807Smarc p->p_sig &= ~mask; /* clear the old signal */ 88643895Skarels sig = p->p_xstat; 8877421Sroot if (sig == 0) 8887421Sroot continue; 88914782Ssam 89014782Ssam /* 89140807Smarc * Put the new signal into p_sig. 89240807Smarc * If signal is being masked, 89340807Smarc * look for other signals. 89414782Ssam */ 89517153Sbloom mask = sigmask(sig); 89640807Smarc p->p_sig |= mask; 89740807Smarc if (p->p_sigmask & mask) 89814782Ssam continue; 8997421Sroot } 90040807Smarc 90140807Smarc /* 90240807Smarc * Decide whether the signal should be returned. 90340807Smarc * Return the signal's number, or fall through 90440807Smarc * to clear it from the pending mask. 90540807Smarc */ 90647540Skarels switch ((int)p->p_sigacts->ps_sigact[sig]) { 9077421Sroot 9087421Sroot case SIG_DFL: 9097421Sroot /* 9107421Sroot * Don't take default actions on system processes. 9117421Sroot */ 91251019Sralph if (p->p_pid <= 1) { 91351019Sralph #ifdef DIAGNOSTIC 91451019Sralph /* 91551019Sralph * Are you sure you want to ignore SIGSEGV 91651019Sralph * in init? XXX 91751019Sralph */ 91851019Sralph printf("Process (pid %d) got signal %d\n", 91951019Sralph p->p_pid, sig); 92051019Sralph #endif 92140807Smarc break; /* == ignore */ 92251019Sralph } 92340807Smarc /* 92440807Smarc * If there is a pending stop signal to process 92540807Smarc * with default action, stop here, 92642437Skarels * then clear the signal. However, 92742437Skarels * if process is member of an orphaned 92842437Skarels * process group, ignore tty stop signals. 92940807Smarc */ 93047540Skarels if (prop & SA_STOP) { 931*58371Smckusick if (p->p_flag & STRC || 93242437Skarels (p->p_pgrp->pg_jobc == 0 && 93347540Skarels prop & SA_TTYSTOP)) 93440807Smarc break; /* == ignore */ 93543895Skarels p->p_xstat = sig; 9367421Sroot stop(p); 93739513Skarels if ((p->p_pptr->p_flag & SNOCLDSTOP) == 0) 93839513Skarels psignal(p->p_pptr, SIGCHLD); 9397421Sroot swtch(); 94040807Smarc break; 94147540Skarels } else if (prop & SA_IGNORE) { 9427421Sroot /* 94339513Skarels * Except for SIGCONT, shouldn't get here. 94439513Skarels * Default action is to ignore; drop it. 9457421Sroot */ 94640807Smarc break; /* == ignore */ 94739513Skarels } else 94840807Smarc return (sig); 9497421Sroot /*NOTREACHED*/ 9507421Sroot 9517421Sroot case SIG_IGN: 9527421Sroot /* 95339513Skarels * Masking above should prevent us ever trying 95439513Skarels * to take action on an ignored signal other 95539513Skarels * than SIGCONT, unless process is traced. 9567421Sroot */ 957*58371Smckusick if ((prop & SA_CONT) == 0 && (p->p_flag & STRC) == 0) 9587421Sroot printf("issig\n"); 95940807Smarc break; /* == ignore */ 9607421Sroot 9617421Sroot default: 9627421Sroot /* 9637421Sroot * This signal has an action, let 9647421Sroot * psig process it. 9657421Sroot */ 96640807Smarc return (sig); 9677421Sroot } 96840807Smarc p->p_sig &= ~mask; /* take the signal! */ 9697421Sroot } 97040807Smarc /* NOTREACHED */ 9717421Sroot } 9727421Sroot 9737421Sroot /* 9747421Sroot * Put the argument process into the stopped 97518331Skarels * state and notify the parent via wakeup. 97618331Skarels * Signals are handled elsewhere. 97740807Smarc * The process must not be on the run queue. 9787421Sroot */ 9797421Sroot stop(p) 9807421Sroot register struct proc *p; 9817421Sroot { 9827421Sroot 9837421Sroot p->p_stat = SSTOP; 9847421Sroot p->p_flag &= ~SWTED; 9857421Sroot wakeup((caddr_t)p->p_pptr); 9867421Sroot } 9877421Sroot 9887421Sroot /* 98947540Skarels * Take the action for the specified signal 99047540Skarels * from the current set of pending signals. 9917421Sroot */ 99247540Skarels void 99340807Smarc psig(sig) 99440807Smarc register int sig; 9957421Sroot { 99647540Skarels register struct proc *p = curproc; 99747540Skarels register struct sigacts *ps = p->p_sigacts; 99847540Skarels register sig_t action; 99939513Skarels int mask, returnmask; 10007421Sroot 100140807Smarc #ifdef DIAGNOSTIC 100247540Skarels if (sig == 0) 100347540Skarels panic("psig"); 100440807Smarc #endif 100547540Skarels mask = sigmask(sig); 100647540Skarels p->p_sig &= ~mask; 100747540Skarels action = ps->ps_sigact[sig]; 100840807Smarc #ifdef KTRACE 100947540Skarels if (KTRPOINT(p, KTR_PSIG)) 101053218Smckusick ktrpsig(p->p_tracep, sig, action, ps->ps_flags & SAS_OLDMASK ? 101147540Skarels ps->ps_oldmask : p->p_sigmask, 0); 101240807Smarc #endif 101347540Skarels if (action == SIG_DFL) { 101447540Skarels /* 101547540Skarels * Default action, where the default is to kill 101647540Skarels * the process. (Other cases were ignored above.) 101747540Skarels */ 101847650Skarels sigexit(p, sig); 101947540Skarels /* NOTREACHED */ 102047540Skarels } else { 102147540Skarels /* 102247540Skarels * If we get here, the signal must be caught. 102347540Skarels */ 102439513Skarels #ifdef DIAGNOSTIC 102547540Skarels if (action == SIG_IGN || (p->p_sigmask & mask)) 102647540Skarels panic("psig action"); 102739513Skarels #endif 102847540Skarels /* 102947540Skarels * Set the new mask value and also defer further 103047540Skarels * occurences of this signal. 103147540Skarels * 103247540Skarels * Special case: user has done a sigpause. Here the 103347540Skarels * current mask is not of interest, but rather the 103447540Skarels * mask from before the sigpause is what we want 103547540Skarels * restored after the signal processing is completed. 103647540Skarels */ 103747540Skarels (void) splhigh(); 103853218Smckusick if (ps->ps_flags & SAS_OLDMASK) { 103947540Skarels returnmask = ps->ps_oldmask; 104053218Smckusick ps->ps_flags &= ~SAS_OLDMASK; 104147540Skarels } else 104247540Skarels returnmask = p->p_sigmask; 104347540Skarels p->p_sigmask |= ps->ps_catchmask[sig] | mask; 104447540Skarels (void) spl0(); 104547540Skarels p->p_stats->p_ru.ru_nsignals++; 104647540Skarels sendsig(action, sig, returnmask, 0); 104747540Skarels } 10487421Sroot } 10497421Sroot 10507421Sroot /* 105157533Smckusick * Kill the current process for stated reason. 105257533Smckusick */ 105357533Smckusick killproc(p, why) 105457533Smckusick struct proc *p; 105557533Smckusick char *why; 105657533Smckusick { 105757533Smckusick 105857533Smckusick log(LOG_ERR, "pid %d was killed: %s\n", p->p_pid, why); 105957533Smckusick uprintf("sorry, pid %d was killed: %s\n", p->p_pid, why); 106057533Smckusick psignal(p, SIGKILL); 106157533Smckusick } 106257533Smckusick 106357533Smckusick /* 106447650Skarels * Force the current process to exit with the specified 106547650Skarels * signal, dumping core if appropriate. We bypass the normal 106647650Skarels * tests for masked and caught signals, allowing unrecoverable 106747650Skarels * failures to terminate the process without changing signal state. 106847650Skarels * Mark the accounting record with the signal termination. 106947650Skarels * If dumping core, save the signal number for the debugger. 107047650Skarels * Calls exit and does not return. 107147650Skarels */ 107247650Skarels sigexit(p, sig) 107347650Skarels register struct proc *p; 107447650Skarels int sig; 107547650Skarels { 107647650Skarels 107747650Skarels p->p_acflag |= AXSIG; 107847650Skarels if (sigprop[sig] & SA_CORE) { 107947650Skarels p->p_sigacts->ps_sig = sig; 108047650Skarels if (coredump(p) == 0) 108147650Skarels sig |= WCOREFLAG; 108247650Skarels } 108357864Sralph exit1(p, W_EXITCODE(0, sig)); 108447650Skarels /* NOTREACHED */ 108547650Skarels } 108647650Skarels 108747650Skarels /* 108847540Skarels * Create a core dump. 108950244Skarels * The file name is "core.progname". 109050099Smckusick * Core dumps are not created if the process is setuid. 10917421Sroot */ 109247540Skarels coredump(p) 109347540Skarels register struct proc *p; 10947421Sroot { 109537728Smckusick register struct vnode *vp; 109647540Skarels register struct pcred *pcred = p->p_cred; 109747540Skarels register struct ucred *cred = pcred->pc_ucred; 109847540Skarels register struct vmspace *vm = p->p_vmspace; 109937580Smckusick struct vattr vattr; 110050105Smckusick int error, error1; 110147540Skarels struct nameidata nd; 110250244Skarels char name[MAXCOMLEN+6]; /* core.progname */ 11037421Sroot 110447540Skarels if (pcred->p_svuid != pcred->p_ruid || 110547540Skarels pcred->p_svgid != pcred->p_rgid) 110637580Smckusick return (EFAULT); 110747540Skarels if (ctob(UPAGES + vm->vm_dsize + vm->vm_ssize) >= 110847540Skarels p->p_rlimit[RLIMIT_CORE].rlim_cur) 110937580Smckusick return (EFAULT); 111050244Skarels sprintf(name, "core.%s", p->p_comm); 111152304Sheideman NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, name, p); 111252304Sheideman if (error = vn_open(&nd, O_CREAT|FWRITE, 0644)) 111337580Smckusick return (error); 111447540Skarels vp = nd.ni_vp; 111548020Smckusick if (vp->v_type != VREG || VOP_GETATTR(vp, &vattr, cred, p) || 111637580Smckusick vattr.va_nlink != 1) { 111750105Smckusick error = EFAULT; 111850105Smckusick goto out; 11197818Sroot } 112041362Smckusick VATTR_NULL(&vattr); 112137580Smckusick vattr.va_size = 0; 112252183Smckusick LEASE_CHECK(vp, p, cred, LEASE_WRITE); 112348020Smckusick VOP_SETATTR(vp, &vattr, cred, p); 112447540Skarels p->p_acflag |= ACORE; 112549102Skarels bcopy(p, &p->p_addr->u_kproc.kp_proc, sizeof(struct proc)); 112649102Skarels fill_eproc(p, &p->p_addr->u_kproc.kp_eproc); 112752925Smckusick error = cpu_coredump(p, vp, cred); 112837580Smckusick if (error == 0) 112947540Skarels error = vn_rdwr(UIO_WRITE, vp, vm->vm_daddr, 113047540Skarels (int)ctob(vm->vm_dsize), (off_t)ctob(UPAGES), UIO_USERSPACE, 113149102Skarels IO_NODELOCKED|IO_UNIT, cred, (int *) NULL, p); 113237580Smckusick if (error == 0) 113337580Smckusick error = vn_rdwr(UIO_WRITE, vp, 113449102Skarels (caddr_t) trunc_page(USRSTACK - ctob(vm->vm_ssize)), 113547540Skarels round_page(ctob(vm->vm_ssize)), 113647540Skarels (off_t)ctob(UPAGES) + ctob(vm->vm_dsize), UIO_USERSPACE, 113749102Skarels IO_NODELOCKED|IO_UNIT, cred, (int *) NULL, p); 113850105Smckusick out: 113950105Smckusick VOP_UNLOCK(vp); 114050105Smckusick error1 = vn_close(vp, FWRITE, cred, p); 114150244Skarels if (error == 0) 114250105Smckusick error = error1; 114337580Smckusick return (error); 11447421Sroot } 114539513Skarels 114639513Skarels /* 114739513Skarels * Nonexistent system call-- signal process (may want to handle it). 114839513Skarels * Flag error in case process won't see signal immediately (blocked or ignored). 114939513Skarels */ 115054926Storek struct nosys_args { 115154926Storek int dummy; 115254926Storek }; 115343364Smckusick /* ARGSUSED */ 115443364Smckusick nosys(p, args, retval) 115543364Smckusick struct proc *p; 115654926Storek struct nosys_args *args; 115743364Smckusick int *retval; 115839513Skarels { 115939513Skarels 116043364Smckusick psignal(p, SIGSYS); 116144405Skarels return (EINVAL); 116239513Skarels } 1163