diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2016-07-13 06:34:22 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2017-11-16 19:35:00 -0800 |
commit | 8fbee9f4ee25b59a909543f7bb92d472f31ce4ad (patch) | |
tree | 559a8cf7f25b2742e1d7194b8733137e63fa094c | |
parent | 7b8e6c2635358a11818d22b18741db29aca72742 (diff) | |
download | cygnal-8fbee9f4ee25b59a909543f7bb92d472f31ce4ad.tar.gz cygnal-8fbee9f4ee25b59a909543f7bb92d472f31ce4ad.tar.bz2 cygnal-8fbee9f4ee25b59a909543f7bb92d472f31ce4ad.zip |
Implement sh -> cmd.exe translation hack.
* winsup/cygwin/spawn.cc (spawnve): Rewrite /bin/sh -c cmd
invocations to use cmd.exe /c cmd instead.
-rw-r--r-- | winsup/cygwin/spawn.cc | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/winsup/cygwin/spawn.cc b/winsup/cygwin/spawn.cc index f56eb547f..663fde2d3 100644 --- a/winsup/cygwin/spawn.cc +++ b/winsup/cygwin/spawn.cc @@ -873,6 +873,21 @@ spawnve (int mode, const char *path, const char *const *argv, { static char *const empty_env[] = { NULL }; + /* Cygnal hack! If the path is "/bin/sh" and argv is of the three-element + form { "<name>", "-c", "<cmd>" } then let us rewrite argv to: + { "<path-to-cmd.exe>", "/c", "<cmd>" } and invoke "<path-to-cmd.exe>". + This will automatically "port" many programs that use hard-coded /bin/sh + for command execution. For instance, we can use the Cygwin-packaged + gawk.exe binary over Cygnal; awk pipes will work using cmd.exe.*/ + + if (argv[0] && argv[1] && argv[2] && !argv[3] && + !strcmp(path, "/bin/sh") && !strcmp(argv[1], "-c")) + { + const char *argv_sub[3] = { get_cmd_exe_path(), "/c", argv[2] }; + return spawnve (mode, argv_sub[0], + const_cast<const char *const *>(argv_sub), envp); + } + int ret; syscall_printf ("spawnve (%s, %s, %p)", path, argv[0], envp); |