Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 11 Jul 2015 19:41:31 +0000 (UTC)
From:      Ed Schouten <ed@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r285404 - head/sys/compat/cloudabi
Message-ID:  <201507111941.t6BJfV1a072539@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ed
Date: Sat Jul 11 19:41:31 2015
New Revision: 285404
URL: https://svnweb.freebsd.org/changeset/base/285404

Log:
  Implement normal and abnormal process termination.
  
  CloudABI does not provide an explicit kill() system call, for the reason
  that there is no access to the global process namespace. Instead, it
  offers a raise() system call that can at least be used to terminate the
  process abnormally.
  
  CloudABI does not support installing signal handlers. CloudABI's raise()
  system call should behave as if the default policy is set up. Call into
  kern_sigaction(SIG_DFL) before calling sys_kill() to force this.
  
  Obtained from:	https://github.com/NuxiNL/freebsd

Modified:
  head/sys/compat/cloudabi/cloudabi_proc.c

Modified: head/sys/compat/cloudabi/cloudabi_proc.c
==============================================================================
--- head/sys/compat/cloudabi/cloudabi_proc.c	Sat Jul 11 19:14:09 2015	(r285403)
+++ head/sys/compat/cloudabi/cloudabi_proc.c	Sat Jul 11 19:41:31 2015	(r285404)
@@ -26,6 +26,11 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <sys/param.h>
+#include <sys/proc.h>
+#include <sys/syscallsubr.h>
+#include <sys/sysproto.h>
+
 #include <compat/cloudabi/cloudabi_proto.h>
 
 int
@@ -42,8 +47,8 @@ cloudabi_sys_proc_exit(struct thread *td
     struct cloudabi_sys_proc_exit_args *uap)
 {
 
-	/* Not implemented. */
-	return (ENOSYS);
+	exit1(td, W_EXITCODE(uap->rval, 0));
+	/* NOTREACHED */
 }
 
 int
@@ -59,7 +64,49 @@ int
 cloudabi_sys_proc_raise(struct thread *td,
     struct cloudabi_sys_proc_raise_args *uap)
 {
-
-	/* Not implemented. */
-	return (ENOSYS);
+	static const int signals[] = {
+		[CLOUDABI_SIGABRT] = SIGABRT,
+		[CLOUDABI_SIGALRM] = SIGALRM,
+		[CLOUDABI_SIGBUS] = SIGBUS,
+		[CLOUDABI_SIGCHLD] = SIGCHLD,
+		[CLOUDABI_SIGCONT] = SIGCONT,
+		[CLOUDABI_SIGFPE] = SIGFPE,
+		[CLOUDABI_SIGHUP] = SIGHUP,
+		[CLOUDABI_SIGILL] = SIGILL,
+		[CLOUDABI_SIGINT] = SIGINT,
+		[CLOUDABI_SIGKILL] = SIGKILL,
+		[CLOUDABI_SIGPIPE] = SIGPIPE,
+		[CLOUDABI_SIGQUIT] = SIGQUIT,
+		[CLOUDABI_SIGSEGV] = SIGSEGV,
+		[CLOUDABI_SIGSTOP] = SIGSTOP,
+		[CLOUDABI_SIGSYS] = SIGSYS,
+		[CLOUDABI_SIGTERM] = SIGTERM,
+		[CLOUDABI_SIGTRAP] = SIGTRAP,
+		[CLOUDABI_SIGTSTP] = SIGTSTP,
+		[CLOUDABI_SIGTTIN] = SIGTTIN,
+		[CLOUDABI_SIGTTOU] = SIGTTOU,
+		[CLOUDABI_SIGURG] = SIGURG,
+		[CLOUDABI_SIGUSR1] = SIGUSR1,
+		[CLOUDABI_SIGUSR2] = SIGUSR2,
+		[CLOUDABI_SIGVTALRM] = SIGVTALRM,
+		[CLOUDABI_SIGXCPU] = SIGXCPU,
+		[CLOUDABI_SIGXFSZ] = SIGXFSZ,
+	};
+	static const struct sigaction sigdfl = {
+		.sa_handler = SIG_DFL,
+	};
+	struct kill_args kill_args = {
+		.pid = td->td_proc->p_pid,
+	};
+
+	if (uap->sig >= nitems(signals) ||
+	    (uap->sig != 0 && signals[uap->sig] == 0)) {
+		/* Invalid signal. */
+		return (EINVAL);
+	}
+	kill_args.signum = signals[uap->sig];
+
+	/* Restore to default signal action and send signal. */
+	kern_sigaction(td, kill_args.signum, &sigdfl, NULL, 0);
+	return (sys_kill(td, &kill_args));
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201507111941.t6BJfV1a072539>