> Date: Sat, 13 Aug 2016 12:11:33 +0300 > From: Eli Zaretskii <e...@gnu.org> > Cc: wi...@pobox.com, guile-devel@gnu.org > > > From: Mark H Weaver <m...@netris.org> > > Cc: wi...@pobox.com, guile-devel@gnu.org > > Date: Wed, 10 Aug 2016 13:03:09 -0400 > > > > Eli Zaretskii <e...@gnu.org> writes: > > > > >> Date: Wed, 10 Aug 2016 17:26:15 +0300 > > >> From: Eli Zaretskii <e...@gnu.org> > > >> Cc: wi...@pobox.com, guile-devel@gnu.org > > >> > > >> If you suggest to do what I described above, then I obviously agree. > > > > > > IOW, do you want me to send a patch along the lines I suggested? > > > > Yes, please! > > Will do when I have enough time (correctly quoting command-line > arguments on Windows is a tricky business).
On further thought, I decided to reuse code we already have, rather than write something new. Is the approach below acceptable? If it is, I will post it in Git format wrt the current repo. --- libguile/simpos.c~0 2016-01-02 16:24:55.000000000 +0200 +++ libguile/simpos.c 2016-08-13 13:56:43.014875000 +0300 @@ -45,12 +45,12 @@ # include <sys/wait.h> #endif +#include "posix.h" + #ifdef __MINGW32__ -# include <process.h> /* for spawnvp and friends */ +#include "posix-w32.h" #endif -#include "posix.h" - extern int system(); @@ -124,9 +124,9 @@ SCM_DEFINE (scm_system_star, "system*", SCM oldquit; SCM sigquit; #endif -#ifdef HAVE_FORK int pid; -#else +#ifndef HAVE_FORK + int p1[2], p2[2]; int status; #endif char **execargv; @@ -177,7 +177,21 @@ SCM_DEFINE (scm_system_star, "system*", return scm_from_int (status); } #else /* !HAVE_FORK */ +#ifdef __MINGW32__ + /* MS-Windows spawnvp needs execargv[] strings quoted if they + include special characters, like whitespace. The required + quoting is non-trivial, and also depends on whether + execargv[0] is cmd.exe. So we invoke start_child instead, + which already has all that figured out. */ + pid = start_child (execargv[0], execargv, 0, p1, 0, p2, + fileno (stdin), fileno (stdout), fileno (stderr)); + if (pid == -1) + SCM_SYSERROR; + + waitpid (pid, &status, 0); +#else status = spawnvp (P_WAIT, execargv[0], (const char * const *)execargv); +#endif scm_sigaction (sigint, SCM_CAR (oldint), SCM_CDR (oldint)); #ifdef SIGQUIT scm_sigaction (sigquit, SCM_CAR (oldquit), SCM_CDR (oldquit));