Fix "tinc start" on Windows when the path contains spaces.
When invoking "tinc start" with spaces in the path, the following happens: > "c:\Program Files (x86)\tinc\tinc.exe" start c:\Program: unrecognized argument 'Files' Try `c:\Program --help' for more information. This is caused by inconsistent handling of command line strings between execvp() and the spawned process' CRT, as documented on MSDN: http://msdn.microsoft.com/library/431x4c1w.aspx
This commit is contained in:
parent
5ffdff685a
commit
b22499668a
1 changed files with 13 additions and 1 deletions
|
@ -810,7 +810,19 @@ static int cmd_start(int argc, char *argv[]) {
|
|||
int nargc = 0;
|
||||
char **nargv = xzalloc((optind + argc) * sizeof *nargv);
|
||||
|
||||
nargv[nargc++] = c;
|
||||
char *arg0 = c;
|
||||
#ifdef HAVE_MINGW
|
||||
/*
|
||||
Windows has no real concept of an "argv array". A command line is just one string.
|
||||
The CRT of the new process will decode the command line string to generate argv before calling main(), and (by convention)
|
||||
it uses quotes to handle spaces in arguments.
|
||||
Therefore we need to quote all arguments that might contain spaces. No, execvp() won't do that for us (see MSDN).
|
||||
If we don't do that, then execvp() will run fine but any spaces in the filename contained in arg0 will bleed
|
||||
into the next arguments when the spawned process' CRT parses its command line, resulting in chaos.
|
||||
*/
|
||||
xasprintf(&arg0, "\"%s\"", arg0);
|
||||
#endif
|
||||
nargv[nargc++] = arg0;
|
||||
for(int i = 1; i < optind; i++)
|
||||
nargv[nargc++] = orig_argv[i];
|
||||
for(int i = 1; i < argc; i++)
|
||||
|
|
Loading…
Reference in a new issue