| --- setuptools-5.4.1/launcher.c.orig 2014-06-29 02:40:09.000000000 +0100 |
| +++ setuptools-5.4.1/launcher.c 2014-10-19 13:37:21.272787900 +0100 |
| @@ -104,9 +104,19 @@ |
| } |
| |
| |
| -char *find_exe(char *exename, char *script) { |
| +int file_exists(char* path) |
| +{ |
| + DWORD attrib = GetFileAttributes(path); |
| + |
| + if ((attrib == INVALID_FILE_ATTRIBUTES) || (attrib & FILE_ATTRIBUTE_DIRECTORY)) return 0; |
| + return 1; |
| +} |
| + |
| +char *find_exe(char *exename, char *script, int search_in_path) { |
| char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT]; |
| char path[_MAX_PATH], c, *result; |
| + char *path_env, *path_env_start; |
| + int maximum, needs_exe = 0; |
| |
| /* convert slashes to backslashes for uniform search below */ |
| result = exename; |
| @@ -116,6 +126,34 @@ |
| if (drive[0] || dir[0]=='\\') { |
| return loadable_exe(exename); /* absolute path, use directly */ |
| } |
| + |
| + if (search_in_path) { |
| + if (strstr(exename, ".exe") == NULL) needs_exe = 1; |
| + char *path_env = getenv("PATH"); |
| + while (path_env != NULL) { |
| + path_env_start = path_env; |
| + path_env = strchr(path_env, ';'); |
| + maximum = _MAX_PATH - 2 - strlen(exename) - (needs_exe * strlen(".exe")); |
| + if (path_env == NULL) { |
| + strncpy(path, path_env_start, maximum); |
| + } |
| + else { |
| + maximum = path_env - path_env_start < maximum ? path_env - path_env_start : maximum; |
| + memcpy(path, path_env_start, maximum); |
| + ++path_env; |
| + } |
| + path[maximum] = '\0'; |
| + strcat(path, "\\"); |
| + strcat(path, exename); |
| + if (needs_exe) strcat(path, ".exe"); |
| + /* printf("Checking %s\n", path); */ |
| + if (file_exists(path)) { |
| + /* printf("Found\n"); */ |
| + return loadable_exe(path); |
| + } |
| + } |
| + } |
| + |
| /* Use the script's parent directory, which should be the Python home |
| (This should only be used for bdist_wininst-installed scripts, because |
| easy_install-ed scripts use the absolute path to python[w].exe |
| @@ -206,7 +244,7 @@ |
| // set-up control handler callback funciotn |
| SetConsoleCtrlHandler((PHANDLER_ROUTINE) control_handler, TRUE); |
| if (!CreateProcessA(NULL, commandline, NULL, NULL, TRUE, 0, NULL, NULL, &s_info, &p_info)) { |
| - fprintf(stderr, "failed to create process.\n"); |
| + fprintf(stderr, "failed to create process (%s).\n", commandline); |
| return 0; |
| } |
| child_pid = p_info.dwProcessId; |
| @@ -256,6 +294,9 @@ |
| char *ptr, *end; /* working pointers for string manipulation */ |
| char *cmdline; |
| int i, parsedargc; /* loop counter */ |
| + char *env, *first_space; |
| + int skip = 2; |
| + int search_in_path = 0; |
| |
| /* compute script name from our .exe name*/ |
| GetModuleFileNameA(NULL, script, sizeof(script)); |
| @@ -284,12 +325,24 @@ |
| strcpy(python, "#!python.exe"); |
| } |
| |
| - parsedargs = parse_argv(python+2, &parsedargc); |
| + /* Check if "env" appears before the first space and skip |
| + ahead to the next space. */ |
| + env = strstr(python+skip, "env"); |
| + first_space = strchr(python+skip, ' '); |
| + if (env != NULL && (first_space == NULL || env < first_space)) { |
| + search_in_path = 1; |
| + env += 3; |
| + while (*env && *env != ' ') |
| + ++env; |
| + skip = env - python; |
| + } |
| + |
| + parsedargs = parse_argv(python+skip, &parsedargc); |
| |
| /* Using spawnv() can fail strangely if you e.g. find the Cygwin |
| Python, so we'll make sure Windows can find and load it */ |
| |
| - ptr = find_exe(parsedargs[0], script); |
| + ptr = find_exe(parsedargs[0], script, search_in_path); |
| if (!ptr) { |
| return fail("Cannot find Python executable %s\n", parsedargs[0]); |
| } |