summaryrefslogtreecommitdiffstats
path: root/eval.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2012-05-18 08:58:34 -0700
committerKaz Kylheku <kaz@kylheku.com>2012-05-18 08:58:34 -0700
commitf92a6b5a3b9c10d0de19b29a99086a4f033710e5 (patch)
tree79341c7b4659c64eb0e2271cf1fa0bea63f587d9 /eval.c
parent338fa0de2bb5c943775278eef608ce21723cde19 (diff)
downloadtxr-f92a6b5a3b9c10d0de19b29a99086a4f033710e5.tar.gz
txr-f92a6b5a3b9c10d0de19b29a99086a4f033710e5.tar.bz2
txr-f92a6b5a3b9c10d0de19b29a99086a4f033710e5.zip
Implementing new pipe function to get around the limitation
that popen accepts a complete command. We need something which accepts a program name, and a list of arguments, so that we don't have to assemble together a correctly quoted string. popen needs an alternative interface resembling execvp. * eval.c (eval_init): New intrinsic registered, open-pipe-args. * stream.c (struct stdio_handle): New member, pid. (stdio_stream_print): Print the pid, if it is nonzero. (pipevp_close): New close function. (pipe_close): If h->pid is nonzero, it's a new-style pipe, which must be closed with pipev_close. (make_stdio_stream, make_pipe_stream): Initialize new stdio_handle member to zero. (make_pipevp_stream): New static function. (open_pipevp): New function. * stream.h (open_pipevp): Declared. * txr.1: open-pipe-args added to stub section heading.
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/eval.c b/eval.c
index 337f4f80..af8841ac 100644
--- a/eval.c
+++ b/eval.c
@@ -2291,6 +2291,7 @@ void eval_init(void)
reg_fun(intern(lit("open-directory"), user_package), func_n1(open_directory));
reg_fun(intern(lit("open-file"), user_package), func_n2(open_file));
reg_fun(intern(lit("open-pipe"), user_package), func_n2(open_pipe));
+ reg_fun(intern(lit("open-pipe-args"), user_package), func_n3o(open_pipevp, 2));
reg_var(intern(lit("*user-package*"), user_package), &user_package);
reg_var(intern(lit("*keyword-package*"), user_package), &keyword_package);