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*54758Storek * @(#)kern_sig.c 7.49 (Berkeley) 07/07/92 823374Smckusick */ 97421Sroot 1047540Skarels #define SIGPROP /* include signal properties table */ 1117092Sbloom #include "param.h" 1247650Skarels #include "signalvar.h" 1347650Skarels #include "resourcevar.h" 1448020Smckusick #include "namei.h" 1537580Smckusick #include "vnode.h" 1617092Sbloom #include "proc.h" 1747540Skarels #include "systm.h" 1817092Sbloom #include "timeb.h" 1917092Sbloom #include "times.h" 2017092Sbloom #include "buf.h" 2117092Sbloom #include "acct.h" 2237580Smckusick #include "file.h" 2317092Sbloom #include "kernel.h" 2439513Skarels #include "wait.h" 2540807Smarc #include "ktrace.h" 267421Sroot 2749102Skarels #include "machine/cpu.h" 2849102Skarels 2947650Skarels #include "vm/vm.h" 3047650Skarels #include "kinfo_proc.h" 3147650Skarels #include "user.h" /* for coredump */ 3237581Smckusick 3317013Smckusick /* 3447540Skarels * Can process p, with pcred pc, send the signal signo to process q? 3517013Smckusick */ 3647540Skarels #define CANSIGNAL(p, pc, q, signo) \ 3747540Skarels ((pc)->pc_ucred->cr_uid == 0 || \ 3847540Skarels (pc)->p_ruid == (q)->p_cred->p_ruid || \ 3947540Skarels (pc)->pc_ucred->cr_uid == (q)->p_cred->p_ruid || \ 4047540Skarels (pc)->p_ruid == (q)->p_ucred->cr_uid || \ 4147540Skarels (pc)->pc_ucred->cr_uid == (q)->p_ucred->cr_uid || \ 4242920Skarels ((signo) == SIGCONT && (q)->p_session == (p)->p_session)) 4339513Skarels 4442920Skarels /* ARGSUSED */ 4542920Skarels sigaction(p, uap, retval) 4642920Skarels struct proc *p; 4742920Skarels register struct args { 4812882Ssam int signo; 4939513Skarels struct sigaction *nsa; 5039513Skarels struct sigaction *osa; 5142920Skarels } *uap; 5242920Skarels int *retval; 5342920Skarels { 5439513Skarels struct sigaction vec; 5539513Skarels register struct sigaction *sa; 5647540Skarels register struct sigacts *ps = p->p_sigacts; 5712882Ssam register int sig; 5839513Skarels int bit, error; 597421Sroot 6012882Ssam sig = uap->signo; 6139513Skarels if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) 6244405Skarels return (EINVAL); 6339513Skarels sa = &vec; 6439513Skarels if (uap->osa) { 6547540Skarels sa->sa_handler = ps->ps_sigact[sig]; 6647540Skarels sa->sa_mask = ps->ps_catchmask[sig]; 6718308Smckusick bit = sigmask(sig); 6839513Skarels sa->sa_flags = 0; 6947540Skarels if ((ps->ps_sigonstack & bit) != 0) 7039513Skarels sa->sa_flags |= SA_ONSTACK; 7147540Skarels if ((ps->ps_sigintr & bit) == 0) 7239513Skarels sa->sa_flags |= SA_RESTART; 7342920Skarels if (p->p_flag & SNOCLDSTOP) 7439513Skarels sa->sa_flags |= SA_NOCLDSTOP; 7539513Skarels if (error = copyout((caddr_t)sa, (caddr_t)uap->osa, 7639513Skarels sizeof (vec))) 7744405Skarels return (error); 7812951Ssam } 7939513Skarels if (uap->nsa) { 8039513Skarels if (error = copyin((caddr_t)uap->nsa, (caddr_t)sa, 8139513Skarels sizeof (vec))) 8244405Skarels return (error); 8342920Skarels setsigvec(p, sig, sa); 8412951Ssam } 8544405Skarels return (0); 867421Sroot } 877421Sroot 8842920Skarels setsigvec(p, sig, sa) 8942920Skarels register struct proc *p; 9012951Ssam int sig; 9139513Skarels register struct sigaction *sa; 9212882Ssam { 9347540Skarels register struct sigacts *ps = p->p_sigacts; 9412951Ssam register int bit; 9512882Ssam 9617153Sbloom bit = sigmask(sig); 9712882Ssam /* 9812882Ssam * Change setting atomically. 9912882Ssam */ 10017153Sbloom (void) splhigh(); 10147540Skarels ps->ps_sigact[sig] = sa->sa_handler; 10247540Skarels ps->ps_catchmask[sig] = sa->sa_mask &~ sigcantmask; 10339513Skarels if ((sa->sa_flags & SA_RESTART) == 0) 10447540Skarels ps->ps_sigintr |= bit; 10518308Smckusick else 10647540Skarels ps->ps_sigintr &= ~bit; 10739513Skarels if (sa->sa_flags & SA_ONSTACK) 10847540Skarels ps->ps_sigonstack |= bit; 10912951Ssam else 11047540Skarels ps->ps_sigonstack &= ~bit; 11152400Storek #ifdef COMPAT_SUNOS 11252400Storek if (sa->sa_flags & SA_USERTRAMP) 11352400Storek ps->ps_usertramp |= bit; 11452400Storek else 11552400Storek ps->ps_usertramp &= ~bit; 11652400Storek #endif 11739513Skarels if (sig == SIGCHLD) { 11839513Skarels if (sa->sa_flags & SA_NOCLDSTOP) 11939513Skarels p->p_flag |= SNOCLDSTOP; 12039513Skarels else 12139513Skarels p->p_flag &= ~SNOCLDSTOP; 12239513Skarels } 12339513Skarels /* 12439513Skarels * Set bit in p_sigignore for signals that are set to SIG_IGN, 12539513Skarels * and for signals set to SIG_DFL where the default is to ignore. 12639513Skarels * However, don't put SIGCONT in p_sigignore, 12739513Skarels * as we have to restart the process. 12839513Skarels */ 12939513Skarels if (sa->sa_handler == SIG_IGN || 13047540Skarels (sigprop[sig] & SA_IGNORE && sa->sa_handler == SIG_DFL)) { 13112951Ssam p->p_sig &= ~bit; /* never to be seen again */ 13239513Skarels if (sig != SIGCONT) 13339513Skarels p->p_sigignore |= bit; /* easier in psignal */ 13412951Ssam p->p_sigcatch &= ~bit; 13512882Ssam } else { 13612951Ssam p->p_sigignore &= ~bit; 13739513Skarels if (sa->sa_handler == SIG_DFL) 13812951Ssam p->p_sigcatch &= ~bit; 13912882Ssam else 14012951Ssam p->p_sigcatch |= bit; 14112882Ssam } 14212882Ssam (void) spl0(); 14312882Ssam } 14412882Ssam 14539513Skarels /* 14639513Skarels * Initialize signal state for process 0; 14739513Skarels * set to ignore signals that are ignored by default. 14839513Skarels */ 14947540Skarels void 15039513Skarels siginit(p) 15139513Skarels struct proc *p; 1527421Sroot { 15347540Skarels register int i; 15439513Skarels 15547540Skarels for (i = 0; i < NSIG; i++) 15647540Skarels if (sigprop[i] & SA_IGNORE && i != SIGCONT) 15747540Skarels p->p_sigignore |= sigmask(i); 15839513Skarels } 15939513Skarels 16039513Skarels /* 16139513Skarels * Reset signals for an exec of the specified process. 16239513Skarels */ 16347540Skarels void 16439513Skarels execsigs(p) 16539513Skarels register struct proc *p; 16639513Skarels { 16747540Skarels register struct sigacts *ps = p->p_sigacts; 16839513Skarels register int nc, mask; 16939513Skarels 17039513Skarels /* 17139513Skarels * Reset caught signals. Held signals remain held 17239513Skarels * through p_sigmask (unless they were caught, 17339513Skarels * and are now ignored by default). 17439513Skarels */ 17539513Skarels while (p->p_sigcatch) { 17639513Skarels nc = ffs((long)p->p_sigcatch); 17739513Skarels mask = sigmask(nc); 17839513Skarels p->p_sigcatch &= ~mask; 17947540Skarels if (sigprop[nc] & SA_IGNORE) { 18039513Skarels if (nc != SIGCONT) 18139513Skarels p->p_sigignore |= mask; 18239513Skarels p->p_sig &= ~mask; 18339513Skarels } 18447540Skarels ps->ps_sigact[nc] = SIG_DFL; 18539513Skarels } 18639513Skarels /* 18739513Skarels * Reset stack state to the user stack. 18839513Skarels * Clear set of signals caught on the signal stack. 18939513Skarels */ 19053218Smckusick ps->ps_sigstk.ss_flags = SA_DISABLE; 19153218Smckusick ps->ps_sigstk.ss_size = 0; 19253218Smckusick ps->ps_sigstk.ss_base = 0; 19353218Smckusick ps->ps_flags = 0; 19439513Skarels } 19539513Skarels 19639513Skarels /* 19739513Skarels * Manipulate signal mask. 19839513Skarels * Note that we receive new mask, not pointer, 19939513Skarels * and return old mask as return value; 20039513Skarels * the library stub does the rest. 20139513Skarels */ 20242920Skarels sigprocmask(p, uap, retval) 20342920Skarels register struct proc *p; 20442920Skarels struct args { 20539513Skarels int how; 20639513Skarels sigset_t mask; 20742920Skarels } *uap; 20842920Skarels int *retval; 20942920Skarels { 21039513Skarels int error = 0; 21139513Skarels 21242920Skarels *retval = p->p_sigmask; 21339513Skarels (void) splhigh(); 21439513Skarels 21539513Skarels switch (uap->how) { 21639513Skarels case SIG_BLOCK: 21739513Skarels p->p_sigmask |= uap->mask &~ sigcantmask; 21839513Skarels break; 21939513Skarels 22039513Skarels case SIG_UNBLOCK: 22139513Skarels p->p_sigmask &= ~uap->mask; 22239513Skarels break; 22339513Skarels 22439513Skarels case SIG_SETMASK: 22539513Skarels p->p_sigmask = uap->mask &~ sigcantmask; 22639513Skarels break; 22739513Skarels 22839513Skarels default: 22939513Skarels error = EINVAL; 23039513Skarels break; 23139513Skarels } 23239513Skarels (void) spl0(); 23344405Skarels return (error); 23439513Skarels } 23539513Skarels 23642920Skarels /* ARGSUSED */ 23742920Skarels sigpending(p, uap, retval) 23842920Skarels struct proc *p; 23942920Skarels void *uap; 24042920Skarels int *retval; 24139513Skarels { 24239513Skarels 24342920Skarels *retval = p->p_sig; 24444405Skarels return (0); 24539513Skarels } 24639513Skarels 24752400Storek #if defined(COMPAT_43) || defined(COMPAT_SUNOS) 24839513Skarels /* 24939513Skarels * Generalized interface signal handler, 4.3-compatible. 25039513Skarels */ 25142920Skarels /* ARGSUSED */ 25242920Skarels osigvec(p, uap, retval) 25342920Skarels struct proc *p; 25442920Skarels register struct args { 25539513Skarels int signo; 25639513Skarels struct sigvec *nsv; 25739513Skarels struct sigvec *osv; 25842920Skarels } *uap; 25942920Skarels int *retval; 26042920Skarels { 26139513Skarels struct sigvec vec; 26247540Skarels register struct sigacts *ps = p->p_sigacts; 26339513Skarels register struct sigvec *sv; 26439513Skarels register int sig; 26539513Skarels int bit, error; 26639513Skarels 26739513Skarels sig = uap->signo; 26839513Skarels if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) 26944405Skarels return (EINVAL); 27039513Skarels sv = &vec; 27139513Skarels if (uap->osv) { 27247540Skarels *(sig_t *)&sv->sv_handler = ps->ps_sigact[sig]; 27347540Skarels sv->sv_mask = ps->ps_catchmask[sig]; 27439513Skarels bit = sigmask(sig); 27539513Skarels sv->sv_flags = 0; 27647540Skarels if ((ps->ps_sigonstack & bit) != 0) 27739513Skarels sv->sv_flags |= SV_ONSTACK; 27847540Skarels if ((ps->ps_sigintr & bit) != 0) 27939513Skarels sv->sv_flags |= SV_INTERRUPT; 28052400Storek #ifndef COMPAT_SUNOS 28142920Skarels if (p->p_flag & SNOCLDSTOP) 28239513Skarels sv->sv_flags |= SA_NOCLDSTOP; 28352400Storek #endif 28439513Skarels if (error = copyout((caddr_t)sv, (caddr_t)uap->osv, 28539513Skarels sizeof (vec))) 28644405Skarels return (error); 28739513Skarels } 28839513Skarels if (uap->nsv) { 28939513Skarels if (error = copyin((caddr_t)uap->nsv, (caddr_t)sv, 29039513Skarels sizeof (vec))) 29144405Skarels return (error); 29252400Storek #ifdef COMPAT_SUNOS 29352400Storek /* 29454344Smckusick * SunOS uses this bit (4, aka SA_DISABLE) as SV_RESETHAND, 29554344Smckusick * `reset to SIG_DFL on delivery'. We have no such option 29654344Smckusick * now or ever! 29752400Storek */ 29854344Smckusick if (sv->sv_flags & SA_DISABLE) 29952400Storek return (EINVAL); 30052400Storek sv->sv_flags |= SA_USERTRAMP; 30152400Storek #endif 30239513Skarels sv->sv_flags ^= SA_RESTART; /* opposite of SV_INTERRUPT */ 30342920Skarels setsigvec(p, sig, (struct sigaction *)sv); 30439513Skarels } 30544405Skarels return (0); 30639513Skarels } 30739513Skarels 30842920Skarels osigblock(p, uap, retval) 30942920Skarels register struct proc *p; 31042920Skarels struct args { 31142920Skarels int mask; 31242920Skarels } *uap; 31342920Skarels int *retval; 31439513Skarels { 3157499Sroot 31617153Sbloom (void) splhigh(); 31742920Skarels *retval = p->p_sigmask; 31839513Skarels p->p_sigmask |= uap->mask &~ sigcantmask; 31912882Ssam (void) spl0(); 32044405Skarels return (0); 3217499Sroot } 3227499Sroot 32342920Skarels osigsetmask(p, uap, retval) 32442920Skarels struct proc *p; 32542920Skarels struct args { 32642920Skarels int mask; 32742920Skarels } *uap; 32842920Skarels int *retval; 3297499Sroot { 3307499Sroot 33117153Sbloom (void) splhigh(); 33242920Skarels *retval = p->p_sigmask; 33339513Skarels p->p_sigmask = uap->mask &~ sigcantmask; 33412882Ssam (void) spl0(); 33544405Skarels return (0); 3367499Sroot } 33754344Smckusick #endif /* COMPAT_43 || COMPAT_SUNOS */ 3387499Sroot 33939513Skarels /* 34039513Skarels * Suspend process until signal, providing mask to be set 34139513Skarels * in the meantime. Note nonstandard calling convention: 34239513Skarels * libc stub passes mask, not pointer, to save a copyin. 34339513Skarels */ 34442920Skarels /* ARGSUSED */ 34542920Skarels sigsuspend(p, uap, retval) 34642920Skarels register struct proc *p; 34742920Skarels struct args { 34842920Skarels sigset_t mask; 34942920Skarels } *uap; 35042920Skarels int *retval; 3517499Sroot { 35247540Skarels register struct sigacts *ps = p->p_sigacts; 3537499Sroot 35412882Ssam /* 35512882Ssam * When returning from sigpause, we want 35612882Ssam * the old mask to be restored after the 35712882Ssam * signal handler has finished. Thus, we 35852115Skarels * save it here and mark the sigacts structure 35952115Skarels * to indicate this. 36012882Ssam */ 36147540Skarels ps->ps_oldmask = p->p_sigmask; 36253218Smckusick ps->ps_flags |= SAS_OLDMASK; 36339513Skarels p->p_sigmask = uap->mask &~ sigcantmask; 36447540Skarels (void) tsleep((caddr_t) ps, PPAUSE|PCATCH, "pause", 0); 36540807Smarc /* always return EINTR rather than ERESTART... */ 36644405Skarels return (EINTR); 3677499Sroot } 3687499Sroot 36954344Smckusick #if defined(COMPAT_43) || defined(COMPAT_SUNOS) 37042920Skarels /* ARGSUSED */ 37153218Smckusick osigstack(p, uap, retval) 37242920Skarels struct proc *p; 37342920Skarels register struct args { 37412951Ssam struct sigstack *nss; 37512951Ssam struct sigstack *oss; 37642920Skarels } *uap; 37742920Skarels int *retval; 37842920Skarels { 37912951Ssam struct sigstack ss; 38053218Smckusick struct sigacts *psp; 38139513Skarels int error = 0; 3827499Sroot 38353218Smckusick psp = p->p_sigacts; 38453218Smckusick ss.ss_sp = psp->ps_sigstk.ss_base; 38553218Smckusick ss.ss_onstack = psp->ps_sigstk.ss_flags & SA_ONSTACK; 38653218Smckusick if (uap->oss && (error = copyout((caddr_t)&ss, (caddr_t)uap->oss, 38753218Smckusick sizeof (struct sigstack)))) 38844405Skarels return (error); 38939513Skarels if (uap->nss && (error = copyin((caddr_t)uap->nss, (caddr_t)&ss, 39053218Smckusick sizeof (ss))) == 0) { 39153218Smckusick psp->ps_sigstk.ss_base = ss.ss_sp; 39253218Smckusick psp->ps_sigstk.ss_size = 0; 39353218Smckusick psp->ps_sigstk.ss_flags |= ss.ss_onstack & SA_ONSTACK; 39453218Smckusick psp->ps_flags |= SAS_ALTSTACK; 39553218Smckusick } 39644405Skarels return (error); 3977499Sroot } 39854344Smckusick #endif /* COMPAT_43 || COMPAT_SUNOS */ 3997499Sroot 40042920Skarels /* ARGSUSED */ 40153218Smckusick sigaltstack(p, uap, retval) 40253218Smckusick struct proc *p; 40353218Smckusick register struct args { 40453218Smckusick struct sigaltstack *nss; 40553218Smckusick struct sigaltstack *oss; 40653218Smckusick } *uap; 40753218Smckusick int *retval; 40853218Smckusick { 40953218Smckusick struct sigacts *psp; 41053218Smckusick struct sigaltstack ss; 41153218Smckusick int error; 41253218Smckusick 41353218Smckusick psp = p->p_sigacts; 41453218Smckusick if ((psp->ps_flags & SAS_ALTSTACK) == 0) 41553218Smckusick psp->ps_sigstk.ss_flags |= SA_DISABLE; 41653218Smckusick if (uap->oss && (error = copyout((caddr_t)&psp->ps_sigstk, 41753218Smckusick (caddr_t)uap->oss, sizeof (struct sigaltstack)))) 41853218Smckusick return (error); 41954464Smckusick if (uap->nss == 0) 42054464Smckusick return (0); 42154464Smckusick if (error = copyin((caddr_t)uap->nss, (caddr_t)&ss, sizeof (ss))) 42253218Smckusick return (error); 42353218Smckusick if (ss.ss_flags & SA_DISABLE) { 42453218Smckusick if (psp->ps_sigstk.ss_flags & SA_ONSTACK) 42553218Smckusick return (EINVAL); 42653218Smckusick psp->ps_flags &= ~SAS_ALTSTACK; 42753218Smckusick psp->ps_sigstk.ss_flags = ss.ss_flags; 42853218Smckusick return (0); 42953218Smckusick } 43053218Smckusick if (ss.ss_size < MINSIGSTKSZ) 43153218Smckusick return (ENOMEM); 43253218Smckusick psp->ps_flags |= SAS_ALTSTACK; 43353218Smckusick psp->ps_sigstk= ss; 43453218Smckusick return (0); 43553218Smckusick } 43653218Smckusick 43753218Smckusick /* ARGSUSED */ 43842920Skarels kill(cp, uap, retval) 43942920Skarels register struct proc *cp; 44042920Skarels register struct args { 44112882Ssam int pid; 44212882Ssam int signo; 44342920Skarels } *uap; 44442920Skarels int *retval; 44542920Skarels { 44618336Smckusick register struct proc *p; 44747540Skarels register struct pcred *pc = cp->p_cred; 4488032Sroot 44939513Skarels if ((unsigned) uap->signo >= NSIG) 45044405Skarels return (EINVAL); 45118336Smckusick if (uap->pid > 0) { 45218336Smckusick /* kill single process */ 45318336Smckusick p = pfind(uap->pid); 45439513Skarels if (p == 0) 45544405Skarels return (ESRCH); 45647540Skarels if (!CANSIGNAL(cp, pc, p, uap->signo)) 45744405Skarels return (EPERM); 45839513Skarels if (uap->signo) 45918336Smckusick psignal(p, uap->signo); 46044405Skarels return (0); 46118336Smckusick } 46218336Smckusick switch (uap->pid) { 46318336Smckusick case -1: /* broadcast signal */ 46444405Skarels return (killpg1(cp, uap->signo, 0, 1)); 46518336Smckusick case 0: /* signal own process group */ 46644405Skarels return (killpg1(cp, uap->signo, 0, 0)); 46718336Smckusick default: /* negative explicit process group */ 46844405Skarels return (killpg1(cp, uap->signo, -uap->pid, 0)); 46918336Smckusick } 47039513Skarels /* NOTREACHED */ 4718032Sroot } 4728032Sroot 47352400Storek #if defined(COMPAT_43) || defined(COMPAT_SUNOS) 47442920Skarels /* ARGSUSED */ 47542920Skarels okillpg(p, uap, retval) 47642920Skarels struct proc *p; 47742920Skarels register struct args { 47837581Smckusick int pgid; 4799989Ssam int signo; 48042920Skarels } *uap; 48142920Skarels int *retval; 48242920Skarels { 4838032Sroot 48439513Skarels if ((unsigned) uap->signo >= NSIG) 48544405Skarels return (EINVAL); 48644405Skarels return (killpg1(p, uap->signo, uap->pgid, 0)); 4878032Sroot } 48854344Smckusick #endif /* COMPAT_43 || COMPAT_SUNOS */ 4898032Sroot 49042920Skarels /* 49142920Skarels * Common code for kill process group/broadcast kill. 49242920Skarels * cp is calling process. 49342920Skarels */ 49442920Skarels killpg1(cp, signo, pgid, all) 49542920Skarels register struct proc *cp; 49637581Smckusick int signo, pgid, all; 4979989Ssam { 4989989Ssam register struct proc *p; 49947540Skarels register struct pcred *pc = cp->p_cred; 50037581Smckusick struct pgrp *pgrp; 50147540Skarels int nfound = 0; 50237581Smckusick 50337581Smckusick if (all) 50437581Smckusick /* 50537581Smckusick * broadcast 5067421Sroot */ 507*54758Storek for (p = (struct proc *)allproc; p != NULL; p = p->p_nxt) { 50847540Skarels if (p->p_pid <= 1 || p->p_flag&SSYS || 50947540Skarels p == cp || !CANSIGNAL(cp, pc, p, signo)) 51037581Smckusick continue; 51147540Skarels nfound++; 51237581Smckusick if (signo) 51337581Smckusick psignal(p, signo); 51437581Smckusick } 51537581Smckusick else { 51637581Smckusick if (pgid == 0) 51737581Smckusick /* 51837581Smckusick * zero pgid means send to my process group. 51937581Smckusick */ 52047540Skarels pgrp = cp->p_pgrp; 52137581Smckusick else { 52237581Smckusick pgrp = pgfind(pgid); 52337581Smckusick if (pgrp == NULL) 52439513Skarels return (ESRCH); 52537581Smckusick } 52637581Smckusick for (p = pgrp->pg_mem; p != NULL; p = p->p_pgrpnxt) { 52747540Skarels if (p->p_pid <= 1 || p->p_flag&SSYS || 52850128Skarels p->p_stat == SZOMB || !CANSIGNAL(cp, pc, p, signo)) 52937581Smckusick continue; 53047540Skarels nfound++; 53137581Smckusick if (signo) 53237581Smckusick psignal(p, signo); 53318336Smckusick } 5347421Sroot } 53547540Skarels return (nfound ? 0 : ESRCH); 5367421Sroot } 5377421Sroot 53842920Skarels /* 5397421Sroot * Send the specified signal to 54037581Smckusick * all processes with 'pgid' as 5417421Sroot * process group. 5427421Sroot */ 54347540Skarels void 54437581Smckusick gsignal(pgid, sig) 54547540Skarels int pgid, sig; 5467421Sroot { 54739513Skarels struct pgrp *pgrp; 5487421Sroot 54939513Skarels if (pgid && (pgrp = pgfind(pgid))) 55042207Smarc pgsignal(pgrp, sig, 0); 5517421Sroot } 55242920Skarels 55340807Smarc /* 55442207Smarc * Send sig to every member of a process group. 55542207Smarc * If checktty is 1, limit to members which have a controlling 55642207Smarc * terminal. 55740807Smarc */ 55847540Skarels void 55942207Smarc pgsignal(pgrp, sig, checkctty) 56039513Skarels struct pgrp *pgrp; 56147540Skarels int sig, checkctty; 56237581Smckusick { 56337581Smckusick register struct proc *p; 56437581Smckusick 56540807Smarc if (pgrp) 56640807Smarc for (p = pgrp->pg_mem; p != NULL; p = p->p_pgrpnxt) 56742207Smarc if (checkctty == 0 || p->p_flag&SCTTY) 56842207Smarc psignal(p, sig); 56937581Smckusick } 57037581Smckusick 5717421Sroot /* 57239513Skarels * Send a signal caused by a trap to the current process. 57339513Skarels * If it will be caught immediately, deliver it with correct code. 57439513Skarels * Otherwise, post it normally. 57539513Skarels */ 57647540Skarels void 57747540Skarels trapsignal(p, sig, code) 57847540Skarels struct proc *p; 57939513Skarels register int sig; 58039513Skarels unsigned code; 58139513Skarels { 58247540Skarels register struct sigacts *ps = p->p_sigacts; 58339513Skarels int mask; 58439513Skarels 58539513Skarels mask = sigmask(sig); 58639513Skarels if ((p->p_flag & STRC) == 0 && (p->p_sigcatch & mask) != 0 && 58739513Skarels (p->p_sigmask & mask) == 0) { 58847540Skarels p->p_stats->p_ru.ru_nsignals++; 58940807Smarc #ifdef KTRACE 59040807Smarc if (KTRPOINT(p, KTR_PSIG)) 59147540Skarels ktrpsig(p->p_tracep, sig, ps->ps_sigact[sig], 59240807Smarc p->p_sigmask, code); 59340807Smarc #endif 59447540Skarels sendsig(ps->ps_sigact[sig], sig, p->p_sigmask, code); 59547540Skarels p->p_sigmask |= ps->ps_catchmask[sig] | mask; 59639513Skarels } else { 59747540Skarels ps->ps_code = code; /* XXX for core dump/debugger */ 59839513Skarels psignal(p, sig); 59939513Skarels } 60039513Skarels } 60139513Skarels 60239513Skarels /* 60340807Smarc * Send the specified signal to the specified process. 60447540Skarels * If the signal has an action, the action is usually performed 60547540Skarels * by the target process rather than the caller; we simply add 60647540Skarels * the signal to the set of pending signals for the process. 60740807Smarc * Exceptions: 60840807Smarc * o When a stop signal is sent to a sleeping process that takes the default 60940807Smarc * action, the process is stopped without awakening it. 61040807Smarc * o SIGCONT restarts stopped processes (or puts them back to sleep) 61140807Smarc * regardless of the signal action (eg, blocked or ignored). 61240807Smarc * Other ignored signals are discarded immediately. 6137421Sroot */ 61447540Skarels void 6157421Sroot psignal(p, sig) 6167421Sroot register struct proc *p; 6177421Sroot register int sig; 6187421Sroot { 61947540Skarels register int s, prop; 62039513Skarels register sig_t action; 62117153Sbloom int mask; 6227421Sroot 62339513Skarels if ((unsigned)sig >= NSIG || sig == 0) 62439513Skarels panic("psignal sig"); 62517153Sbloom mask = sigmask(sig); 62647540Skarels prop = sigprop[sig]; 6277421Sroot 6287421Sroot /* 6297421Sroot * If proc is traced, always give parent a chance. 6307421Sroot */ 6317421Sroot if (p->p_flag & STRC) 6327421Sroot action = SIG_DFL; 6337421Sroot else { 6347421Sroot /* 63512882Ssam * If the signal is being ignored, 63612882Ssam * then we forget about it immediately. 63739513Skarels * (Note: we don't set SIGCONT in p_sigignore, 63839513Skarels * and if it is set to SIG_IGN, 63939513Skarels * action will be SIG_DFL here.) 6407421Sroot */ 64117153Sbloom if (p->p_sigignore & mask) 6427421Sroot return; 64317153Sbloom if (p->p_sigmask & mask) 64412882Ssam action = SIG_HOLD; 64517153Sbloom else if (p->p_sigcatch & mask) 64612882Ssam action = SIG_CATCH; 64742437Skarels else 64812882Ssam action = SIG_DFL; 6497421Sroot } 6507421Sroot 65147540Skarels if (p->p_nice > NZERO && (sig == SIGKILL || 65247540Skarels sig == SIGTERM && (p->p_flag&STRC || action != SIG_DFL))) 65347540Skarels p->p_nice = NZERO; 6547421Sroot 65547540Skarels if (prop & SA_CONT) 65639513Skarels p->p_sig &= ~stopsigmask; 65739513Skarels 65847540Skarels if (prop & SA_STOP) { 65945672Skarels /* 66045672Skarels * If sending a tty stop signal to a member of an orphaned 66145672Skarels * process group, discard the signal here if the action 66245672Skarels * is default; don't stop the process below if sleeping, 66345672Skarels * and don't clear any pending SIGCONT. 66445672Skarels */ 66547540Skarels if (prop & SA_TTYSTOP && p->p_pgrp->pg_jobc == 0 && 66647540Skarels action == SIG_DFL) 66745741Smckusick return; 66847540Skarels p->p_sig &= ~contsigmask; 6697421Sroot } 67039513Skarels p->p_sig |= mask; 67139513Skarels 6727421Sroot /* 67339513Skarels * Defer further processing for signals which are held, 67439513Skarels * except that stopped processes must be continued by SIGCONT. 6757421Sroot */ 67647540Skarels if (action == SIG_HOLD && ((prop & SA_CONT) == 0 || p->p_stat != SSTOP)) 6777421Sroot return; 67817153Sbloom s = splhigh(); 6797421Sroot switch (p->p_stat) { 6807421Sroot 6817421Sroot case SSLEEP: 6827421Sroot /* 68340807Smarc * If process is sleeping uninterruptibly 6847421Sroot * we can't interrupt the sleep... the signal will 6857421Sroot * be noticed when the process returns through 6867421Sroot * trap() or syscall(). 6877421Sroot */ 68840807Smarc if ((p->p_flag & SSINTR) == 0) 6897421Sroot goto out; 6907421Sroot /* 6917421Sroot * Process is sleeping and traced... make it runnable 6927421Sroot * so it can discover the signal in issig() and stop 6937421Sroot * for the parent. 6947421Sroot */ 6957421Sroot if (p->p_flag&STRC) 6967421Sroot goto run; 69739513Skarels /* 69839513Skarels * When a sleeping process receives a stop 69939513Skarels * signal, process immediately if possible. 70039513Skarels * All other (caught or default) signals 70139513Skarels * cause the process to run. 70239513Skarels */ 70347540Skarels if (prop & SA_STOP) { 7047421Sroot if (action != SIG_DFL) 70539513Skarels goto runfast; 7067421Sroot /* 70747540Skarels * If a child holding parent blocked, 70847540Skarels * stopping could cause deadlock. 7097421Sroot */ 71047540Skarels if (p->p_flag&SPPWAIT) 7117421Sroot goto out; 71217153Sbloom p->p_sig &= ~mask; 71343895Skarels p->p_xstat = sig; 71439513Skarels if ((p->p_pptr->p_flag & SNOCLDSTOP) == 0) 71539513Skarels psignal(p->p_pptr, SIGCHLD); 7167421Sroot stop(p); 7177421Sroot goto out; 71839513Skarels } else 71939513Skarels goto runfast; 7207421Sroot /*NOTREACHED*/ 7217421Sroot 7227421Sroot case SSTOP: 7237421Sroot /* 7247421Sroot * If traced process is already stopped, 7257421Sroot * then no further action is necessary. 7267421Sroot */ 7277421Sroot if (p->p_flag&STRC) 7287421Sroot goto out; 7297421Sroot 73047540Skarels /* 73147540Skarels * Kill signal always sets processes running. 73247540Skarels */ 73347540Skarels if (sig == SIGKILL) 73439513Skarels goto runfast; 7357421Sroot 73647540Skarels if (prop & SA_CONT) { 7377421Sroot /* 73839513Skarels * If SIGCONT is default (or ignored), we continue 73939513Skarels * the process but don't leave the signal in p_sig, 74039513Skarels * as it has no further action. If SIGCONT is held, 74139513Skarels * continue the process and leave the signal in p_sig. 7427421Sroot * If the process catches SIGCONT, let it handle 7437421Sroot * the signal itself. If it isn't waiting on 7447421Sroot * an event, then it goes back to run state. 7457421Sroot * Otherwise, process goes back to sleep state. 7467421Sroot */ 74739513Skarels if (action == SIG_DFL) 74839513Skarels p->p_sig &= ~mask; 74939513Skarels if (action == SIG_CATCH) 75039513Skarels goto runfast; 75139513Skarels if (p->p_wchan == 0) 7527421Sroot goto run; 7537421Sroot p->p_stat = SSLEEP; 7547421Sroot goto out; 75547540Skarels } 7567421Sroot 75747540Skarels if (prop & SA_STOP) { 7587421Sroot /* 7597421Sroot * Already stopped, don't need to stop again. 7607421Sroot * (If we did the shell could get confused.) 7617421Sroot */ 76217153Sbloom p->p_sig &= ~mask; /* take it away */ 7637421Sroot goto out; 7647421Sroot } 7657421Sroot 76647540Skarels /* 76747540Skarels * If process is sleeping interruptibly, then 76847540Skarels * simulate a wakeup so that when it is continued, 76947540Skarels * it will be made runnable and can look at the signal. 77047540Skarels * But don't setrun the process, leave it stopped. 77147540Skarels */ 77247540Skarels if (p->p_wchan && p->p_flag & SSINTR) 77347540Skarels unsleep(p); 77447540Skarels goto out; 77547540Skarels 7767421Sroot default: 7777421Sroot /* 7787421Sroot * SRUN, SIDL, SZOMB do nothing with the signal, 7797421Sroot * other than kicking ourselves if we are running. 7807421Sroot * It will either never be noticed, or noticed very soon. 7817421Sroot */ 78247650Skarels if (p == curproc) 78349102Skarels signotify(p); 7847421Sroot goto out; 7857421Sroot } 7867421Sroot /*NOTREACHED*/ 78739513Skarels 78839513Skarels runfast: 7897421Sroot /* 7907421Sroot * Raise priority to at least PUSER. 7917421Sroot */ 7927421Sroot if (p->p_pri > PUSER) 79317399Skarels p->p_pri = PUSER; 79439513Skarels run: 7957421Sroot setrun(p); 7967421Sroot out: 7977421Sroot splx(s); 7987421Sroot } 7997421Sroot 8007421Sroot /* 80140807Smarc * If the current process has a signal to process (should be caught 80240807Smarc * or cause termination, should interrupt current syscall), 80340807Smarc * return the signal number. Stop signals with default action 80440807Smarc * are processed immediately, then cleared; they aren't returned. 80547540Skarels * This is checked after each entry to the system for a syscall 80647540Skarels * or trap (though this can usually be done without actually calling 80747540Skarels * issig by checking the pending signal masks in the CURSIG macro.) 80847540Skarels * The normal call sequence is 80947540Skarels * 81047540Skarels * while (sig = CURSIG(curproc)) 81147540Skarels * psig(sig); 8127421Sroot */ 81347540Skarels issig(p) 81447540Skarels register struct proc *p; 8157421Sroot { 81647540Skarels register int sig, mask, prop; 8177421Sroot 8187421Sroot for (;;) { 81939513Skarels mask = p->p_sig &~ p->p_sigmask; 82047540Skarels if (p->p_flag&SPPWAIT) 82139513Skarels mask &= ~stopsigmask; 82240807Smarc if (mask == 0) /* no signal to send */ 82340807Smarc return (0); 82439513Skarels sig = ffs((long)mask); 82517153Sbloom mask = sigmask(sig); 82647540Skarels prop = sigprop[sig]; 82740807Smarc /* 82840807Smarc * We should see pending but ignored signals 82940807Smarc * only if STRC was on when they were posted. 83040807Smarc */ 83140807Smarc if (mask & p->p_sigignore && (p->p_flag&STRC) == 0) { 83240807Smarc p->p_sig &= ~mask; 83340807Smarc continue; 83440807Smarc } 83547540Skarels if (p->p_flag&STRC && (p->p_flag&SPPWAIT) == 0) { 8367421Sroot /* 8377421Sroot * If traced, always stop, and stay 8387421Sroot * stopped until released by the parent. 8397421Sroot */ 84043895Skarels p->p_xstat = sig; 84118331Skarels psignal(p->p_pptr, SIGCHLD); 8427421Sroot do { 8437421Sroot stop(p); 8447421Sroot swtch(); 84542926Smckusick } while (!procxmt(p) && p->p_flag&STRC); 8467421Sroot 8477421Sroot /* 84814782Ssam * If the traced bit got turned off, 84940807Smarc * go back up to the top to rescan signals. 85047650Skarels * This ensures that p_sig* and ps_sigact 85147650Skarels * are consistent. 8527421Sroot */ 85340807Smarc if ((p->p_flag&STRC) == 0) 8547421Sroot continue; 8557421Sroot 8567421Sroot /* 8577421Sroot * If parent wants us to take the signal, 85843895Skarels * then it will leave it in p->p_xstat; 8597421Sroot * otherwise we just look for signals again. 8607421Sroot */ 86140807Smarc p->p_sig &= ~mask; /* clear the old signal */ 86243895Skarels sig = p->p_xstat; 8637421Sroot if (sig == 0) 8647421Sroot continue; 86514782Ssam 86614782Ssam /* 86740807Smarc * Put the new signal into p_sig. 86840807Smarc * If signal is being masked, 86940807Smarc * look for other signals. 87014782Ssam */ 87117153Sbloom mask = sigmask(sig); 87240807Smarc p->p_sig |= mask; 87340807Smarc if (p->p_sigmask & mask) 87414782Ssam continue; 8757421Sroot } 87640807Smarc 87740807Smarc /* 87840807Smarc * Decide whether the signal should be returned. 87940807Smarc * Return the signal's number, or fall through 88040807Smarc * to clear it from the pending mask. 88140807Smarc */ 88247540Skarels switch ((int)p->p_sigacts->ps_sigact[sig]) { 8837421Sroot 8847421Sroot case SIG_DFL: 8857421Sroot /* 8867421Sroot * Don't take default actions on system processes. 8877421Sroot */ 88851019Sralph if (p->p_pid <= 1) { 88951019Sralph #ifdef DIAGNOSTIC 89051019Sralph /* 89151019Sralph * Are you sure you want to ignore SIGSEGV 89251019Sralph * in init? XXX 89351019Sralph */ 89451019Sralph printf("Process (pid %d) got signal %d\n", 89551019Sralph p->p_pid, sig); 89651019Sralph #endif 89740807Smarc break; /* == ignore */ 89851019Sralph } 89940807Smarc /* 90040807Smarc * If there is a pending stop signal to process 90140807Smarc * with default action, stop here, 90242437Skarels * then clear the signal. However, 90342437Skarels * if process is member of an orphaned 90442437Skarels * process group, ignore tty stop signals. 90540807Smarc */ 90647540Skarels if (prop & SA_STOP) { 90742437Skarels if (p->p_flag&STRC || 90842437Skarels (p->p_pgrp->pg_jobc == 0 && 90947540Skarels prop & SA_TTYSTOP)) 91040807Smarc break; /* == ignore */ 91143895Skarels p->p_xstat = sig; 9127421Sroot stop(p); 91339513Skarels if ((p->p_pptr->p_flag & SNOCLDSTOP) == 0) 91439513Skarels psignal(p->p_pptr, SIGCHLD); 9157421Sroot swtch(); 91640807Smarc break; 91747540Skarels } else if (prop & SA_IGNORE) { 9187421Sroot /* 91939513Skarels * Except for SIGCONT, shouldn't get here. 92039513Skarels * Default action is to ignore; drop it. 9217421Sroot */ 92240807Smarc break; /* == ignore */ 92339513Skarels } else 92440807Smarc return (sig); 9257421Sroot /*NOTREACHED*/ 9267421Sroot 9277421Sroot case SIG_IGN: 9287421Sroot /* 92939513Skarels * Masking above should prevent us ever trying 93039513Skarels * to take action on an ignored signal other 93139513Skarels * than SIGCONT, unless process is traced. 9327421Sroot */ 93347540Skarels if ((prop & SA_CONT) == 0 && (p->p_flag&STRC) == 0) 9347421Sroot printf("issig\n"); 93540807Smarc break; /* == ignore */ 9367421Sroot 9377421Sroot default: 9387421Sroot /* 9397421Sroot * This signal has an action, let 9407421Sroot * psig process it. 9417421Sroot */ 94240807Smarc return (sig); 9437421Sroot } 94440807Smarc p->p_sig &= ~mask; /* take the signal! */ 9457421Sroot } 94640807Smarc /* NOTREACHED */ 9477421Sroot } 9487421Sroot 9497421Sroot /* 9507421Sroot * Put the argument process into the stopped 95118331Skarels * state and notify the parent via wakeup. 95218331Skarels * Signals are handled elsewhere. 95340807Smarc * The process must not be on the run queue. 9547421Sroot */ 9557421Sroot stop(p) 9567421Sroot register struct proc *p; 9577421Sroot { 9587421Sroot 9597421Sroot p->p_stat = SSTOP; 9607421Sroot p->p_flag &= ~SWTED; 9617421Sroot wakeup((caddr_t)p->p_pptr); 9627421Sroot } 9637421Sroot 9647421Sroot /* 96547540Skarels * Take the action for the specified signal 96647540Skarels * from the current set of pending signals. 9677421Sroot */ 96847540Skarels void 96940807Smarc psig(sig) 97040807Smarc register int sig; 9717421Sroot { 97247540Skarels register struct proc *p = curproc; 97347540Skarels register struct sigacts *ps = p->p_sigacts; 97447540Skarels register sig_t action; 97539513Skarels int mask, returnmask; 9767421Sroot 97740807Smarc #ifdef DIAGNOSTIC 97847540Skarels if (sig == 0) 97947540Skarels panic("psig"); 98040807Smarc #endif 98147540Skarels mask = sigmask(sig); 98247540Skarels p->p_sig &= ~mask; 98347540Skarels action = ps->ps_sigact[sig]; 98440807Smarc #ifdef KTRACE 98547540Skarels if (KTRPOINT(p, KTR_PSIG)) 98653218Smckusick ktrpsig(p->p_tracep, sig, action, ps->ps_flags & SAS_OLDMASK ? 98747540Skarels ps->ps_oldmask : p->p_sigmask, 0); 98840807Smarc #endif 98947540Skarels if (action == SIG_DFL) { 99047540Skarels /* 99147540Skarels * Default action, where the default is to kill 99247540Skarels * the process. (Other cases were ignored above.) 99347540Skarels */ 99447650Skarels sigexit(p, sig); 99547540Skarels /* NOTREACHED */ 99647540Skarels } else { 99747540Skarels /* 99847540Skarels * If we get here, the signal must be caught. 99947540Skarels */ 100039513Skarels #ifdef DIAGNOSTIC 100147540Skarels if (action == SIG_IGN || (p->p_sigmask & mask)) 100247540Skarels panic("psig action"); 100339513Skarels #endif 100447540Skarels /* 100547540Skarels * Set the new mask value and also defer further 100647540Skarels * occurences of this signal. 100747540Skarels * 100847540Skarels * Special case: user has done a sigpause. Here the 100947540Skarels * current mask is not of interest, but rather the 101047540Skarels * mask from before the sigpause is what we want 101147540Skarels * restored after the signal processing is completed. 101247540Skarels */ 101347540Skarels (void) splhigh(); 101453218Smckusick if (ps->ps_flags & SAS_OLDMASK) { 101547540Skarels returnmask = ps->ps_oldmask; 101653218Smckusick ps->ps_flags &= ~SAS_OLDMASK; 101747540Skarels } else 101847540Skarels returnmask = p->p_sigmask; 101947540Skarels p->p_sigmask |= ps->ps_catchmask[sig] | mask; 102047540Skarels (void) spl0(); 102147540Skarels p->p_stats->p_ru.ru_nsignals++; 102247540Skarels sendsig(action, sig, returnmask, 0); 102347540Skarels } 10247421Sroot } 10257421Sroot 10267421Sroot /* 102747650Skarels * Force the current process to exit with the specified 102847650Skarels * signal, dumping core if appropriate. We bypass the normal 102947650Skarels * tests for masked and caught signals, allowing unrecoverable 103047650Skarels * failures to terminate the process without changing signal state. 103147650Skarels * Mark the accounting record with the signal termination. 103247650Skarels * If dumping core, save the signal number for the debugger. 103347650Skarels * Calls exit and does not return. 103447650Skarels */ 103547650Skarels sigexit(p, sig) 103647650Skarels register struct proc *p; 103747650Skarels int sig; 103847650Skarels { 103947650Skarels 104047650Skarels p->p_acflag |= AXSIG; 104147650Skarels if (sigprop[sig] & SA_CORE) { 104247650Skarels p->p_sigacts->ps_sig = sig; 104347650Skarels if (coredump(p) == 0) 104447650Skarels sig |= WCOREFLAG; 104547650Skarels } 104647650Skarels exit(p, W_EXITCODE(0, sig)); 104747650Skarels /* NOTREACHED */ 104847650Skarels } 104947650Skarels 105047650Skarels /* 105147540Skarels * Create a core dump. 105250244Skarels * The file name is "core.progname". 105350099Smckusick * Core dumps are not created if the process is setuid. 10547421Sroot */ 105547540Skarels coredump(p) 105647540Skarels register struct proc *p; 10577421Sroot { 105837728Smckusick register struct vnode *vp; 105947540Skarels register struct pcred *pcred = p->p_cred; 106047540Skarels register struct ucred *cred = pcred->pc_ucred; 106147540Skarels register struct vmspace *vm = p->p_vmspace; 106237580Smckusick struct vattr vattr; 106350105Smckusick int error, error1; 106447540Skarels struct nameidata nd; 106550244Skarels char name[MAXCOMLEN+6]; /* core.progname */ 10667421Sroot 106747540Skarels if (pcred->p_svuid != pcred->p_ruid || 106847540Skarels pcred->p_svgid != pcred->p_rgid) 106937580Smckusick return (EFAULT); 107047540Skarels if (ctob(UPAGES + vm->vm_dsize + vm->vm_ssize) >= 107147540Skarels p->p_rlimit[RLIMIT_CORE].rlim_cur) 107237580Smckusick return (EFAULT); 107350244Skarels sprintf(name, "core.%s", p->p_comm); 107452304Sheideman NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, name, p); 107552304Sheideman if (error = vn_open(&nd, O_CREAT|FWRITE, 0644)) 107637580Smckusick return (error); 107747540Skarels vp = nd.ni_vp; 107848020Smckusick if (vp->v_type != VREG || VOP_GETATTR(vp, &vattr, cred, p) || 107937580Smckusick vattr.va_nlink != 1) { 108050105Smckusick error = EFAULT; 108150105Smckusick goto out; 10827818Sroot } 108341362Smckusick VATTR_NULL(&vattr); 108437580Smckusick vattr.va_size = 0; 108552183Smckusick LEASE_CHECK(vp, p, cred, LEASE_WRITE); 108648020Smckusick VOP_SETATTR(vp, &vattr, cred, p); 108747540Skarels p->p_acflag |= ACORE; 108849102Skarels bcopy(p, &p->p_addr->u_kproc.kp_proc, sizeof(struct proc)); 108949102Skarels fill_eproc(p, &p->p_addr->u_kproc.kp_eproc); 109052925Smckusick error = cpu_coredump(p, vp, cred); 109137580Smckusick if (error == 0) 109247540Skarels error = vn_rdwr(UIO_WRITE, vp, vm->vm_daddr, 109347540Skarels (int)ctob(vm->vm_dsize), (off_t)ctob(UPAGES), UIO_USERSPACE, 109449102Skarels IO_NODELOCKED|IO_UNIT, cred, (int *) NULL, p); 109537580Smckusick if (error == 0) 109637580Smckusick error = vn_rdwr(UIO_WRITE, vp, 109749102Skarels (caddr_t) trunc_page(USRSTACK - ctob(vm->vm_ssize)), 109847540Skarels round_page(ctob(vm->vm_ssize)), 109947540Skarels (off_t)ctob(UPAGES) + ctob(vm->vm_dsize), UIO_USERSPACE, 110049102Skarels IO_NODELOCKED|IO_UNIT, cred, (int *) NULL, p); 110150105Smckusick out: 110250105Smckusick VOP_UNLOCK(vp); 110350105Smckusick error1 = vn_close(vp, FWRITE, cred, p); 110450244Skarels if (error == 0) 110550105Smckusick error = error1; 110637580Smckusick return (error); 11077421Sroot } 110839513Skarels 110939513Skarels /* 111039513Skarels * Nonexistent system call-- signal process (may want to handle it). 111139513Skarels * Flag error in case process won't see signal immediately (blocked or ignored). 111239513Skarels */ 111343364Smckusick /* ARGSUSED */ 111443364Smckusick nosys(p, args, retval) 111543364Smckusick struct proc *p; 111643364Smckusick void *args; 111743364Smckusick int *retval; 111839513Skarels { 111939513Skarels 112043364Smckusick psignal(p, SIGSYS); 112144405Skarels return (EINVAL); 112239513Skarels } 1123