Module Name:    src
Committed By:   christos
Date:           Mon Jan 10 04:39:18 UTC 2011

Modified Files:
        src/sys/kern: sys_sig.c syscalls.master

Log Message:
implement sigqueueinfo


To generate a diff of this commit:
cvs rdiff -u -r1.29 -r1.30 src/sys/kern/sys_sig.c
cvs rdiff -u -r1.239 -r1.240 src/sys/kern/syscalls.master

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/sys_sig.c
diff -u src/sys/kern/sys_sig.c:1.29 src/sys/kern/sys_sig.c:1.30
--- src/sys/kern/sys_sig.c:1.29	Sat Aug 21 09:19:39 2010
+++ src/sys/kern/sys_sig.c	Sun Jan  9 23:39:18 2011
@@ -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)signum >= NSIG)
+	if ((u_int)ksi->ksi_signo >= 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_pid != l->l_proc->p_pid)
+		return EPERM;
+
+	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)
 {

Index: src/sys/kern/syscalls.master
diff -u src/sys/kern/syscalls.master:1.239 src/sys/kern/syscalls.master:1.240
--- src/sys/kern/syscalls.master:1.239	Thu Nov 11 09:47:41 2010
+++ src/sys/kern/syscalls.master	Sun Jan  9 23:39:18 2011
@@ -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, \

Reply via email to