added my responsibility for the `cpm' port
[unix-history] / sys / kern / kern_sig.c
index 6c1612f..54bb672 100644 (file)
@@ -31,7 +31,7 @@
  * SUCH DAMAGE.
  *
  *     from: @(#)kern_sig.c    7.35 (Berkeley) 6/28/91
  * SUCH DAMAGE.
  *
  *     from: @(#)kern_sig.c    7.35 (Berkeley) 6/28/91
- *     $Id$
+ *     $Id: kern_sig.c,v 1.11 1994/05/05 18:44:13 csgr Exp $
  */
 
 #define        SIGPROP         /* include signal properties table */
  */
 
 #define        SIGPROP         /* include signal properties table */
@@ -43,6 +43,7 @@
 #include "mount.h"
 #include "filedesc.h"
 #include "proc.h"
 #include "mount.h"
 #include "filedesc.h"
 #include "proc.h"
+#include "ucred.h"
 #include "systm.h"
 #include "timeb.h"
 #include "times.h"
 #include "systm.h"
 #include "timeb.h"
 #include "times.h"
@@ -52,6 +53,7 @@
 #include "kernel.h"
 #include "wait.h"
 #include "ktrace.h"
 #include "kernel.h"
 #include "wait.h"
 #include "ktrace.h"
+#include "syslog.h"
 
 #include "machine/cpu.h"
 
 
 #include "machine/cpu.h"
 
 #include "kinfo_proc.h"
 #include "user.h"              /* for coredump */
 
 #include "kinfo_proc.h"
 #include "user.h"              /* for coredump */
 
+static void setsigvec(struct proc *, int, struct sigaction *);
+static void stop(struct proc *);
+static void sigexit(struct proc *, int);
+static int killpg1(struct proc *, int, int, int);
+
 /*
  * Can process p, with pcred pc, send the signal signo to process q?
  */
 /*
  * Can process p, with pcred pc, send the signal signo to process q?
  */
@@ -77,6 +84,7 @@ struct sigaction_args {
 };
 
 /* ARGSUSED */
 };
 
 /* ARGSUSED */
+int
 sigaction(p, uap, retval)
        struct proc *p;
        register struct sigaction_args *uap;
 sigaction(p, uap, retval)
        struct proc *p;
        register struct sigaction_args *uap;
@@ -116,6 +124,7 @@ sigaction(p, uap, retval)
        return (0);
 }
 
        return (0);
 }
 
+void
 setsigvec(p, sig, sa)
        register struct proc *p;
        int sig;
 setsigvec(p, sig, sa)
        register struct proc *p;
        int sig;
@@ -229,6 +238,7 @@ struct sigprocmask_args {
        sigset_t mask;
 };
 
        sigset_t mask;
 };
 
+int
 sigprocmask(p, uap, retval)
        register struct proc *p;
        struct sigprocmask_args *uap;
 sigprocmask(p, uap, retval)
        register struct proc *p;
        struct sigprocmask_args *uap;
@@ -261,6 +271,7 @@ sigprocmask(p, uap, retval)
 }
 
 /* ARGSUSED */
 }
 
 /* ARGSUSED */
+int
 sigpending(p, uap, retval)
        struct proc *p;
        void *uap;
 sigpending(p, uap, retval)
        struct proc *p;
        void *uap;
@@ -283,6 +294,7 @@ struct osigvec_args {
 };
 
 /* ARGSUSED */
 };
 
 /* ARGSUSED */
+int
 osigvec(p, uap, retval)
        struct proc *p;
        register struct osigvec_args *uap;
 osigvec(p, uap, retval)
        struct proc *p;
        register struct osigvec_args *uap;
@@ -327,6 +339,7 @@ struct osigblock_args {
        int     mask;
 };
 
        int     mask;
 };
 
+int
 osigblock(p, uap, retval)
        register struct proc *p;
        struct osigblock_args *uap;
 osigblock(p, uap, retval)
        register struct proc *p;
        struct osigblock_args *uap;
@@ -344,6 +357,7 @@ struct osigsetmask_args {
        int     mask;
 };
 
        int     mask;
 };
 
+int
 osigsetmask(p, uap, retval)
        struct proc *p;
        struct osigsetmask_args *uap;
 osigsetmask(p, uap, retval)
        struct proc *p;
        struct osigsetmask_args *uap;
@@ -369,6 +383,7 @@ struct sigsuspend_args {
 };
 
 /* ARGSUSED */
 };
 
 /* ARGSUSED */
+int
 sigsuspend(p, uap, retval)
        register struct proc *p;
        struct sigsuspend_args *uap;
 sigsuspend(p, uap, retval)
        register struct proc *p;
        struct sigsuspend_args *uap;
@@ -397,6 +412,7 @@ struct sigstack_args {
 };
 
 /* ARGSUSED */
 };
 
 /* ARGSUSED */
+int
 sigstack(p, uap, retval)
        struct proc *p;
        register struct sigstack_args *uap;
 sigstack(p, uap, retval)
        struct proc *p;
        register struct sigstack_args *uap;
@@ -420,6 +436,7 @@ struct kill_args {
 };
 
 /* ARGSUSED */
 };
 
 /* ARGSUSED */
+int
 kill(cp, uap, retval)
        register struct proc *cp;
        register struct kill_args *uap;
 kill(cp, uap, retval)
        register struct proc *cp;
        register struct kill_args *uap;
@@ -460,6 +477,7 @@ struct okillpg_args {
 };
 
 /* ARGSUSED */
 };
 
 /* ARGSUSED */
+int
 okillpg(p, uap, retval)
        struct proc *p;
        register struct okillpg_args *uap;
 okillpg(p, uap, retval)
        struct proc *p;
        register struct okillpg_args *uap;
@@ -476,6 +494,7 @@ okillpg(p, uap, retval)
  * Common code for kill process group/broadcast kill.
  * cp is calling process.
  */
  * Common code for kill process group/broadcast kill.
  * cp is calling process.
  */
+static int
 killpg1(cp, signo, pgid, all)
        register struct proc *cp;
        int signo, pgid, all;
 killpg1(cp, signo, pgid, all)
        register struct proc *cp;
        int signo, pgid, all;
@@ -605,6 +624,10 @@ psignal(p, sig)
        register sig_t action;
        int mask;
 
        register sig_t action;
        int mask;
 
+       /* Ignore signals to system (internal) daemons */
+       if (p->p_flag & SSYS)
+               return;
+
        if ((unsigned)sig >= NSIG || sig == 0)
                panic("psignal sig");
        mask = sigmask(sig);
        if ((unsigned)sig >= NSIG || sig == 0)
                panic("psignal sig");
        mask = sigmask(sig);
@@ -795,6 +818,7 @@ out:
  *     while (sig = CURSIG(curproc))
  *             psig(sig);
  */
  *     while (sig = CURSIG(curproc))
  *             psig(sig);
  */
+int
 issig(p)
        register struct proc *p;
 {
 issig(p)
        register struct proc *p;
 {
@@ -932,6 +956,7 @@ issig(p)
  * Signals are handled elsewhere.
  * The process must not be on the run queue.
  */
  * Signals are handled elsewhere.
  * The process must not be on the run queue.
  */
+static void
 stop(p)
        register struct proc *p;
 {
 stop(p)
        register struct proc *p;
 {
@@ -1012,6 +1037,7 @@ psig(sig)
  * If dumping core, save the signal number for the debugger.
  * Calls exit and does not return.
  */
  * If dumping core, save the signal number for the debugger.
  * Calls exit and does not return.
  */
+static void
 sigexit(p, sig)
        register struct proc *p;
        int sig;
 sigexit(p, sig)
        register struct proc *p;
        int sig;
@@ -1020,6 +1046,14 @@ sigexit(p, sig)
        p->p_acflag |= AXSIG;
        if (sigprop[sig] & SA_CORE) {
                p->p_sigacts->ps_sig = sig;
        p->p_acflag |= AXSIG;
        if (sigprop[sig] & SA_CORE) {
                p->p_sigacts->ps_sig = sig;
+               /*
+                * Log signals which would cause core dumps
+                * (Log as LOG_INFO to appease those who don't want 
+                * these messages.)
+                * XXX : Todo, as well as euid, write out ruid too
+                */
+               log(LOG_INFO, "pid %d: %s: uid %d: exited on signal %d\n",
+                       p->p_pid, p->p_comm, p->p_ucred->cr_uid, sig);
                if (coredump(p) == 0)
                        sig |= WCOREFLAG;
        }
                if (coredump(p) == 0)
                        sig |= WCOREFLAG;
        }
@@ -1037,6 +1071,7 @@ sigexit(p, sig)
  *             or was not produced from the same program,
  *     the link count to the corefile is > 1.
  */
  *             or was not produced from the same program,
  *     the link count to the corefile is > 1.
  */
+int
 coredump(p)
        register struct proc *p;
 {
 coredump(p)
        register struct proc *p;
 {
@@ -1061,12 +1096,12 @@ coredump(p)
        sprintf(name, "%s.core", p->p_comm);
        nd.ni_dirp = name;
        nd.ni_segflg = UIO_SYSSPACE;
        sprintf(name, "%s.core", p->p_comm);
        nd.ni_dirp = name;
        nd.ni_segflg = UIO_SYSSPACE;
-       if ((error = vn_open(&nd, p, FWRITE, 0644)) == 0)
+       if ((error = vn_open(&nd, p, FWRITE, 0600)) == 0)
                exists = 1;
        else
                exists = 0;
        if (error == ENOENT)
                exists = 1;
        else
                exists = 0;
        if (error == ENOENT)
-               error = vn_open(&nd, p, O_CREAT | FWRITE, 0644);
+               error = vn_open(&nd, p, O_CREAT | FWRITE, 0600);
        if (error)
                return (error);
        vp = nd.ni_vp;
        if (error)
                return (error);
        vp = nd.ni_vp;
@@ -1131,6 +1166,7 @@ out:
  * Flag error in case process won't see signal immediately (blocked or ignored).
  */
 /* ARGSUSED */
  * Flag error in case process won't see signal immediately (blocked or ignored).
  */
 /* ARGSUSED */
+int
 nosys(p, args, retval)
        struct proc *p;
        void *args;
 nosys(p, args, retval)
        struct proc *p;
        void *args;