From adeabf115e33a3a2efdf04c6a33fdebccb876ce9 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Fri, 16 Oct 2015 07:12:00 -0700 Subject: Remove use of the system function. System depends on environment variables, and also causes SIGINT and SIGQUIT to be ignored. * stream.c (sh): Function rewritten in terms of sh, in two platform variants. * txr.1: Documented that sh doesn't use system as of TXR 120. --- stream.c | 29 ++++++++++------------------- txr.1 | 25 +++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/stream.c b/stream.c index d001f704..496342ae 100644 --- a/stream.c +++ b/stream.c @@ -3037,21 +3037,6 @@ val open_process(val name, val mode_str, val args) } #endif -static val sh(val command) -{ - char *cmd = utf8_dup_to(c_str(command)); - int status = system(cmd); - if (status < 0) - return nil; -#if HAVE_SYS_WAIT - if (WIFEXITED(status)) { - int exitstatus = WEXITSTATUS(status); - return num(exitstatus); - } -#endif - return status == 0 ? zero : nil; -} - #if HAVE_FORK_STUFF static val run(val name, val args) { @@ -3102,6 +3087,11 @@ static val run(val name, val args) return status == 0 ? zero : nil; } } + +static val sh(val command) +{ + return run(lit("/bin/sh"), list(lit("-c"), command, nao)); +} #elif HAVE_WSPAWN static val run(val command, val args) { @@ -3126,12 +3116,13 @@ static val run(val command, val args) return (status < 0) ? nil : num(status); } -#else -static val run(val command, val args) + +static val sh(val command) { - val win_cmdline = win_make_cmdline(cons(command, default_bool_arg(args))); - return sh(win_cmdline); + return run(lit("cmd.exe"), list(lit("/C"), command, nao)); } +#else +#error port me! #endif val remove_path(val path) diff --git a/txr.1 b/txr.1 index 6be080c6..b662380c 100644 --- a/txr.1 +++ b/txr.1 @@ -32561,6 +32561,31 @@ value from the failed .code exec attempt. +Note: as of \*(TX 120, the +.code sh +function is implemented using +.code run +and not by means of the +.code system +C library function, as previously. The +.code run +function is used to invoke the system interpreter by name. On Unix-like +systems, the string +.code /bin/sh +is assumed to denote the system interpreter, which is expected to +support a pair of arguments +.cblk +.meti -c < command +.cble +to specify the command to be executed. On MS Windows, the interpreter +is assumed to be the relative path name +.code cmd.exe +and expected to support +.cblk +.meti /C < command +.cble +as a way of specifying a command to execute. + .SS* Unix Filesystem Manipulation .coNP Structure @ stat -- cgit v1.2.3