Commit fd21ab7f authored by PJ Eby's avatar PJ Eby

Quote arguments to python.exe (including python's path) to avoid

problems when Python (or a script) is installed in a directory
whose name contains spaces.  :(

--HG--
branch : setuptools
extra : convert_revision : svn%3A6015fed2-1504-0410-9fe1-9d1591cc4771/sandbox/trunk/setuptools%4041460
parent ff0c5cde
/* /* Setuptools Script Launcher for Windows
Setuptools Script Launcher for Windows
This is a stub executable for Windows that functions somewhat like This is a stub executable for Windows that functions somewhat like
Effbot's "exemaker", in that it runs a script with the same name but Effbot's "exemaker", in that it runs a script with the same name but
...@@ -23,7 +22,6 @@ ...@@ -23,7 +22,6 @@
starting. So, we have to use spawnv() and wait for Python to exit before starting. So, we have to use spawnv() and wait for Python to exit before
continuing. :( continuing. :(
*/ */
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h> #include <unistd.h>
...@@ -35,9 +33,11 @@ int fail(char *format, char *data) { ...@@ -35,9 +33,11 @@ int fail(char *format, char *data) {
fprintf(stderr, format, data); fprintf(stderr, format, data);
return 2; return 2;
} }
char *quoted(char *data) {
char *result = calloc(strlen(data)+3,sizeof(char));
strcat(result,"\""); strcat(result,data); strcat(result,"\"");
return result;
}
int run(int argc, char **argv, int is_gui) { int run(int argc, char **argv, int is_gui) {
...@@ -96,19 +96,19 @@ int run(int argc, char **argv, int is_gui) { ...@@ -96,19 +96,19 @@ int run(int argc, char **argv, int is_gui) {
/* Argument array needs to be argc+1 for args, plus 1 for null sentinel */ /* Argument array needs to be argc+1 for args, plus 1 for null sentinel */
newargs = (char **)calloc(argc+2, sizeof(char *)); newargs = (char **)calloc(argc+2, sizeof(char *));
newargs[0] = python; newargs[0] = quoted(python);
newargs[1] = script; newargs[1] = quoted(script);
memcpy(newargs+2, argv+1, (argc-1)*sizeof(char *)); memcpy(newargs+2, argv+1, (argc-1)*sizeof(char *));
newargs[argc+1] = NULL; newargs[argc+1] = NULL;
/* printf("args 0: %s\nargs 1: %s\n", newargs[0], newargs[1]); */ /* printf("args 0: %s\nargs 1: %s\n", newargs[0], newargs[1]); */
if (is_gui) { if (is_gui) {
/* Use exec, we don't need to wait for the GUI to finish */ /* Use exec, we don't need to wait for the GUI to finish */
execv(newargs[0], (const char * const *)(newargs)); execv(python, (const char * const *)(newargs));
return fail("Could not exec %s", python); /* shouldn't get here! */ return fail("Could not exec %s", python); /* shouldn't get here! */
} }
/* We *do* need to wait for a CLI to finish, so use spawn */ /* We *do* need to wait for a CLI to finish, so use spawn */
return spawnv(P_WAIT, newargs[0], (const char * const *)(newargs)); return spawnv(P_WAIT, python, (const char * const *)(newargs));
} }
......
No preview for this file type
No preview for this file type
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment