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*56517Sbostic * @(#)kern_sig.c 7.51 (Berkeley) 10/11/92 823374Smckusick */ 97421Sroot 1047540Skarels #define SIGPROP /* include signal properties table */ 11*56517Sbostic #include <sys/param.h> 12*56517Sbostic #include <sys/signalvar.h> 13*56517Sbostic #include <sys/resourcevar.h> 14*56517Sbostic #include <sys/namei.h> 15*56517Sbostic #include <sys/vnode.h> 16*56517Sbostic #include <sys/proc.h> 17*56517Sbostic #include <sys/systm.h> 18*56517Sbostic #include <sys/timeb.h> 19*56517Sbostic #include <sys/times.h> 20*56517Sbostic #include <sys/buf.h> 21*56517Sbostic #include <sys/acct.h> 22*56517Sbostic #include <sys/file.h> 23*56517Sbostic #include <sys/kernel.h> 24*56517Sbostic #include <sys/wait.h> 25*56517Sbostic #include <sys/ktrace.h> 267421Sroot 27*56517Sbostic #include <machine/cpu.h> 2849102Skarels 29*56517Sbostic #include <vm/vm.h> 30*56517Sbostic #include <sys/kinfo_proc.h> 31*56517Sbostic #include <sys/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 4454926Storek struct sigaction_args { 4554926Storek int signo; 4654926Storek struct sigaction *nsa; 4754926Storek struct sigaction *osa; 4854926Storek }; 4942920Skarels /* ARGSUSED */ 5042920Skarels sigaction(p, uap, retval) 5142920Skarels struct proc *p; 5254926Storek register struct sigaction_args *uap; 5342920Skarels int *retval; 5442920Skarels { 5539513Skarels struct sigaction vec; 5639513Skarels register struct sigaction *sa; 5747540Skarels register struct sigacts *ps = p->p_sigacts; 5812882Ssam register int sig; 5939513Skarels int bit, error; 607421Sroot 6112882Ssam sig = uap->signo; 6239513Skarels if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) 6344405Skarels return (EINVAL); 6439513Skarels sa = &vec; 6539513Skarels if (uap->osa) { 6647540Skarels sa->sa_handler = ps->ps_sigact[sig]; 6747540Skarels sa->sa_mask = ps->ps_catchmask[sig]; 6818308Smckusick bit = sigmask(sig); 6939513Skarels sa->sa_flags = 0; 7047540Skarels if ((ps->ps_sigonstack & bit) != 0) 7139513Skarels sa->sa_flags |= SA_ONSTACK; 7247540Skarels if ((ps->ps_sigintr & bit) == 0) 7339513Skarels sa->sa_flags |= SA_RESTART; 7442920Skarels if (p->p_flag & SNOCLDSTOP) 7539513Skarels sa->sa_flags |= SA_NOCLDSTOP; 7639513Skarels if (error = copyout((caddr_t)sa, (caddr_t)uap->osa, 7739513Skarels sizeof (vec))) 7844405Skarels return (error); 7912951Ssam } 8039513Skarels if (uap->nsa) { 8139513Skarels if (error = copyin((caddr_t)uap->nsa, (caddr_t)sa, 8239513Skarels sizeof (vec))) 8344405Skarels return (error); 8442920Skarels setsigvec(p, sig, sa); 8512951Ssam } 8644405Skarels return (0); 877421Sroot } 887421Sroot 8942920Skarels setsigvec(p, sig, sa) 9042920Skarels register struct proc *p; 9112951Ssam int sig; 9239513Skarels register struct sigaction *sa; 9312882Ssam { 9447540Skarels register struct sigacts *ps = p->p_sigacts; 9512951Ssam register int bit; 9612882Ssam 9717153Sbloom bit = sigmask(sig); 9812882Ssam /* 9912882Ssam * Change setting atomically. 10012882Ssam */ 10117153Sbloom (void) splhigh(); 10247540Skarels ps->ps_sigact[sig] = sa->sa_handler; 10347540Skarels ps->ps_catchmask[sig] = sa->sa_mask &~ sigcantmask; 10439513Skarels if ((sa->sa_flags & SA_RESTART) == 0) 10547540Skarels ps->ps_sigintr |= bit; 10618308Smckusick else 10747540Skarels ps->ps_sigintr &= ~bit; 10839513Skarels if (sa->sa_flags & SA_ONSTACK) 10947540Skarels ps->ps_sigonstack |= bit; 11012951Ssam else 11147540Skarels ps->ps_sigonstack &= ~bit; 11252400Storek #ifdef COMPAT_SUNOS 11352400Storek if (sa->sa_flags & SA_USERTRAMP) 11452400Storek ps->ps_usertramp |= bit; 11552400Storek else 11652400Storek ps->ps_usertramp &= ~bit; 11752400Storek #endif 11839513Skarels if (sig == SIGCHLD) { 11939513Skarels if (sa->sa_flags & SA_NOCLDSTOP) 12039513Skarels p->p_flag |= SNOCLDSTOP; 12139513Skarels else 12239513Skarels p->p_flag &= ~SNOCLDSTOP; 12339513Skarels } 12439513Skarels /* 12539513Skarels * Set bit in p_sigignore for signals that are set to SIG_IGN, 12639513Skarels * and for signals set to SIG_DFL where the default is to ignore. 12739513Skarels * However, don't put SIGCONT in p_sigignore, 12839513Skarels * as we have to restart the process. 12939513Skarels */ 13039513Skarels if (sa->sa_handler == SIG_IGN || 13147540Skarels (sigprop[sig] & SA_IGNORE && sa->sa_handler == SIG_DFL)) { 13212951Ssam p->p_sig &= ~bit; /* never to be seen again */ 13339513Skarels if (sig != SIGCONT) 13439513Skarels p->p_sigignore |= bit; /* easier in psignal */ 13512951Ssam p->p_sigcatch &= ~bit; 13612882Ssam } else { 13712951Ssam p->p_sigignore &= ~bit; 13839513Skarels if (sa->sa_handler == SIG_DFL) 13912951Ssam p->p_sigcatch &= ~bit; 14012882Ssam else 14112951Ssam p->p_sigcatch |= bit; 14212882Ssam } 14312882Ssam (void) spl0(); 14412882Ssam } 14512882Ssam 14639513Skarels /* 14739513Skarels * Initialize signal state for process 0; 14839513Skarels * set to ignore signals that are ignored by default. 14939513Skarels */ 15047540Skarels void 15139513Skarels siginit(p) 15239513Skarels struct proc *p; 1537421Sroot { 15447540Skarels register int i; 15539513Skarels 15647540Skarels for (i = 0; i < NSIG; i++) 15747540Skarels if (sigprop[i] & SA_IGNORE && i != SIGCONT) 15847540Skarels p->p_sigignore |= sigmask(i); 15939513Skarels } 16039513Skarels 16139513Skarels /* 16239513Skarels * Reset signals for an exec of the specified process. 16339513Skarels */ 16447540Skarels void 16539513Skarels execsigs(p) 16639513Skarels register struct proc *p; 16739513Skarels { 16847540Skarels register struct sigacts *ps = p->p_sigacts; 16939513Skarels register int nc, mask; 17039513Skarels 17139513Skarels /* 17239513Skarels * Reset caught signals. Held signals remain held 17339513Skarels * through p_sigmask (unless they were caught, 17439513Skarels * and are now ignored by default). 17539513Skarels */ 17639513Skarels while (p->p_sigcatch) { 17739513Skarels nc = ffs((long)p->p_sigcatch); 17839513Skarels mask = sigmask(nc); 17939513Skarels p->p_sigcatch &= ~mask; 18047540Skarels if (sigprop[nc] & SA_IGNORE) { 18139513Skarels if (nc != SIGCONT) 18239513Skarels p->p_sigignore |= mask; 18339513Skarels p->p_sig &= ~mask; 18439513Skarels } 18547540Skarels ps->ps_sigact[nc] = SIG_DFL; 18639513Skarels } 18739513Skarels /* 18839513Skarels * Reset stack state to the user stack. 18939513Skarels * Clear set of signals caught on the signal stack. 19039513Skarels */ 19153218Smckusick ps->ps_sigstk.ss_flags = SA_DISABLE; 19253218Smckusick ps->ps_sigstk.ss_size = 0; 19353218Smckusick ps->ps_sigstk.ss_base = 0; 19453218Smckusick ps->ps_flags = 0; 19539513Skarels } 19639513Skarels 19739513Skarels /* 19839513Skarels * Manipulate signal mask. 19939513Skarels * Note that we receive new mask, not pointer, 20039513Skarels * and return old mask as return value; 20139513Skarels * the library stub does the rest. 20239513Skarels */ 20354926Storek struct sigprocmask_args { 20454926Storek int how; 20554926Storek sigset_t mask; 20654926Storek }; 20742920Skarels sigprocmask(p, uap, retval) 20842920Skarels register struct proc *p; 20954926Storek struct sigprocmask_args *uap; 21042920Skarels int *retval; 21142920Skarels { 21239513Skarels int error = 0; 21339513Skarels 21442920Skarels *retval = p->p_sigmask; 21539513Skarels (void) splhigh(); 21639513Skarels 21739513Skarels switch (uap->how) { 21839513Skarels case SIG_BLOCK: 21939513Skarels p->p_sigmask |= uap->mask &~ sigcantmask; 22039513Skarels break; 22139513Skarels 22239513Skarels case SIG_UNBLOCK: 22339513Skarels p->p_sigmask &= ~uap->mask; 22439513Skarels break; 22539513Skarels 22639513Skarels case SIG_SETMASK: 22739513Skarels p->p_sigmask = uap->mask &~ sigcantmask; 22839513Skarels break; 22939513Skarels 23039513Skarels default: 23139513Skarels error = EINVAL; 23239513Skarels break; 23339513Skarels } 23439513Skarels (void) spl0(); 23544405Skarels return (error); 23639513Skarels } 23739513Skarels 23854926Storek struct sigpending_args { 23954926Storek int dummy; 24054926Storek }; 24142920Skarels /* ARGSUSED */ 24242920Skarels sigpending(p, uap, retval) 24342920Skarels struct proc *p; 24454926Storek struct sigpending_args *uap; 24542920Skarels int *retval; 24639513Skarels { 24739513Skarels 24842920Skarels *retval = p->p_sig; 24944405Skarels return (0); 25039513Skarels } 25139513Skarels 25252400Storek #if defined(COMPAT_43) || defined(COMPAT_SUNOS) 25339513Skarels /* 25439513Skarels * Generalized interface signal handler, 4.3-compatible. 25539513Skarels */ 25654926Storek struct osigvec_args { 25754926Storek int signo; 25854926Storek struct sigvec *nsv; 25954926Storek struct sigvec *osv; 26054926Storek }; 26142920Skarels /* ARGSUSED */ 26242920Skarels osigvec(p, uap, retval) 26342920Skarels struct proc *p; 26454926Storek register struct osigvec_args *uap; 26542920Skarels int *retval; 26642920Skarels { 26739513Skarels struct sigvec vec; 26847540Skarels register struct sigacts *ps = p->p_sigacts; 26939513Skarels register struct sigvec *sv; 27039513Skarels register int sig; 27139513Skarels int bit, error; 27239513Skarels 27339513Skarels sig = uap->signo; 27439513Skarels if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP) 27544405Skarels return (EINVAL); 27639513Skarels sv = &vec; 27739513Skarels if (uap->osv) { 27847540Skarels *(sig_t *)&sv->sv_handler = ps->ps_sigact[sig]; 27947540Skarels sv->sv_mask = ps->ps_catchmask[sig]; 28039513Skarels bit = sigmask(sig); 28139513Skarels sv->sv_flags = 0; 28247540Skarels if ((ps->ps_sigonstack & bit) != 0) 28339513Skarels sv->sv_flags |= SV_ONSTACK; 28447540Skarels if ((ps->ps_sigintr & bit) != 0) 28539513Skarels sv->sv_flags |= SV_INTERRUPT; 28652400Storek #ifndef COMPAT_SUNOS 28742920Skarels if (p->p_flag & SNOCLDSTOP) 28839513Skarels sv->sv_flags |= SA_NOCLDSTOP; 28952400Storek #endif 29039513Skarels if (error = copyout((caddr_t)sv, (caddr_t)uap->osv, 29139513Skarels sizeof (vec))) 29244405Skarels return (error); 29339513Skarels } 29439513Skarels if (uap->nsv) { 29539513Skarels if (error = copyin((caddr_t)uap->nsv, (caddr_t)sv, 29639513Skarels sizeof (vec))) 29744405Skarels return (error); 29852400Storek #ifdef COMPAT_SUNOS 29952400Storek /* 30054344Smckusick * SunOS uses this bit (4, aka SA_DISABLE) as SV_RESETHAND, 30154344Smckusick * `reset to SIG_DFL on delivery'. We have no such option 30254344Smckusick * now or ever! 30352400Storek */ 30454344Smckusick if (sv->sv_flags & SA_DISABLE) 30552400Storek return (EINVAL); 30652400Storek sv->sv_flags |= SA_USERTRAMP; 30752400Storek #endif 30839513Skarels sv->sv_flags ^= SA_RESTART; /* opposite of SV_INTERRUPT */ 30942920Skarels setsigvec(p, sig, (struct sigaction *)sv); 31039513Skarels } 31144405Skarels return (0); 31239513Skarels } 31339513Skarels 31454926Storek struct osigblock_args { 31554926Storek int mask; 31654926Storek }; 31742920Skarels osigblock(p, uap, retval) 31842920Skarels register struct proc *p; 31954926Storek struct osigblock_args *uap; 32042920Skarels int *retval; 32139513Skarels { 3227499Sroot 32317153Sbloom (void) splhigh(); 32442920Skarels *retval = p->p_sigmask; 32539513Skarels p->p_sigmask |= uap->mask &~ sigcantmask; 32612882Ssam (void) spl0(); 32744405Skarels return (0); 3287499Sroot } 3297499Sroot 33054926Storek struct osigsetmask_args { 33154926Storek int mask; 33254926Storek }; 33342920Skarels osigsetmask(p, uap, retval) 33442920Skarels struct proc *p; 33554926Storek struct osigsetmask_args *uap; 33642920Skarels int *retval; 3377499Sroot { 3387499Sroot 33917153Sbloom (void) splhigh(); 34042920Skarels *retval = p->p_sigmask; 34139513Skarels p->p_sigmask = uap->mask &~ sigcantmask; 34212882Ssam (void) spl0(); 34344405Skarels return (0); 3447499Sroot } 34554344Smckusick #endif /* COMPAT_43 || COMPAT_SUNOS */ 3467499Sroot 34739513Skarels /* 34839513Skarels * Suspend process until signal, providing mask to be set 34939513Skarels * in the meantime. Note nonstandard calling convention: 35039513Skarels * libc stub passes mask, not pointer, to save a copyin. 35139513Skarels */ 35254926Storek struct sigsuspend_args { 35354926Storek sigset_t mask; 35454926Storek }; 35542920Skarels /* ARGSUSED */ 35642920Skarels sigsuspend(p, uap, retval) 35742920Skarels register struct proc *p; 35854926Storek struct sigsuspend_args *uap; 35942920Skarels int *retval; 3607499Sroot { 36147540Skarels register struct sigacts *ps = p->p_sigacts; 3627499Sroot 36312882Ssam /* 36412882Ssam * When returning from sigpause, we want 36512882Ssam * the old mask to be restored after the 36612882Ssam * signal handler has finished. Thus, we 36752115Skarels * save it here and mark the sigacts structure 36852115Skarels * to indicate this. 36912882Ssam */ 37047540Skarels ps->ps_oldmask = p->p_sigmask; 37153218Smckusick ps->ps_flags |= SAS_OLDMASK; 37239513Skarels p->p_sigmask = uap->mask &~ sigcantmask; 37347540Skarels (void) tsleep((caddr_t) ps, PPAUSE|PCATCH, "pause", 0); 37440807Smarc /* always return EINTR rather than ERESTART... */ 37544405Skarels return (EINTR); 3767499Sroot } 3777499Sroot 37854344Smckusick #if defined(COMPAT_43) || defined(COMPAT_SUNOS) 37954926Storek struct osigstack_args { 38054926Storek struct sigstack *nss; 38154926Storek struct sigstack *oss; 38254926Storek }; 38342920Skarels /* ARGSUSED */ 38453218Smckusick osigstack(p, uap, retval) 38542920Skarels struct proc *p; 38654926Storek register struct osigstack_args *uap; 38742920Skarels int *retval; 38842920Skarels { 38912951Ssam struct sigstack ss; 39053218Smckusick struct sigacts *psp; 39139513Skarels int error = 0; 3927499Sroot 39353218Smckusick psp = p->p_sigacts; 39453218Smckusick ss.ss_sp = psp->ps_sigstk.ss_base; 39553218Smckusick ss.ss_onstack = psp->ps_sigstk.ss_flags & SA_ONSTACK; 39653218Smckusick if (uap->oss && (error = copyout((caddr_t)&ss, (caddr_t)uap->oss, 39753218Smckusick sizeof (struct sigstack)))) 39844405Skarels return (error); 39939513Skarels if (uap->nss && (error = copyin((caddr_t)uap->nss, (caddr_t)&ss, 40053218Smckusick sizeof (ss))) == 0) { 40153218Smckusick psp->ps_sigstk.ss_base = ss.ss_sp; 40253218Smckusick psp->ps_sigstk.ss_size = 0; 40353218Smckusick psp->ps_sigstk.ss_flags |= ss.ss_onstack & SA_ONSTACK; 40453218Smckusick psp->ps_flags |= SAS_ALTSTACK; 40553218Smckusick } 40644405Skarels return (error); 4077499Sroot } 40854344Smckusick #endif /* COMPAT_43 || COMPAT_SUNOS */ 4097499Sroot 41054926Storek struct sigaltstack_args { 41154926Storek struct sigaltstack *nss; 41254926Storek struct sigaltstack *oss; 41354926Storek }; 41442920Skarels /* ARGSUSED */ 41553218Smckusick sigaltstack(p, uap, retval) 41653218Smckusick struct proc *p; 41754926Storek register struct sigaltstack_args *uap; 41853218Smckusick int *retval; 41953218Smckusick { 42053218Smckusick struct sigacts *psp; 42153218Smckusick struct sigaltstack ss; 42253218Smckusick int error; 42353218Smckusick 42453218Smckusick psp = p->p_sigacts; 42553218Smckusick if ((psp->ps_flags & SAS_ALTSTACK) == 0) 42653218Smckusick psp->ps_sigstk.ss_flags |= SA_DISABLE; 42753218Smckusick if (uap->oss && (error = copyout((caddr_t)&psp->ps_sigstk, 42853218Smckusick (caddr_t)uap->oss, sizeof (struct sigaltstack)))) 42953218Smckusick return (error); 43054464Smckusick if (uap->nss == 0) 43154464Smckusick return (0); 43254464Smckusick if (error = copyin((caddr_t)uap->nss, (caddr_t)&ss, sizeof (ss))) 43353218Smckusick return (error); 43453218Smckusick if (ss.ss_flags & SA_DISABLE) { 43553218Smckusick if (psp->ps_sigstk.ss_flags & SA_ONSTACK) 43653218Smckusick return (EINVAL); 43753218Smckusick psp->ps_flags &= ~SAS_ALTSTACK; 43853218Smckusick psp->ps_sigstk.ss_flags = ss.ss_flags; 43953218Smckusick return (0); 44053218Smckusick } 44153218Smckusick if (ss.ss_size < MINSIGSTKSZ) 44253218Smckusick return (ENOMEM); 44353218Smckusick psp->ps_flags |= SAS_ALTSTACK; 44453218Smckusick psp->ps_sigstk= ss; 44553218Smckusick return (0); 44653218Smckusick } 44753218Smckusick 44854926Storek struct kill_args { 44954926Storek int pid; 45054926Storek int signo; 45154926Storek }; 45253218Smckusick /* ARGSUSED */ 45342920Skarels kill(cp, uap, retval) 45442920Skarels register struct proc *cp; 45554926Storek register struct kill_args *uap; 45642920Skarels int *retval; 45742920Skarels { 45818336Smckusick register struct proc *p; 45947540Skarels register struct pcred *pc = cp->p_cred; 4608032Sroot 46139513Skarels if ((unsigned) uap->signo >= NSIG) 46244405Skarels return (EINVAL); 46318336Smckusick if (uap->pid > 0) { 46418336Smckusick /* kill single process */ 46518336Smckusick p = pfind(uap->pid); 46639513Skarels if (p == 0) 46744405Skarels return (ESRCH); 46847540Skarels if (!CANSIGNAL(cp, pc, p, uap->signo)) 46944405Skarels return (EPERM); 47039513Skarels if (uap->signo) 47118336Smckusick psignal(p, uap->signo); 47244405Skarels return (0); 47318336Smckusick } 47418336Smckusick switch (uap->pid) { 47518336Smckusick case -1: /* broadcast signal */ 47644405Skarels return (killpg1(cp, uap->signo, 0, 1)); 47718336Smckusick case 0: /* signal own process group */ 47844405Skarels return (killpg1(cp, uap->signo, 0, 0)); 47918336Smckusick default: /* negative explicit process group */ 48044405Skarels return (killpg1(cp, uap->signo, -uap->pid, 0)); 48118336Smckusick } 48239513Skarels /* NOTREACHED */ 4838032Sroot } 4848032Sroot 48552400Storek #if defined(COMPAT_43) || defined(COMPAT_SUNOS) 48654926Storek struct okillpg_args { 48754926Storek int pgid; 48854926Storek int signo; 48954926Storek }; 49042920Skarels /* ARGSUSED */ 49142920Skarels okillpg(p, uap, retval) 49242920Skarels struct proc *p; 49354926Storek register struct okillpg_args *uap; 49442920Skarels int *retval; 49542920Skarels { 4968032Sroot 49739513Skarels if ((unsigned) uap->signo >= NSIG) 49844405Skarels return (EINVAL); 49944405Skarels return (killpg1(p, uap->signo, uap->pgid, 0)); 5008032Sroot } 50154344Smckusick #endif /* COMPAT_43 || COMPAT_SUNOS */ 5028032Sroot 50342920Skarels /* 50442920Skarels * Common code for kill process group/broadcast kill. 50542920Skarels * cp is calling process. 50642920Skarels */ 50742920Skarels killpg1(cp, signo, pgid, all) 50842920Skarels register struct proc *cp; 50937581Smckusick int signo, pgid, all; 5109989Ssam { 5119989Ssam register struct proc *p; 51247540Skarels register struct pcred *pc = cp->p_cred; 51337581Smckusick struct pgrp *pgrp; 51447540Skarels int nfound = 0; 51537581Smckusick 51637581Smckusick if (all) 51737581Smckusick /* 51837581Smckusick * broadcast 5197421Sroot */ 52054758Storek for (p = (struct proc *)allproc; p != NULL; p = p->p_nxt) { 52147540Skarels if (p->p_pid <= 1 || p->p_flag&SSYS || 52247540Skarels p == cp || !CANSIGNAL(cp, pc, p, signo)) 52337581Smckusick continue; 52447540Skarels nfound++; 52537581Smckusick if (signo) 52637581Smckusick psignal(p, signo); 52737581Smckusick } 52837581Smckusick else { 52937581Smckusick if (pgid == 0) 53037581Smckusick /* 53137581Smckusick * zero pgid means send to my process group. 53237581Smckusick */ 53347540Skarels pgrp = cp->p_pgrp; 53437581Smckusick else { 53537581Smckusick pgrp = pgfind(pgid); 53637581Smckusick if (pgrp == NULL) 53739513Skarels return (ESRCH); 53837581Smckusick } 53937581Smckusick for (p = pgrp->pg_mem; p != NULL; p = p->p_pgrpnxt) { 54047540Skarels if (p->p_pid <= 1 || p->p_flag&SSYS || 54150128Skarels p->p_stat == SZOMB || !CANSIGNAL(cp, pc, p, signo)) 54237581Smckusick continue; 54347540Skarels nfound++; 54437581Smckusick if (signo) 54537581Smckusick psignal(p, signo); 54618336Smckusick } 5477421Sroot } 54847540Skarels return (nfound ? 0 : ESRCH); 5497421Sroot } 5507421Sroot 55142920Skarels /* 5527421Sroot * Send the specified signal to 55337581Smckusick * all processes with 'pgid' as 5547421Sroot * process group. 5557421Sroot */ 55647540Skarels void 55737581Smckusick gsignal(pgid, sig) 55847540Skarels int pgid, sig; 5597421Sroot { 56039513Skarels struct pgrp *pgrp; 5617421Sroot 56239513Skarels if (pgid && (pgrp = pgfind(pgid))) 56342207Smarc pgsignal(pgrp, sig, 0); 5647421Sroot } 56542920Skarels 56640807Smarc /* 56742207Smarc * Send sig to every member of a process group. 56842207Smarc * If checktty is 1, limit to members which have a controlling 56942207Smarc * terminal. 57040807Smarc */ 57147540Skarels void 57242207Smarc pgsignal(pgrp, sig, checkctty) 57339513Skarels struct pgrp *pgrp; 57447540Skarels int sig, checkctty; 57537581Smckusick { 57637581Smckusick register struct proc *p; 57737581Smckusick 57840807Smarc if (pgrp) 57940807Smarc for (p = pgrp->pg_mem; p != NULL; p = p->p_pgrpnxt) 58042207Smarc if (checkctty == 0 || p->p_flag&SCTTY) 58142207Smarc psignal(p, sig); 58237581Smckusick } 58337581Smckusick 5847421Sroot /* 58539513Skarels * Send a signal caused by a trap to the current process. 58639513Skarels * If it will be caught immediately, deliver it with correct code. 58739513Skarels * Otherwise, post it normally. 58839513Skarels */ 58947540Skarels void 59047540Skarels trapsignal(p, sig, code) 59147540Skarels struct proc *p; 59239513Skarels register int sig; 59339513Skarels unsigned code; 59439513Skarels { 59547540Skarels register struct sigacts *ps = p->p_sigacts; 59639513Skarels int mask; 59739513Skarels 59839513Skarels mask = sigmask(sig); 59939513Skarels if ((p->p_flag & STRC) == 0 && (p->p_sigcatch & mask) != 0 && 60039513Skarels (p->p_sigmask & mask) == 0) { 60147540Skarels p->p_stats->p_ru.ru_nsignals++; 60240807Smarc #ifdef KTRACE 60340807Smarc if (KTRPOINT(p, KTR_PSIG)) 60447540Skarels ktrpsig(p->p_tracep, sig, ps->ps_sigact[sig], 60540807Smarc p->p_sigmask, code); 60640807Smarc #endif 60747540Skarels sendsig(ps->ps_sigact[sig], sig, p->p_sigmask, code); 60847540Skarels p->p_sigmask |= ps->ps_catchmask[sig] | mask; 60939513Skarels } else { 61047540Skarels ps->ps_code = code; /* XXX for core dump/debugger */ 61139513Skarels psignal(p, sig); 61239513Skarels } 61339513Skarels } 61439513Skarels 61539513Skarels /* 61640807Smarc * Send the specified signal to the specified process. 61747540Skarels * If the signal has an action, the action is usually performed 61847540Skarels * by the target process rather than the caller; we simply add 61947540Skarels * the signal to the set of pending signals for the process. 62040807Smarc * Exceptions: 62140807Smarc * o When a stop signal is sent to a sleeping process that takes the default 62240807Smarc * action, the process is stopped without awakening it. 62340807Smarc * o SIGCONT restarts stopped processes (or puts them back to sleep) 62440807Smarc * regardless of the signal action (eg, blocked or ignored). 62540807Smarc * Other ignored signals are discarded immediately. 6267421Sroot */ 62747540Skarels void 6287421Sroot psignal(p, sig) 6297421Sroot register struct proc *p; 6307421Sroot register int sig; 6317421Sroot { 63247540Skarels register int s, prop; 63339513Skarels register sig_t action; 63417153Sbloom int mask; 6357421Sroot 63639513Skarels if ((unsigned)sig >= NSIG || sig == 0) 63739513Skarels panic("psignal sig"); 63817153Sbloom mask = sigmask(sig); 63947540Skarels prop = sigprop[sig]; 6407421Sroot 6417421Sroot /* 6427421Sroot * If proc is traced, always give parent a chance. 6437421Sroot */ 6447421Sroot if (p->p_flag & STRC) 6457421Sroot action = SIG_DFL; 6467421Sroot else { 6477421Sroot /* 64812882Ssam * If the signal is being ignored, 64912882Ssam * then we forget about it immediately. 65039513Skarels * (Note: we don't set SIGCONT in p_sigignore, 65139513Skarels * and if it is set to SIG_IGN, 65239513Skarels * action will be SIG_DFL here.) 6537421Sroot */ 65417153Sbloom if (p->p_sigignore & mask) 6557421Sroot return; 65617153Sbloom if (p->p_sigmask & mask) 65712882Ssam action = SIG_HOLD; 65817153Sbloom else if (p->p_sigcatch & mask) 65912882Ssam action = SIG_CATCH; 66042437Skarels else 66112882Ssam action = SIG_DFL; 6627421Sroot } 6637421Sroot 66447540Skarels if (p->p_nice > NZERO && (sig == SIGKILL || 66547540Skarels sig == SIGTERM && (p->p_flag&STRC || action != SIG_DFL))) 66647540Skarels p->p_nice = NZERO; 6677421Sroot 66847540Skarels if (prop & SA_CONT) 66939513Skarels p->p_sig &= ~stopsigmask; 67039513Skarels 67147540Skarels if (prop & SA_STOP) { 67245672Skarels /* 67345672Skarels * If sending a tty stop signal to a member of an orphaned 67445672Skarels * process group, discard the signal here if the action 67545672Skarels * is default; don't stop the process below if sleeping, 67645672Skarels * and don't clear any pending SIGCONT. 67745672Skarels */ 67847540Skarels if (prop & SA_TTYSTOP && p->p_pgrp->pg_jobc == 0 && 67947540Skarels action == SIG_DFL) 68045741Smckusick return; 68147540Skarels p->p_sig &= ~contsigmask; 6827421Sroot } 68339513Skarels p->p_sig |= mask; 68439513Skarels 6857421Sroot /* 68639513Skarels * Defer further processing for signals which are held, 68739513Skarels * except that stopped processes must be continued by SIGCONT. 6887421Sroot */ 68947540Skarels if (action == SIG_HOLD && ((prop & SA_CONT) == 0 || p->p_stat != SSTOP)) 6907421Sroot return; 69117153Sbloom s = splhigh(); 6927421Sroot switch (p->p_stat) { 6937421Sroot 6947421Sroot case SSLEEP: 6957421Sroot /* 69640807Smarc * If process is sleeping uninterruptibly 6977421Sroot * we can't interrupt the sleep... the signal will 6987421Sroot * be noticed when the process returns through 6997421Sroot * trap() or syscall(). 7007421Sroot */ 70140807Smarc if ((p->p_flag & SSINTR) == 0) 7027421Sroot goto out; 7037421Sroot /* 7047421Sroot * Process is sleeping and traced... make it runnable 7057421Sroot * so it can discover the signal in issig() and stop 7067421Sroot * for the parent. 7077421Sroot */ 7087421Sroot if (p->p_flag&STRC) 7097421Sroot goto run; 71039513Skarels /* 71139513Skarels * When a sleeping process receives a stop 71239513Skarels * signal, process immediately if possible. 71339513Skarels * All other (caught or default) signals 71439513Skarels * cause the process to run. 71539513Skarels */ 71647540Skarels if (prop & SA_STOP) { 7177421Sroot if (action != SIG_DFL) 71839513Skarels goto runfast; 7197421Sroot /* 72047540Skarels * If a child holding parent blocked, 72147540Skarels * stopping could cause deadlock. 7227421Sroot */ 72347540Skarels if (p->p_flag&SPPWAIT) 7247421Sroot goto out; 72517153Sbloom p->p_sig &= ~mask; 72643895Skarels p->p_xstat = sig; 72739513Skarels if ((p->p_pptr->p_flag & SNOCLDSTOP) == 0) 72839513Skarels psignal(p->p_pptr, SIGCHLD); 7297421Sroot stop(p); 7307421Sroot goto out; 73139513Skarels } else 73239513Skarels goto runfast; 7337421Sroot /*NOTREACHED*/ 7347421Sroot 7357421Sroot case SSTOP: 7367421Sroot /* 7377421Sroot * If traced process is already stopped, 7387421Sroot * then no further action is necessary. 7397421Sroot */ 7407421Sroot if (p->p_flag&STRC) 7417421Sroot goto out; 7427421Sroot 74347540Skarels /* 74447540Skarels * Kill signal always sets processes running. 74547540Skarels */ 74647540Skarels if (sig == SIGKILL) 74739513Skarels goto runfast; 7487421Sroot 74947540Skarels if (prop & SA_CONT) { 7507421Sroot /* 75139513Skarels * If SIGCONT is default (or ignored), we continue 75239513Skarels * the process but don't leave the signal in p_sig, 75339513Skarels * as it has no further action. If SIGCONT is held, 75439513Skarels * continue the process and leave the signal in p_sig. 7557421Sroot * If the process catches SIGCONT, let it handle 7567421Sroot * the signal itself. If it isn't waiting on 7577421Sroot * an event, then it goes back to run state. 7587421Sroot * Otherwise, process goes back to sleep state. 7597421Sroot */ 76039513Skarels if (action == SIG_DFL) 76139513Skarels p->p_sig &= ~mask; 76239513Skarels if (action == SIG_CATCH) 76339513Skarels goto runfast; 76439513Skarels if (p->p_wchan == 0) 7657421Sroot goto run; 7667421Sroot p->p_stat = SSLEEP; 7677421Sroot goto out; 76847540Skarels } 7697421Sroot 77047540Skarels if (prop & SA_STOP) { 7717421Sroot /* 7727421Sroot * Already stopped, don't need to stop again. 7737421Sroot * (If we did the shell could get confused.) 7747421Sroot */ 77517153Sbloom p->p_sig &= ~mask; /* take it away */ 7767421Sroot goto out; 7777421Sroot } 7787421Sroot 77947540Skarels /* 78047540Skarels * If process is sleeping interruptibly, then 78147540Skarels * simulate a wakeup so that when it is continued, 78247540Skarels * it will be made runnable and can look at the signal. 78347540Skarels * But don't setrun the process, leave it stopped. 78447540Skarels */ 78547540Skarels if (p->p_wchan && p->p_flag & SSINTR) 78647540Skarels unsleep(p); 78747540Skarels goto out; 78847540Skarels 7897421Sroot default: 7907421Sroot /* 7917421Sroot * SRUN, SIDL, SZOMB do nothing with the signal, 7927421Sroot * other than kicking ourselves if we are running. 7937421Sroot * It will either never be noticed, or noticed very soon. 7947421Sroot */ 79547650Skarels if (p == curproc) 79649102Skarels signotify(p); 7977421Sroot goto out; 7987421Sroot } 7997421Sroot /*NOTREACHED*/ 80039513Skarels 80139513Skarels runfast: 8027421Sroot /* 8037421Sroot * Raise priority to at least PUSER. 8047421Sroot */ 8057421Sroot if (p->p_pri > PUSER) 80617399Skarels p->p_pri = PUSER; 80739513Skarels run: 8087421Sroot setrun(p); 8097421Sroot out: 8107421Sroot splx(s); 8117421Sroot } 8127421Sroot 8137421Sroot /* 81440807Smarc * If the current process has a signal to process (should be caught 81540807Smarc * or cause termination, should interrupt current syscall), 81640807Smarc * return the signal number. Stop signals with default action 81740807Smarc * are processed immediately, then cleared; they aren't returned. 81847540Skarels * This is checked after each entry to the system for a syscall 81947540Skarels * or trap (though this can usually be done without actually calling 82047540Skarels * issig by checking the pending signal masks in the CURSIG macro.) 82147540Skarels * The normal call sequence is 82247540Skarels * 82347540Skarels * while (sig = CURSIG(curproc)) 82447540Skarels * psig(sig); 8257421Sroot */ 82647540Skarels issig(p) 82747540Skarels register struct proc *p; 8287421Sroot { 82947540Skarels register int sig, mask, prop; 8307421Sroot 8317421Sroot for (;;) { 83239513Skarels mask = p->p_sig &~ p->p_sigmask; 83347540Skarels if (p->p_flag&SPPWAIT) 83439513Skarels mask &= ~stopsigmask; 83540807Smarc if (mask == 0) /* no signal to send */ 83640807Smarc return (0); 83739513Skarels sig = ffs((long)mask); 83817153Sbloom mask = sigmask(sig); 83947540Skarels prop = sigprop[sig]; 84040807Smarc /* 84140807Smarc * We should see pending but ignored signals 84240807Smarc * only if STRC was on when they were posted. 84340807Smarc */ 84440807Smarc if (mask & p->p_sigignore && (p->p_flag&STRC) == 0) { 84540807Smarc p->p_sig &= ~mask; 84640807Smarc continue; 84740807Smarc } 84847540Skarels if (p->p_flag&STRC && (p->p_flag&SPPWAIT) == 0) { 8497421Sroot /* 8507421Sroot * If traced, always stop, and stay 8517421Sroot * stopped until released by the parent. 8527421Sroot */ 85343895Skarels p->p_xstat = sig; 85418331Skarels psignal(p->p_pptr, SIGCHLD); 8557421Sroot do { 8567421Sroot stop(p); 8577421Sroot swtch(); 85842926Smckusick } while (!procxmt(p) && p->p_flag&STRC); 8597421Sroot 8607421Sroot /* 86114782Ssam * If the traced bit got turned off, 86240807Smarc * go back up to the top to rescan signals. 86347650Skarels * This ensures that p_sig* and ps_sigact 86447650Skarels * are consistent. 8657421Sroot */ 86640807Smarc if ((p->p_flag&STRC) == 0) 8677421Sroot continue; 8687421Sroot 8697421Sroot /* 8707421Sroot * If parent wants us to take the signal, 87143895Skarels * then it will leave it in p->p_xstat; 8727421Sroot * otherwise we just look for signals again. 8737421Sroot */ 87440807Smarc p->p_sig &= ~mask; /* clear the old signal */ 87543895Skarels sig = p->p_xstat; 8767421Sroot if (sig == 0) 8777421Sroot continue; 87814782Ssam 87914782Ssam /* 88040807Smarc * Put the new signal into p_sig. 88140807Smarc * If signal is being masked, 88240807Smarc * look for other signals. 88314782Ssam */ 88417153Sbloom mask = sigmask(sig); 88540807Smarc p->p_sig |= mask; 88640807Smarc if (p->p_sigmask & mask) 88714782Ssam continue; 8887421Sroot } 88940807Smarc 89040807Smarc /* 89140807Smarc * Decide whether the signal should be returned. 89240807Smarc * Return the signal's number, or fall through 89340807Smarc * to clear it from the pending mask. 89440807Smarc */ 89547540Skarels switch ((int)p->p_sigacts->ps_sigact[sig]) { 8967421Sroot 8977421Sroot case SIG_DFL: 8987421Sroot /* 8997421Sroot * Don't take default actions on system processes. 9007421Sroot */ 90151019Sralph if (p->p_pid <= 1) { 90251019Sralph #ifdef DIAGNOSTIC 90351019Sralph /* 90451019Sralph * Are you sure you want to ignore SIGSEGV 90551019Sralph * in init? XXX 90651019Sralph */ 90751019Sralph printf("Process (pid %d) got signal %d\n", 90851019Sralph p->p_pid, sig); 90951019Sralph #endif 91040807Smarc break; /* == ignore */ 91151019Sralph } 91240807Smarc /* 91340807Smarc * If there is a pending stop signal to process 91440807Smarc * with default action, stop here, 91542437Skarels * then clear the signal. However, 91642437Skarels * if process is member of an orphaned 91742437Skarels * process group, ignore tty stop signals. 91840807Smarc */ 91947540Skarels if (prop & SA_STOP) { 92042437Skarels if (p->p_flag&STRC || 92142437Skarels (p->p_pgrp->pg_jobc == 0 && 92247540Skarels prop & SA_TTYSTOP)) 92340807Smarc break; /* == ignore */ 92443895Skarels p->p_xstat = sig; 9257421Sroot stop(p); 92639513Skarels if ((p->p_pptr->p_flag & SNOCLDSTOP) == 0) 92739513Skarels psignal(p->p_pptr, SIGCHLD); 9287421Sroot swtch(); 92940807Smarc break; 93047540Skarels } else if (prop & SA_IGNORE) { 9317421Sroot /* 93239513Skarels * Except for SIGCONT, shouldn't get here. 93339513Skarels * Default action is to ignore; drop it. 9347421Sroot */ 93540807Smarc break; /* == ignore */ 93639513Skarels } else 93740807Smarc return (sig); 9387421Sroot /*NOTREACHED*/ 9397421Sroot 9407421Sroot case SIG_IGN: 9417421Sroot /* 94239513Skarels * Masking above should prevent us ever trying 94339513Skarels * to take action on an ignored signal other 94439513Skarels * than SIGCONT, unless process is traced. 9457421Sroot */ 94647540Skarels if ((prop & SA_CONT) == 0 && (p->p_flag&STRC) == 0) 9477421Sroot printf("issig\n"); 94840807Smarc break; /* == ignore */ 9497421Sroot 9507421Sroot default: 9517421Sroot /* 9527421Sroot * This signal has an action, let 9537421Sroot * psig process it. 9547421Sroot */ 95540807Smarc return (sig); 9567421Sroot } 95740807Smarc p->p_sig &= ~mask; /* take the signal! */ 9587421Sroot } 95940807Smarc /* NOTREACHED */ 9607421Sroot } 9617421Sroot 9627421Sroot /* 9637421Sroot * Put the argument process into the stopped 96418331Skarels * state and notify the parent via wakeup. 96518331Skarels * Signals are handled elsewhere. 96640807Smarc * The process must not be on the run queue. 9677421Sroot */ 9687421Sroot stop(p) 9697421Sroot register struct proc *p; 9707421Sroot { 9717421Sroot 9727421Sroot p->p_stat = SSTOP; 9737421Sroot p->p_flag &= ~SWTED; 9747421Sroot wakeup((caddr_t)p->p_pptr); 9757421Sroot } 9767421Sroot 9777421Sroot /* 97847540Skarels * Take the action for the specified signal 97947540Skarels * from the current set of pending signals. 9807421Sroot */ 98147540Skarels void 98240807Smarc psig(sig) 98340807Smarc register int sig; 9847421Sroot { 98547540Skarels register struct proc *p = curproc; 98647540Skarels register struct sigacts *ps = p->p_sigacts; 98747540Skarels register sig_t action; 98839513Skarels int mask, returnmask; 9897421Sroot 99040807Smarc #ifdef DIAGNOSTIC 99147540Skarels if (sig == 0) 99247540Skarels panic("psig"); 99340807Smarc #endif 99447540Skarels mask = sigmask(sig); 99547540Skarels p->p_sig &= ~mask; 99647540Skarels action = ps->ps_sigact[sig]; 99740807Smarc #ifdef KTRACE 99847540Skarels if (KTRPOINT(p, KTR_PSIG)) 99953218Smckusick ktrpsig(p->p_tracep, sig, action, ps->ps_flags & SAS_OLDMASK ? 100047540Skarels ps->ps_oldmask : p->p_sigmask, 0); 100140807Smarc #endif 100247540Skarels if (action == SIG_DFL) { 100347540Skarels /* 100447540Skarels * Default action, where the default is to kill 100547540Skarels * the process. (Other cases were ignored above.) 100647540Skarels */ 100747650Skarels sigexit(p, sig); 100847540Skarels /* NOTREACHED */ 100947540Skarels } else { 101047540Skarels /* 101147540Skarels * If we get here, the signal must be caught. 101247540Skarels */ 101339513Skarels #ifdef DIAGNOSTIC 101447540Skarels if (action == SIG_IGN || (p->p_sigmask & mask)) 101547540Skarels panic("psig action"); 101639513Skarels #endif 101747540Skarels /* 101847540Skarels * Set the new mask value and also defer further 101947540Skarels * occurences of this signal. 102047540Skarels * 102147540Skarels * Special case: user has done a sigpause. Here the 102247540Skarels * current mask is not of interest, but rather the 102347540Skarels * mask from before the sigpause is what we want 102447540Skarels * restored after the signal processing is completed. 102547540Skarels */ 102647540Skarels (void) splhigh(); 102753218Smckusick if (ps->ps_flags & SAS_OLDMASK) { 102847540Skarels returnmask = ps->ps_oldmask; 102953218Smckusick ps->ps_flags &= ~SAS_OLDMASK; 103047540Skarels } else 103147540Skarels returnmask = p->p_sigmask; 103247540Skarels p->p_sigmask |= ps->ps_catchmask[sig] | mask; 103347540Skarels (void) spl0(); 103447540Skarels p->p_stats->p_ru.ru_nsignals++; 103547540Skarels sendsig(action, sig, returnmask, 0); 103647540Skarels } 10377421Sroot } 10387421Sroot 10397421Sroot /* 104047650Skarels * Force the current process to exit with the specified 104147650Skarels * signal, dumping core if appropriate. We bypass the normal 104247650Skarels * tests for masked and caught signals, allowing unrecoverable 104347650Skarels * failures to terminate the process without changing signal state. 104447650Skarels * Mark the accounting record with the signal termination. 104547650Skarels * If dumping core, save the signal number for the debugger. 104647650Skarels * Calls exit and does not return. 104747650Skarels */ 104847650Skarels sigexit(p, sig) 104947650Skarels register struct proc *p; 105047650Skarels int sig; 105147650Skarels { 105247650Skarels 105347650Skarels p->p_acflag |= AXSIG; 105447650Skarels if (sigprop[sig] & SA_CORE) { 105547650Skarels p->p_sigacts->ps_sig = sig; 105647650Skarels if (coredump(p) == 0) 105747650Skarels sig |= WCOREFLAG; 105847650Skarels } 105947650Skarels exit(p, W_EXITCODE(0, sig)); 106047650Skarels /* NOTREACHED */ 106147650Skarels } 106247650Skarels 106347650Skarels /* 106447540Skarels * Create a core dump. 106550244Skarels * The file name is "core.progname". 106650099Smckusick * Core dumps are not created if the process is setuid. 10677421Sroot */ 106847540Skarels coredump(p) 106947540Skarels register struct proc *p; 10707421Sroot { 107137728Smckusick register struct vnode *vp; 107247540Skarels register struct pcred *pcred = p->p_cred; 107347540Skarels register struct ucred *cred = pcred->pc_ucred; 107447540Skarels register struct vmspace *vm = p->p_vmspace; 107537580Smckusick struct vattr vattr; 107650105Smckusick int error, error1; 107747540Skarels struct nameidata nd; 107850244Skarels char name[MAXCOMLEN+6]; /* core.progname */ 10797421Sroot 108047540Skarels if (pcred->p_svuid != pcred->p_ruid || 108147540Skarels pcred->p_svgid != pcred->p_rgid) 108237580Smckusick return (EFAULT); 108347540Skarels if (ctob(UPAGES + vm->vm_dsize + vm->vm_ssize) >= 108447540Skarels p->p_rlimit[RLIMIT_CORE].rlim_cur) 108537580Smckusick return (EFAULT); 108650244Skarels sprintf(name, "core.%s", p->p_comm); 108752304Sheideman NDINIT(&nd, LOOKUP, FOLLOW, UIO_SYSSPACE, name, p); 108852304Sheideman if (error = vn_open(&nd, O_CREAT|FWRITE, 0644)) 108937580Smckusick return (error); 109047540Skarels vp = nd.ni_vp; 109148020Smckusick if (vp->v_type != VREG || VOP_GETATTR(vp, &vattr, cred, p) || 109237580Smckusick vattr.va_nlink != 1) { 109350105Smckusick error = EFAULT; 109450105Smckusick goto out; 10957818Sroot } 109641362Smckusick VATTR_NULL(&vattr); 109737580Smckusick vattr.va_size = 0; 109852183Smckusick LEASE_CHECK(vp, p, cred, LEASE_WRITE); 109948020Smckusick VOP_SETATTR(vp, &vattr, cred, p); 110047540Skarels p->p_acflag |= ACORE; 110149102Skarels bcopy(p, &p->p_addr->u_kproc.kp_proc, sizeof(struct proc)); 110249102Skarels fill_eproc(p, &p->p_addr->u_kproc.kp_eproc); 110352925Smckusick error = cpu_coredump(p, vp, cred); 110437580Smckusick if (error == 0) 110547540Skarels error = vn_rdwr(UIO_WRITE, vp, vm->vm_daddr, 110647540Skarels (int)ctob(vm->vm_dsize), (off_t)ctob(UPAGES), UIO_USERSPACE, 110749102Skarels IO_NODELOCKED|IO_UNIT, cred, (int *) NULL, p); 110837580Smckusick if (error == 0) 110937580Smckusick error = vn_rdwr(UIO_WRITE, vp, 111049102Skarels (caddr_t) trunc_page(USRSTACK - ctob(vm->vm_ssize)), 111147540Skarels round_page(ctob(vm->vm_ssize)), 111247540Skarels (off_t)ctob(UPAGES) + ctob(vm->vm_dsize), UIO_USERSPACE, 111349102Skarels IO_NODELOCKED|IO_UNIT, cred, (int *) NULL, p); 111450105Smckusick out: 111550105Smckusick VOP_UNLOCK(vp); 111650105Smckusick error1 = vn_close(vp, FWRITE, cred, p); 111750244Skarels if (error == 0) 111850105Smckusick error = error1; 111937580Smckusick return (error); 11207421Sroot } 112139513Skarels 112239513Skarels /* 112339513Skarels * Nonexistent system call-- signal process (may want to handle it). 112439513Skarels * Flag error in case process won't see signal immediately (blocked or ignored). 112539513Skarels */ 112654926Storek struct nosys_args { 112754926Storek int dummy; 112854926Storek }; 112943364Smckusick /* ARGSUSED */ 113043364Smckusick nosys(p, args, retval) 113143364Smckusick struct proc *p; 113254926Storek struct nosys_args *args; 113343364Smckusick int *retval; 113439513Skarels { 113539513Skarels 113643364Smckusick psignal(p, SIGSYS); 113744405Skarels return (EINVAL); 113839513Skarels } 1139