Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/kern implement sigqueueinfo



details:   https://anonhg.NetBSD.org/src/rev/e5769015138b
branches:  trunk
changeset: 760640:e5769015138b
user:      christos <christos%NetBSD.org@localhost>
date:      Mon Jan 10 04:39:18 2011 +0000

description:
implement sigqueueinfo

diffstat:

 sys/kern/sys_sig.c       |  99 ++++++++++++++++++++++++++++++++++-------------
 sys/kern/syscalls.master |   5 +-
 2 files changed, 75 insertions(+), 29 deletions(-)

diffs (164 lines):

diff -r 70d5e8b0f452 -r e5769015138b sys/kern/sys_sig.c
--- a/sys/kern/sys_sig.c        Mon Jan 10 04:38:37 2011 +0000
+++ b/sys/kern/sys_sig.c        Mon Jan 10 04:39:18 2011 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: sys_sig.c,v 1.29 2010/08/21 13:19:39 pgoyette Exp $    */
+/*     $NetBSD: sys_sig.c,v 1.30 2011/01/10 04:39:18 christos Exp $    */
 
 /*-
  * Copyright (c) 2006, 2007, 2008 The NetBSD Foundation, Inc.
@@ -66,7 +66,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sys_sig.c,v 1.29 2010/08/21 13:19:39 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sys_sig.c,v 1.30 2011/01/10 04:39:18 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -213,56 +213,101 @@
        return 0;
 }
 
-int
-sys_kill(struct lwp *l, const struct sys_kill_args *uap, register_t *retval)
+
+static int
+kill1(struct lwp *l, pid_t pid, ksiginfo_t *ksi, register_t *retval)
 {
-       /* {
-               syscallarg(int) pid;
-               syscallarg(int) signum;
-       } */
-       struct proc     *p;
-       ksiginfo_t      ksi;
-       int signum = SCARG(uap, signum);
        int error;
+       struct proc *p;
+
+       if ((u_int)ksi->ksi_signo >= NSIG)
+               return EINVAL;
+
+       if (ksi->ksi_pid != l->l_proc->p_pid)
+               return EPERM;
 
-       if ((u_int)signum >= NSIG)
-               return EINVAL;
-       KSI_INIT(&ksi);
-       ksi.ksi_signo = signum;
-       ksi.ksi_code = SI_USER;
-       ksi.ksi_pid = l->l_proc->p_pid;
-       ksi.ksi_uid = kauth_cred_geteuid(l->l_cred);
-       if (SCARG(uap, pid) > 0) {
+       if (ksi->ksi_uid != kauth_cred_geteuid(l->l_cred))
+               return EPERM;
+
+       switch (ksi->ksi_code) {
+       case SI_USER:
+       case SI_QUEUE:
+               break;
+       default:
+               return EPERM;
+       }
+               
+       if (pid > 0) {
                /* kill single process */
                mutex_enter(proc_lock);
-               p = proc_find(SCARG(uap, pid));
+               p = proc_find(pid);
                if (p == NULL) {
                        mutex_exit(proc_lock);
                        return ESRCH;
                }
                mutex_enter(p->p_lock);
                error = kauth_authorize_process(l->l_cred,
-                   KAUTH_PROCESS_SIGNAL, p, KAUTH_ARG(signum),
+                   KAUTH_PROCESS_SIGNAL, p, KAUTH_ARG(ksi->ksi_signo),
                    NULL, NULL);
-               if (!error && signum) {
-                       kpsignal2(p, &ksi);
+               if (!error && ksi->ksi_signo) {
+                       kpsignal2(p, ksi);
                }
                mutex_exit(p->p_lock);
                mutex_exit(proc_lock);
                return error;
        }
-       switch (SCARG(uap, pid)) {
+
+       switch (pid) {
        case -1:                /* broadcast signal */
-               return killpg1(l, &ksi, 0, 1);
+               return killpg1(l, ksi, 0, 1);
        case 0:                 /* signal own process group */
-               return killpg1(l, &ksi, 0, 0);
+               return killpg1(l, ksi, 0, 0);
        default:                /* negative explicit process group */
-               return killpg1(l, &ksi, -SCARG(uap, pid), 0);
+               return killpg1(l, ksi, -pid, 0);
        }
        /* NOTREACHED */
 }
 
 int
+sys_sigqueueinfo(struct lwp *l, const struct sys_sigqueueinfo_args *uap,
+    register_t *retval)
+{
+       /* {
+               syscallarg(pid_t int)   pid;
+               syscallarg(const siginfo_t *)   info;
+       } */
+       ksiginfo_t      ksi;
+       int error;
+
+       KSI_INIT(&ksi);
+
+       if ((error = copyin(&SCARG(uap, info)->_info, &ksi.ksi_info,
+           sizeof(ksi.ksi_info))) != 0)
+               return error;
+
+       return kill1(l, SCARG(uap, pid), &ksi, retval);
+}
+
+int
+sys_kill(struct lwp *l, const struct sys_kill_args *uap, register_t *retval)
+{
+       /* {
+               syscallarg(pid_t)       pid;
+               syscallarg(int) signum;
+       } */
+       ksiginfo_t      ksi;
+
+       KSI_INIT(&ksi);
+
+       ksi.ksi_signo = SCARG(uap, signum);
+       ksi.ksi_code = SI_USER;
+       ksi.ksi_pid = l->l_proc->p_pid;
+       ksi.ksi_uid = kauth_cred_geteuid(l->l_cred);
+
+       return kill1(l, SCARG(uap, pid), &ksi, retval);
+}
+
+int
 sys_getcontext(struct lwp *l, const struct sys_getcontext_args *uap,
     register_t *retval)
 {
diff -r 70d5e8b0f452 -r e5769015138b sys/kern/syscalls.master
--- a/sys/kern/syscalls.master  Mon Jan 10 04:38:37 2011 +0000
+++ b/sys/kern/syscalls.master  Mon Jan 10 04:39:18 2011 +0000
@@ -1,4 +1,4 @@
-       $NetBSD: syscalls.master,v 1.239 2010/11/11 14:47:41 pooka Exp $
+       $NetBSD: syscalls.master,v 1.240 2011/01/10 04:39:18 christos Exp $
 
 ;      @(#)syscalls.master     8.2 (Berkeley) 1/13/94
 
@@ -478,7 +478,8 @@
 244    COMPAT_50 MODULAR { int|sys||__sigtimedwait(const sigset_t *set, \
                            siginfo_t *info, \
                            struct timespec50 *timeout); }
-245    UNIMPL          sys_sigqueue
+245    STD             { int|sys||sigqueueinfo(pid_t pid, \
+                           const siginfo_t *info); }
 246    STD RUMP        { int|sys||modctl(int cmd, void *arg); }
 247    STD MODULAR RUMP { int|sys||_ksem_init(unsigned int value, intptr_t *idp); }
 248    STD MODULAR RUMP { int|sys||_ksem_open(const char *name, int oflag, \



Home | Main Index | Thread Index | Old Index