summaryrefslogtreecommitdiffstats
path: root/sysif.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-05-30 06:25:59 -0700
committerKaz Kylheku <kaz@kylheku.com>2019-05-30 06:25:59 -0700
commit39c8698842bc132cbc2f44aadb83f12efc3aa062 (patch)
treee639c0939234dde2087160b5585250a3ce2d29b5 /sysif.c
parent066830f71a917c98a18e5d1c06a9282e82826287 (diff)
downloadtxr-39c8698842bc132cbc2f44aadb83f12efc3aa062.tar.gz
txr-39c8698842bc132cbc2f44aadb83f12efc3aa062.tar.bz2
txr-39c8698842bc132cbc2f44aadb83f12efc3aa062.zip
posix: add close function.
* sysif.c (close_wrap): New static function. (sysif_init): close intrinsic registered. * txr.1: Documented.
Diffstat (limited to 'sysif.c')
-rw-r--r--sysif.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/sysif.c b/sysif.c
index 3556b262..808e0e91 100644
--- a/sysif.c
+++ b/sysif.c
@@ -609,6 +609,22 @@ static val dup_wrap(val old, val neu)
return num(dup2(c_num(old), c_num(neu)));
}
+static val close_wrap(val fd, val throw_on_error)
+{
+ int res = close(c_int(fd, lit("close")));
+
+ if (res < 0) {
+ if (default_null_arg(throw_on_error)) {
+ int eno = errno;
+ uw_throwf(errno_to_file_error(eno), lit("close ~a: ~d/~s"),
+ fd, num(eno), string_utf8(strerror(eno)), nao);
+ }
+ return nil;
+ }
+
+ return t;
+}
+
val exec_wrap(val file, val args_opt)
{
val self = lit("execvp");
@@ -1846,6 +1862,7 @@ void sysif_init(void)
reg_varl(intern(lit("w-continued"), user_package), num_fast(WCONTINUED));
#endif
reg_fun(intern(lit("dupfd"), user_package), func_n2o(dup_wrap, 1));
+ reg_fun(intern(lit("close"), user_package), func_n2o(close_wrap, 1));
#endif
#if HAVE_PIPE
reg_fun(intern(lit("pipe"), user_package), func_n0(pipe_wrap));