|
|
1.1 root 1: /*
2: * Copyright (c) 1982, 1986, 1989 Regents of the University of California.
3: * All rights reserved.
4: *
5: * Redistribution is only permitted until one year after the first shipment
6: * of 4.4BSD by the Regents. Otherwise, redistribution and use in source and
7: * binary forms are permitted provided that: (1) source distributions retain
8: * this entire copyright notice and comment, and (2) distributions including
9: * binaries display the following acknowledgement: This product includes
10: * software developed by the University of California, Berkeley and its
11: * contributors'' in the documentation or other materials provided with the
12: * distribution and in all advertising materials mentioning features or use
13: * of this software. Neither the name of the University nor the names of
14: * its contributors may be used to endorse or promote products derived from
15: * this software without specific prior written permission.
16: * THIS SOFTWARE IS PROVIDED AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
17: * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
18: * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
19: *
20: * @(#)kern_sig.c 7.23 (Berkeley) 6/28/90
21: */
22:
23: #include "param.h"
24: #include "systm.h"
25: #include "user.h"
26: #include "vnode.h"
27: #include "proc.h"
28: #include "timeb.h"
29: #include "times.h"
30: #include "buf.h"
31: #include "text.h"
32: #include "seg.h"
33: #include "vm.h"
34: #include "acct.h"
35: #include "uio.h"
36: #include "file.h"
37: #include "kernel.h"
38: #include "wait.h"
39: #include "ktrace.h"
40:
41: #include "machine/reg.h"
42: #include "machine/pte.h"
43: #include "machine/psl.h"
44: #include "machine/mtpr.h"
45:
46: #define ttystopsigmask (sigmask(SIGTSTP)|sigmask(SIGTTIN)|sigmask(SIGTTOU))
47: #define stopsigmask (sigmask(SIGSTOP)|ttystopsigmask)
48: #define defaultignmask (sigmask(SIGCONT)|sigmask(SIGIO)|sigmask(SIGURG)| \
49: sigmask(SIGCHLD)|sigmask(SIGWINCH)|sigmask(SIGINFO))
50:
51: /*
52: * Can process p send the signal signo to process q?
53: */
54: #define CANSIGNAL(p, q, signo) \
55: ((p)->p_uid == 0 || \
56: (p)->p_ruid == (q)->p_ruid || (p)->p_uid == (q)->p_ruid || \
57: (p)->p_ruid == (q)->p_uid || (p)->p_uid == (q)->p_uid || \
58: ((signo) == SIGCONT && (q)->p_session == (p)->p_session))
59:
60: /* ARGSUSED */
61: sigaction(p, uap, retval)
62: struct proc *p;
63: register struct args {
64: int signo;
65: struct sigaction *nsa;
66: struct sigaction *osa;
67: } *uap;
68: int *retval;
69: {
70: struct sigaction vec;
71: register struct sigaction *sa;
72: register int sig;
73: int bit, error;
74:
75: sig = uap->signo;
76: if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP)
77: return (EINVAL);
78: sa = &vec;
79: if (uap->osa) {
80: sa->sa_handler = u.u_signal[sig];
81: sa->sa_mask = u.u_sigmask[sig];
82: bit = sigmask(sig);
83: sa->sa_flags = 0;
84: if ((u.u_sigonstack & bit) != 0)
85: sa->sa_flags |= SA_ONSTACK;
86: if ((u.u_sigintr & bit) == 0)
87: sa->sa_flags |= SA_RESTART;
88: if (p->p_flag & SNOCLDSTOP)
89: sa->sa_flags |= SA_NOCLDSTOP;
90: if (error = copyout((caddr_t)sa, (caddr_t)uap->osa,
91: sizeof (vec)))
92: return (error);
93: }
94: if (uap->nsa) {
95: if (error = copyin((caddr_t)uap->nsa, (caddr_t)sa,
96: sizeof (vec)))
97: return (error);
98: setsigvec(p, sig, sa);
99: }
100: return (0);
101: }
102:
103: setsigvec(p, sig, sa)
104: register struct proc *p;
105: int sig;
106: register struct sigaction *sa;
107: {
108: register int bit;
109:
110: bit = sigmask(sig);
111: /*
112: * Change setting atomically.
113: */
114: (void) splhigh();
115: u.u_signal[sig] = sa->sa_handler;
116: u.u_sigmask[sig] = sa->sa_mask &~ sigcantmask;
117: if ((sa->sa_flags & SA_RESTART) == 0)
118: u.u_sigintr |= bit;
119: else
120: u.u_sigintr &= ~bit;
121: if (sa->sa_flags & SA_ONSTACK)
122: u.u_sigonstack |= bit;
123: else
124: u.u_sigonstack &= ~bit;
125: if (sig == SIGCHLD) {
126: if (sa->sa_flags & SA_NOCLDSTOP)
127: p->p_flag |= SNOCLDSTOP;
128: else
129: p->p_flag &= ~SNOCLDSTOP;
130: }
131: /*
132: * Set bit in p_sigignore for signals that are set to SIG_IGN,
133: * and for signals set to SIG_DFL where the default is to ignore.
134: * However, don't put SIGCONT in p_sigignore,
135: * as we have to restart the process.
136: */
137: if (sa->sa_handler == SIG_IGN ||
138: (bit & defaultignmask && sa->sa_handler == SIG_DFL)) {
139: p->p_sig &= ~bit; /* never to be seen again */
140: if (sig != SIGCONT)
141: p->p_sigignore |= bit; /* easier in psignal */
142: p->p_sigcatch &= ~bit;
143: } else {
144: p->p_sigignore &= ~bit;
145: if (sa->sa_handler == SIG_DFL)
146: p->p_sigcatch &= ~bit;
147: else
148: p->p_sigcatch |= bit;
149: }
150: (void) spl0();
151: }
152:
153: /*
154: * Initialize signal state for process 0;
155: * set to ignore signals that are ignored by default.
156: */
157: siginit(p)
158: struct proc *p;
159: {
160:
161: p->p_sigignore = defaultignmask &~ sigmask(SIGCONT);
162: }
163:
164: /*
165: * Reset signals for an exec of the specified process.
166: */
167: execsigs(p)
168: register struct proc *p;
169: {
170: register int nc, mask;
171:
172: /*
173: * Reset caught signals. Held signals remain held
174: * through p_sigmask (unless they were caught,
175: * and are now ignored by default).
176: */
177: while (p->p_sigcatch) {
178: nc = ffs((long)p->p_sigcatch);
179: mask = sigmask(nc);
180: p->p_sigcatch &= ~mask;
181: if (mask & defaultignmask) {
182: if (nc != SIGCONT)
183: p->p_sigignore |= mask;
184: p->p_sig &= ~mask;
185: }
186: u.u_signal[nc] = SIG_DFL;
187: }
188: /*
189: * Reset stack state to the user stack.
190: * Clear set of signals caught on the signal stack.
191: */
192: u.u_onstack = 0;
193: u.u_sigsp = 0;
194: u.u_sigonstack = 0;
195: }
196:
197: /*
198: * Manipulate signal mask.
199: * Note that we receive new mask, not pointer,
200: * and return old mask as return value;
201: * the library stub does the rest.
202: */
203: sigprocmask(p, uap, retval)
204: register struct proc *p;
205: struct args {
206: int how;
207: sigset_t mask;
208: } *uap;
209: int *retval;
210: {
211: int error = 0;
212:
213: *retval = p->p_sigmask;
214: (void) splhigh();
215:
216: switch (uap->how) {
217: case SIG_BLOCK:
218: p->p_sigmask |= uap->mask &~ sigcantmask;
219: break;
220:
221: case SIG_UNBLOCK:
222: p->p_sigmask &= ~uap->mask;
223: break;
224:
225: case SIG_SETMASK:
226: p->p_sigmask = uap->mask &~ sigcantmask;
227: break;
228:
229: default:
230: error = EINVAL;
231: break;
232: }
233: (void) spl0();
234: return (error);
235: }
236:
237: /* ARGSUSED */
238: sigpending(p, uap, retval)
239: struct proc *p;
240: void *uap;
241: int *retval;
242: {
243:
244: *retval = p->p_sig;
245: return (0);
246: }
247:
248: #ifdef COMPAT_43
249: /*
250: * Generalized interface signal handler, 4.3-compatible.
251: */
252: /* ARGSUSED */
253: osigvec(p, uap, retval)
254: struct proc *p;
255: register struct args {
256: int signo;
257: struct sigvec *nsv;
258: struct sigvec *osv;
259: } *uap;
260: int *retval;
261: {
262: struct sigvec vec;
263: register struct sigvec *sv;
264: register int sig;
265: int bit, error;
266:
267: sig = uap->signo;
268: if (sig <= 0 || sig >= NSIG || sig == SIGKILL || sig == SIGSTOP)
269: return (EINVAL);
270: sv = &vec;
271: if (uap->osv) {
272: *(sig_t *)&sv->sv_handler = u.u_signal[sig];
273: sv->sv_mask = u.u_sigmask[sig];
274: bit = sigmask(sig);
275: sv->sv_flags = 0;
276: if ((u.u_sigonstack & bit) != 0)
277: sv->sv_flags |= SV_ONSTACK;
278: if ((u.u_sigintr & bit) != 0)
279: sv->sv_flags |= SV_INTERRUPT;
280: if (p->p_flag & SNOCLDSTOP)
281: sv->sv_flags |= SA_NOCLDSTOP;
282: if (error = copyout((caddr_t)sv, (caddr_t)uap->osv,
283: sizeof (vec)))
284: return (error);
285: }
286: if (uap->nsv) {
287: if (error = copyin((caddr_t)uap->nsv, (caddr_t)sv,
288: sizeof (vec)))
289: return (error);
290: sv->sv_flags ^= SA_RESTART; /* opposite of SV_INTERRUPT */
291: setsigvec(p, sig, (struct sigaction *)sv);
292: }
293: return (0);
294: }
295:
296: osigblock(p, uap, retval)
297: register struct proc *p;
298: struct args {
299: int mask;
300: } *uap;
301: int *retval;
302: {
303:
304: (void) splhigh();
305: *retval = p->p_sigmask;
306: p->p_sigmask |= uap->mask &~ sigcantmask;
307: (void) spl0();
308: return (0);
309: }
310:
311: osigsetmask(p, uap, retval)
312: struct proc *p;
313: struct args {
314: int mask;
315: } *uap;
316: int *retval;
317: {
318:
319: (void) splhigh();
320: *retval = p->p_sigmask;
321: p->p_sigmask = uap->mask &~ sigcantmask;
322: (void) spl0();
323: return (0);
324: }
325: #endif
326:
327: /*
328: * Suspend process until signal, providing mask to be set
329: * in the meantime. Note nonstandard calling convention:
330: * libc stub passes mask, not pointer, to save a copyin.
331: */
332: /* ARGSUSED */
333: sigsuspend(p, uap, retval)
334: register struct proc *p;
335: struct args {
336: sigset_t mask;
337: } *uap;
338: int *retval;
339: {
340:
341: /*
342: * When returning from sigpause, we want
343: * the old mask to be restored after the
344: * signal handler has finished. Thus, we
345: * save it here and mark the proc structure
346: * to indicate this (should be in u.).
347: */
348: u.u_oldmask = p->p_sigmask;
349: p->p_flag |= SOMASK;
350: p->p_sigmask = uap->mask &~ sigcantmask;
351: (void) tsleep((caddr_t)&u, PPAUSE | PCATCH, "pause", 0);
352: /* always return EINTR rather than ERESTART... */
353: return (EINTR);
354: }
355:
356: /* ARGSUSED */
357: sigstack(p, uap, retval)
358: struct proc *p;
359: register struct args {
360: struct sigstack *nss;
361: struct sigstack *oss;
362: } *uap;
363: int *retval;
364: {
365: struct sigstack ss;
366: int error = 0;
367:
368: if (uap->oss && (error = copyout((caddr_t)&u.u_sigstack,
369: (caddr_t)uap->oss, sizeof (struct sigstack))))
370: return (error);
371: if (uap->nss && (error = copyin((caddr_t)uap->nss, (caddr_t)&ss,
372: sizeof (ss))) == 0)
373: u.u_sigstack = ss;
374: return (error);
375: }
376:
377: /* ARGSUSED */
378: kill(cp, uap, retval)
379: register struct proc *cp;
380: register struct args {
381: int pid;
382: int signo;
383: } *uap;
384: int *retval;
385: {
386: register struct proc *p;
387:
388: if ((unsigned) uap->signo >= NSIG)
389: return (EINVAL);
390: if (uap->pid > 0) {
391: /* kill single process */
392: p = pfind(uap->pid);
393: if (p == 0)
394: return (ESRCH);
395: if (!CANSIGNAL(cp, p, uap->signo))
396: return (EPERM);
397: if (uap->signo)
398: psignal(p, uap->signo);
399: return (0);
400: }
401: switch (uap->pid) {
402: case -1: /* broadcast signal */
403: return (killpg1(cp, uap->signo, 0, 1));
404: case 0: /* signal own process group */
405: return (killpg1(cp, uap->signo, 0, 0));
406: default: /* negative explicit process group */
407: return (killpg1(cp, uap->signo, -uap->pid, 0));
408: }
409: /* NOTREACHED */
410: }
411:
412: #ifdef COMPAT_43
413: /* ARGSUSED */
414: okillpg(p, uap, retval)
415: struct proc *p;
416: register struct args {
417: int pgid;
418: int signo;
419: } *uap;
420: int *retval;
421: {
422:
423: if ((unsigned) uap->signo >= NSIG)
424: return (EINVAL);
425: return (killpg1(p, uap->signo, uap->pgid, 0));
426: }
427: #endif
428:
429: /*
430: * Common code for kill process group/broadcast kill.
431: * cp is calling process.
432: */
433: killpg1(cp, signo, pgid, all)
434: register struct proc *cp;
435: int signo, pgid, all;
436: {
437: register struct proc *p;
438: struct pgrp *pgrp;
439: int f = 0;
440:
441: if (all)
442: /*
443: * broadcast
444: */
445: for (p = allproc; p != NULL; p = p->p_nxt) {
446: if (p->p_ppid == 0 || p->p_flag&SSYS ||
447: p == u.u_procp || !CANSIGNAL(cp, p, signo))
448: continue;
449: f++;
450: if (signo)
451: psignal(p, signo);
452: }
453: else {
454: if (pgid == 0)
455: /*
456: * zero pgid means send to my process group.
457: */
458: pgrp = u.u_procp->p_pgrp;
459: else {
460: pgrp = pgfind(pgid);
461: if (pgrp == NULL)
462: return (ESRCH);
463: }
464: for (p = pgrp->pg_mem; p != NULL; p = p->p_pgrpnxt) {
465: if (p->p_ppid == 0 || p->p_flag&SSYS ||
466: !CANSIGNAL(cp, p, signo))
467: continue;
468: f++;
469: if (signo)
470: psignal(p, signo);
471: }
472: }
473: return (f ? 0 : ESRCH);
474: }
475:
476: /*
477: * Send the specified signal to
478: * all processes with 'pgid' as
479: * process group.
480: */
481: gsignal(pgid, sig)
482: {
483: struct pgrp *pgrp;
484:
485: if (pgid && (pgrp = pgfind(pgid)))
486: pgsignal(pgrp, sig, 0);
487: }
488:
489: /*
490: * Send sig to every member of a process group.
491: * If checktty is 1, limit to members which have a controlling
492: * terminal.
493: */
494: pgsignal(pgrp, sig, checkctty)
495: struct pgrp *pgrp;
496: {
497: register struct proc *p;
498:
499: if (pgrp)
500: for (p = pgrp->pg_mem; p != NULL; p = p->p_pgrpnxt)
501: if (checkctty == 0 || p->p_flag&SCTTY)
502: psignal(p, sig);
503: }
504:
505: /*
506: * Send a signal caused by a trap to the current process.
507: * If it will be caught immediately, deliver it with correct code.
508: * Otherwise, post it normally.
509: */
510: trapsignal(sig, code)
511: register int sig;
512: unsigned code;
513: {
514: register struct proc *p = u.u_procp; /* XXX */
515: int mask;
516:
517: mask = sigmask(sig);
518: if ((p->p_flag & STRC) == 0 && (p->p_sigcatch & mask) != 0 &&
519: (p->p_sigmask & mask) == 0) {
520: u.u_ru.ru_nsignals++;
521: #ifdef KTRACE
522: if (KTRPOINT(p, KTR_PSIG))
523: ktrpsig(p->p_tracep, sig, u.u_signal[sig],
524: p->p_sigmask, code);
525: #endif
526: sendsig(u.u_signal[sig], sig, p->p_sigmask, code);
527: p->p_sigmask |= u.u_sigmask[sig] | mask;
528: } else {
529: u.u_code = code; /* XXX for core dump/debugger */
530: psignal(p, sig);
531: }
532: }
533:
534: /*
535: * Send the specified signal to the specified process.
536: * Most signals do not do anything directly to a process;
537: * they set a flag that asks the process to do something to itself.
538: * Exceptions:
539: * o When a stop signal is sent to a sleeping process that takes the default
540: * action, the process is stopped without awakening it.
541: * o SIGCONT restarts stopped processes (or puts them back to sleep)
542: * regardless of the signal action (eg, blocked or ignored).
543: * Other ignored signals are discarded immediately.
544: */
545: psignal(p, sig)
546: register struct proc *p;
547: register int sig;
548: {
549: register int s;
550: register sig_t action;
551: int mask;
552:
553: if ((unsigned)sig >= NSIG || sig == 0)
554: panic("psignal sig");
555: mask = sigmask(sig);
556:
557: /*
558: * If proc is traced, always give parent a chance.
559: */
560: if (p->p_flag & STRC)
561: action = SIG_DFL;
562: else {
563: /*
564: * If the signal is being ignored,
565: * then we forget about it immediately.
566: * (Note: we don't set SIGCONT in p_sigignore,
567: * and if it is set to SIG_IGN,
568: * action will be SIG_DFL here.)
569: */
570: if (p->p_sigignore & mask)
571: return;
572: if (p->p_sigmask & mask)
573: action = SIG_HOLD;
574: else if (p->p_sigcatch & mask)
575: action = SIG_CATCH;
576: else
577: action = SIG_DFL;
578: }
579: switch (sig) {
580:
581: case SIGTERM:
582: if ((p->p_flag&STRC) || action != SIG_DFL)
583: break;
584: /* FALLTHROUGH */
585:
586: case SIGKILL:
587: if (p->p_nice > NZERO)
588: p->p_nice = NZERO;
589: break;
590:
591: case SIGCONT:
592: p->p_sig &= ~stopsigmask;
593: break;
594:
595: case SIGTSTP:
596: case SIGTTIN:
597: case SIGTTOU:
598: case SIGSTOP:
599: p->p_sig &= ~sigmask(SIGCONT);
600: break;
601: }
602: p->p_sig |= mask;
603:
604: /*
605: * Defer further processing for signals which are held,
606: * except that stopped processes must be continued by SIGCONT.
607: */
608: if (action == SIG_HOLD && (sig != SIGCONT || p->p_stat != SSTOP))
609: return;
610: s = splhigh();
611: switch (p->p_stat) {
612:
613: case SSLEEP:
614: /*
615: * If process is sleeping uninterruptibly
616: * we can't interrupt the sleep... the signal will
617: * be noticed when the process returns through
618: * trap() or syscall().
619: */
620: if ((p->p_flag & SSINTR) == 0)
621: goto out;
622: /*
623: * Process is sleeping and traced... make it runnable
624: * so it can discover the signal in issig() and stop
625: * for the parent.
626: */
627: if (p->p_flag&STRC)
628: goto run;
629: /*
630: * When a sleeping process receives a stop
631: * signal, process immediately if possible.
632: * All other (caught or default) signals
633: * cause the process to run.
634: */
635: if (mask & stopsigmask) {
636: if (action != SIG_DFL)
637: goto runfast;
638: /*
639: * If a child in vfork(), stopping could
640: * cause deadlock.
641: */
642: if (p->p_flag&SVFORK)
643: goto out;
644: p->p_sig &= ~mask;
645: p->p_xstat = sig;
646: if ((p->p_pptr->p_flag & SNOCLDSTOP) == 0)
647: psignal(p->p_pptr, SIGCHLD);
648: stop(p);
649: goto out;
650: } else
651: goto runfast;
652: /*NOTREACHED*/
653:
654: case SSTOP:
655: /*
656: * If traced process is already stopped,
657: * then no further action is necessary.
658: */
659: if (p->p_flag&STRC)
660: goto out;
661: switch (sig) {
662:
663: case SIGKILL:
664: /*
665: * Kill signal always sets processes running.
666: */
667: goto runfast;
668:
669: case SIGCONT:
670: /*
671: * If SIGCONT is default (or ignored), we continue
672: * the process but don't leave the signal in p_sig,
673: * as it has no further action. If SIGCONT is held,
674: * continue the process and leave the signal in p_sig.
675: * If the process catches SIGCONT, let it handle
676: * the signal itself. If it isn't waiting on
677: * an event, then it goes back to run state.
678: * Otherwise, process goes back to sleep state.
679: */
680: if (action == SIG_DFL)
681: p->p_sig &= ~mask;
682: if (action == SIG_CATCH)
683: goto runfast;
684: if (p->p_wchan == 0)
685: goto run;
686: p->p_stat = SSLEEP;
687: goto out;
688:
689: case SIGSTOP:
690: case SIGTSTP:
691: case SIGTTIN:
692: case SIGTTOU:
693: /*
694: * Already stopped, don't need to stop again.
695: * (If we did the shell could get confused.)
696: */
697: p->p_sig &= ~mask; /* take it away */
698: goto out;
699:
700: default:
701: /*
702: * If process is sleeping interruptibly, then
703: * simulate a wakeup so that when it is continued,
704: * it will be made runnable and can look at the signal.
705: * But don't setrun the process, leave it stopped.
706: */
707: if (p->p_wchan && p->p_flag & SSINTR)
708: unsleep(p);
709: goto out;
710: }
711: /*NOTREACHED*/
712:
713: default:
714: /*
715: * SRUN, SIDL, SZOMB do nothing with the signal,
716: * other than kicking ourselves if we are running.
717: * It will either never be noticed, or noticed very soon.
718: */
719: if (p == u.u_procp && !noproc)
720: aston();
721: goto out;
722: }
723: /*NOTREACHED*/
724:
725: runfast:
726: /*
727: * Raise priority to at least PUSER.
728: */
729: if (p->p_pri > PUSER)
730: p->p_pri = PUSER;
731: run:
732: setrun(p);
733: out:
734: splx(s);
735: }
736:
737: /*
738: * If the current process has a signal to process (should be caught
739: * or cause termination, should interrupt current syscall),
740: * return the signal number. Stop signals with default action
741: * are processed immediately, then cleared; they aren't returned.
742: * This is asked at least once each time a process enters the
743: * system (though this can usually be done without actually
744: * calling issig by checking the pending signal masks.)
745: */
746: issig()
747: {
748: register struct proc *p = u.u_procp; /* XXX */
749: register int sig, mask;
750:
751: for (;;) {
752: mask = p->p_sig &~ p->p_sigmask;
753: if (p->p_flag&SVFORK)
754: mask &= ~stopsigmask;
755: if (mask == 0) /* no signal to send */
756: return (0);
757: sig = ffs((long)mask);
758: mask = sigmask(sig);
759: /*
760: * We should see pending but ignored signals
761: * only if STRC was on when they were posted.
762: */
763: if (mask & p->p_sigignore && (p->p_flag&STRC) == 0) {
764: p->p_sig &= ~mask;
765: continue;
766: }
767: if (p->p_flag&STRC && (p->p_flag&SVFORK) == 0) {
768: /*
769: * If traced, always stop, and stay
770: * stopped until released by the parent.
771: */
772: p->p_xstat = sig;
773: psignal(p->p_pptr, SIGCHLD);
774: do {
775: stop(p);
776: swtch();
777: } while (!procxmt(p) && p->p_flag&STRC);
778:
779: /*
780: * If the traced bit got turned off,
781: * go back up to the top to rescan signals.
782: * This ensures that p_sig* and u_signal are consistent.
783: */
784: if ((p->p_flag&STRC) == 0)
785: continue;
786:
787: /*
788: * If parent wants us to take the signal,
789: * then it will leave it in p->p_xstat;
790: * otherwise we just look for signals again.
791: */
792: p->p_sig &= ~mask; /* clear the old signal */
793: sig = p->p_xstat;
794: if (sig == 0)
795: continue;
796:
797: /*
798: * Put the new signal into p_sig.
799: * If signal is being masked,
800: * look for other signals.
801: */
802: mask = sigmask(sig);
803: p->p_sig |= mask;
804: if (p->p_sigmask & mask)
805: continue;
806: }
807:
808: /*
809: * Decide whether the signal should be returned.
810: * Return the signal's number, or fall through
811: * to clear it from the pending mask.
812: */
813: switch ((int)u.u_signal[sig]) {
814:
815: case SIG_DFL:
816: /*
817: * Don't take default actions on system processes.
818: */
819: if (p->p_ppid == 0)
820: break; /* == ignore */
821: /*
822: * If there is a pending stop signal to process
823: * with default action, stop here,
824: * then clear the signal. However,
825: * if process is member of an orphaned
826: * process group, ignore tty stop signals.
827: */
828: if (mask & stopsigmask) {
829: if (p->p_flag&STRC ||
830: (p->p_pgrp->pg_jobc == 0 &&
831: mask & ttystopsigmask))
832: break; /* == ignore */
833: p->p_xstat = sig;
834: stop(p);
835: if ((p->p_pptr->p_flag & SNOCLDSTOP) == 0)
836: psignal(p->p_pptr, SIGCHLD);
837: swtch();
838: break;
839: } else if (mask & defaultignmask) {
840: /*
841: * Except for SIGCONT, shouldn't get here.
842: * Default action is to ignore; drop it.
843: */
844: break; /* == ignore */
845: } else
846: return (sig);
847: /*NOTREACHED*/
848:
849: case SIG_IGN:
850: /*
851: * Masking above should prevent us ever trying
852: * to take action on an ignored signal other
853: * than SIGCONT, unless process is traced.
854: */
855: if (sig != SIGCONT && (p->p_flag&STRC) == 0)
856: printf("issig\n");
857: break; /* == ignore */
858:
859: default:
860: /*
861: * This signal has an action, let
862: * psig process it.
863: */
864: return (sig);
865: }
866: p->p_sig &= ~mask; /* take the signal! */
867: }
868: /* NOTREACHED */
869: }
870:
871: /*
872: * Put the argument process into the stopped
873: * state and notify the parent via wakeup.
874: * Signals are handled elsewhere.
875: * The process must not be on the run queue.
876: */
877: stop(p)
878: register struct proc *p;
879: {
880:
881: p->p_stat = SSTOP;
882: p->p_flag &= ~SWTED;
883: wakeup((caddr_t)p->p_pptr);
884: }
885:
886: /*
887: * Perform the action specified by the current signal.
888: * The usual sequence is:
889: * if (sig = CURSIG(p))
890: * psig(sig);
891: */
892: psig(sig)
893: register int sig;
894: {
895: register struct proc *p = u.u_procp;
896: int mask, returnmask;
897: register sig_t action;
898:
899: do {
900: #ifdef DIAGNOSTIC
901: if (sig == 0)
902: panic("psig");
903: #endif
904: mask = sigmask(sig);
905: p->p_sig &= ~mask;
906: action = u.u_signal[sig];
907: #ifdef KTRACE
908: if (KTRPOINT(p, KTR_PSIG))
909: ktrpsig(p->p_tracep, sig, action, p->p_flag & SOMASK ?
910: u.u_oldmask : p->p_sigmask, 0);
911: #endif
912: if (action != SIG_DFL) {
913: #ifdef DIAGNOSTIC
914: if (action == SIG_IGN || (p->p_sigmask & mask))
915: panic("psig action");
916: #endif
917: /*
918: * Set the new mask value and also defer further
919: * occurences of this signal.
920: *
921: * Special case: user has done a sigpause. Here the
922: * current mask is not of interest, but rather the
923: * mask from before the sigpause is what we want
924: * restored after the signal processing is completed.
925: */
926: (void) splhigh();
927: if (p->p_flag & SOMASK) {
928: returnmask = u.u_oldmask;
929: p->p_flag &= ~SOMASK;
930: } else
931: returnmask = p->p_sigmask;
932: p->p_sigmask |= u.u_sigmask[sig] | mask;
933: (void) spl0();
934: u.u_ru.ru_nsignals++;
935: sendsig(action, sig, returnmask, 0);
936: continue;
937: }
938: u.u_acflag |= AXSIG;
939: switch (sig) {
940:
941: case SIGILL:
942: case SIGIOT:
943: case SIGBUS:
944: case SIGQUIT:
945: case SIGTRAP:
946: case SIGEMT:
947: case SIGFPE:
948: case SIGSEGV:
949: case SIGSYS:
950: u.u_sig = sig;
951: if (core() == 0)
952: sig |= WCOREFLAG;
953: }
954: exit(p, W_EXITCODE(0, sig));
955: /* NOTREACHED */
956: } while (sig = CURSIG(p));
957: }
958:
959: /*
960: * Create a core image on the file "core".
961: * It writes UPAGES block of the
962: * user.h area followed by the entire
963: * data+stack segments.
964: */
965: core()
966: {
967: register struct vnode *vp;
968: register struct proc *p = u.u_procp;
969: register struct nameidata *ndp = &u.u_nd;
970: struct vattr vattr;
971: int error;
972:
973: if (p->p_svuid != p->p_ruid || p->p_svgid != p->p_rgid)
974: return (EFAULT);
975: if (ctob(UPAGES + u.u_dsize + u.u_ssize) >=
976: u.u_rlimit[RLIMIT_CORE].rlim_cur)
977: return (EFAULT);
978: if (p->p_textp) {
979: VOP_LOCK(p->p_textp->x_vptr);
980: error = VOP_ACCESS(p->p_textp->x_vptr, VREAD, u.u_cred);
981: VOP_UNLOCK(p->p_textp->x_vptr);
982: if (error)
983: return (EFAULT);
984: }
985: ndp->ni_segflg = UIO_SYSSPACE;
986: ndp->ni_dirp = "core";
987: if (error = vn_open(ndp, FCREAT|FWRITE, 0644))
988: return (error);
989: vp = ndp->ni_vp;
990: VOP_LOCK(vp);
991: if (vp->v_type != VREG ||
992: VOP_GETATTR(vp, &vattr, u.u_cred) ||
993: vattr.va_nlink != 1) {
994: vput(vp);
995: return (EFAULT);
996: }
997: #ifdef MAPMEM
998: if (error = mmcore(p)) {
999: vput(vp);
1000: return (error);
1001: }
1002: #endif
1003: VATTR_NULL(&vattr);
1004: vattr.va_size = 0;
1005: VOP_SETATTR(vp, &vattr, u.u_cred);
1006: u.u_acflag |= ACORE;
1007: #ifdef HPUXCOMPAT
1008: /*
1009: * BLETCH! If we loaded from an HPUX format binary file
1010: * we have to dump an HPUX style user struct so that the
1011: * HPUX debuggers can grok it.
1012: */
1013: if (u.u_pcb.pcb_flags & PCB_HPUXBIN)
1014: error = hpuxdumpu(vp, ndp->ni_cred);
1015: else
1016: #endif
1017: error = vn_rdwr(UIO_WRITE, vp, (caddr_t)&u, ctob(UPAGES), (off_t)0,
1018: UIO_SYSSPACE, IO_NODELOCKED|IO_UNIT, ndp->ni_cred, (int *)0);
1019: if (error == 0)
1020: error = vn_rdwr(UIO_WRITE, vp,
1021: (caddr_t)ctob(dptov(p, 0)),
1022: (int)ctob(u.u_dsize), (off_t)ctob(UPAGES), UIO_USERSPACE,
1023: IO_NODELOCKED|IO_UNIT, ndp->ni_cred, (int *)0);
1024: if (error == 0)
1025: error = vn_rdwr(UIO_WRITE, vp,
1026: (caddr_t)ctob(sptov(p, u.u_ssize - 1)),
1027: (int)ctob(u.u_ssize),
1028: (off_t)ctob(UPAGES) + ctob(u.u_dsize), UIO_USERSPACE,
1029: IO_NODELOCKED|IO_UNIT, ndp->ni_cred, (int *)0);
1030: vput(vp);
1031: return (error);
1032: }
1033:
1034: /*
1035: * Nonexistent system call-- signal process (may want to handle it).
1036: * Flag error in case process won't see signal immediately (blocked or ignored).
1037: */
1038: /* ARGSUSED */
1039: nosys(p, args, retval)
1040: struct proc *p;
1041: void *args;
1042: int *retval;
1043: {
1044:
1045: psignal(p, SIGSYS);
1046: return (EINVAL);
1047: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.