summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/eval.c b/eval.c
index cd40a888..f30e895f 100644
--- a/eval.c
+++ b/eval.c
@@ -32,6 +32,7 @@
#include <setjmp.h>
#include <stdarg.h>
#include <wchar.h>
+#include <signal.h>
#include "config.h"
#ifdef HAVE_UNISTD_H
#include <unistd.h>
@@ -41,6 +42,7 @@
#endif
#include "lib.h"
#include "gc.h"
+#include "signal.h"
#include "unwind.h"
#include "regex.h"
#include "stream.h"
@@ -2095,6 +2097,22 @@ static val daemon_wrap(val nochdir, val noclose)
}
#endif
+static val exit_wrap(val status)
+{
+ int stat;
+
+ if (status == nil)
+ stat = EXIT_FAILURE;
+ else if (status == t)
+ stat = EXIT_SUCCESS;
+ else
+ stat = c_num(status);
+
+ exit(stat);
+ /* notreached */
+ return nil;
+}
+
static void reg_fun(val sym, val fun)
{
sethash(top_fb, sym, cons(sym, fun));
@@ -2591,6 +2609,8 @@ void eval_init(void)
reg_fun(intern(lit("make-time-utc"), user_package), func_n7(make_time_utc));
reg_fun(intern(lit("errno"), user_package), func_n1o(errno_wrap, 0));
+ reg_fun(intern(lit("exit"), user_package), func_n1(exit_wrap));
+
#if HAVE_DAEMON
reg_fun(intern(lit("daemon"), user_package), func_n2(daemon_wrap));
#endif
@@ -2624,6 +2644,12 @@ void eval_init(void)
reg_fun(intern(lit("syslog"), user_package), func_n2v(syslog_wrap));
#endif
+#if HAVE_POSIX_SIGS
+ reg_fun(intern(lit("set-sig-handler"), user_package), func_n2(set_sig_handler));
+ reg_fun(intern(lit("get-sig-handler"), user_package), func_n1(get_sig_handler));
+ reg_fun(intern(lit("sig-check"), user_package), func_n0(sig_check));
+#endif
+
reg_fun(intern(lit("source-loc"), user_package), func_n1(source_loc));
reg_fun(intern(lit("source-loc-str"), user_package), func_n1(source_loc_str));