diff -urN Python-3.4.3.orig/configure.ac Python-3.4.3/configure.ac --- Python-3.4.3.orig/configure.ac 2015-03-10 19:54:16.269472000 +0000 +++ Python-3.4.3/configure.ac 2015-03-10 19:54:18.129848200 +0000 @@ -5016,7 +5016,7 @@ case $host in *-*-mingw*) dnl default sys.path calculations for windows platforms - MODULE_GETPATH=PC/getpathp.o + MODULE_GETPATH=Modules/getpath.o ;; esac diff -urN Python-3.4.3.orig/Include/fileutils.h Python-3.4.3/Include/fileutils.h --- Python-3.4.3.orig/Include/fileutils.h 2015-03-10 19:54:16.551268400 +0000 +++ Python-3.4.3/Include/fileutils.h 2015-03-10 19:54:18.129848200 +0000 @@ -15,7 +15,7 @@ const wchar_t *text, size_t *error_pos); -#if defined(HAVE_STAT) && !defined(MS_WINDOWS) +#if defined(HAVE_STAT) && (!defined(MS_WINDOWS) || defined(__MINGW32__)) PyAPI_FUNC(int) _Py_wstat( const wchar_t* path, struct stat *buf); diff -urN Python-3.4.3.orig/Modules/getpath.c Python-3.4.3/Modules/getpath.c --- Python-3.4.3.orig/Modules/getpath.c 2015-03-10 19:54:17.192860200 +0000 +++ Python-3.4.3/Modules/getpath.c 2015-03-10 20:00:49.860494500 +0000 @@ -10,6 +10,10 @@ #include #endif +#ifdef MS_WINDOWS +#include +#endif + /* Search in some common locations for the associated Python libraries. * * Two directories must be found, the platform independent directory @@ -126,9 +130,17 @@ #define LANDMARK L"os.py" #endif +#ifdef __MINGW32__ +#define wcstok(line, delim, pointer) wcstok(line, delim) +#endif + static wchar_t prefix[MAXPATHLEN+1]; static wchar_t exec_prefix[MAXPATHLEN+1]; static wchar_t progpath[MAXPATHLEN+1]; +#ifdef MS_WINDOWS +static wchar_t dllpath[MAXPATHLEN+1]; +extern HANDLE PyWin_DLLhModule; +#endif static wchar_t *module_search_path = NULL; static void @@ -137,7 +149,7 @@ size_t i = wcslen(dir); while (i > 0 && dir[i] != SEP) --i; - dir[i] = '\0'; + dir[i] = 0; } static int @@ -455,6 +479,26 @@ return 0; } +#ifdef MS_WINDOWS +/* Calculates dllpath and progpath, replacing \\ with / */ +int GetWindowsModulePaths() +{ + int result = 0; + result = GetModuleFileNameW(NULL, progpath, MAXPATHLEN); + Py_NormalizeSepsW(progpath); + dllpath[0] = 0; +#ifdef Py_ENABLE_SHARED + if (PyWin_DLLhModule) { + if((GetModuleFileNameW(PyWin_DLLhModule, dllpath, MAXPATHLEN) > 0)) { + result = 1; + Py_NormalizeSepsW(dllpath); + } + } +#endif + return result; +} +#endif /* MS_WINDOWS */ + static void calculate_path(void) { @@ -533,6 +577,10 @@ } } #endif /* __APPLE__ */ +#ifdef MS_WINDOWS + else if(GetWindowsModulePaths()) { + } +#endif /* MS_WINDOWS */ else if (path) { while (1) { wchar_t *delim = wcschr(path, DELIM); @@ -871,7 +923,45 @@ } -#ifdef __cplusplus +#ifdef MS_WINDOWS +/* Load python3.dll before loading any extension module that might refer + to it. That way, we can be sure that always the python3.dll corresponding + to this python DLL is loaded, not a python3.dll that might be on the path + by chance. + Return whether the DLL was found. +*/ +static int python3_checked = 0; +static HANDLE hPython3; +int +_Py_CheckPython3() +{ + wchar_t py3path[MAXPATHLEN+1]; + wchar_t *s; + if (python3_checked) + return hPython3 != NULL; + python3_checked = 1; + + /* If there is a python3.dll next to the python3y.dll, + assume this is a build tree; use that DLL */ + wcscpy(py3path, dllpath); + s = wcsrchr(py3path, Py_GetSepW(py3path)); + if (!s) + s = py3path; + else + s += 1; + wcscpy(s, L"python3.dll"); + hPython3 = LoadLibraryExW(py3path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); + if (hPython3 != NULL) + return 1; + + /* Check sys.prefix\DLLs\python3.dll */ + wcscpy(py3path, Py_GetPrefix()); + wcscat(py3path, L"\\DLLs\\python3.dll"); + hPython3 = LoadLibraryExW(py3path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH); + return hPython3 != NULL; } #endif +#ifdef __cplusplus +} +#endif diff -urN Python-3.4.3.orig/Modules/posixmodule.c Python-3.4.3/Modules/posixmodule.c --- Python-3.4.3.orig/Modules/posixmodule.c 2015-03-10 19:54:17.083661600 +0000 +++ Python-3.4.3/Modules/posixmodule.c 2015-03-10 19:54:18.145448000 +0000 @@ -1042,7 +1042,7 @@ } /* A helper used by a number of POSIX-only functions */ -#ifndef MS_WINDOWS +#if !defined(MS_WINDOWS) || defined(__MINGW32__) static int _parse_off_t(PyObject* arg, void* addr) { @@ -3710,7 +3710,7 @@ Py_END_ALLOW_THREADS /* FindNextFile sets error to ERROR_NO_MORE_FILES if it got to the end of the directory. */ - if (!result && GetLastError() != ERROR_NO_MORE_FILES) { + if (!result && GetLastError() != 0 && GetLastError() != ERROR_NO_MORE_FILES) { Py_DECREF(list); list = path_error(path); goto exit; @@ -3765,7 +3765,7 @@ Py_END_ALLOW_THREADS /* FindNextFile sets error to ERROR_NO_MORE_FILES if it got to the end of the directory. */ - if (!result && GetLastError() != ERROR_NO_MORE_FILES) { + if (!result && GetLastError() != 0 && GetLastError() != ERROR_NO_MORE_FILES) { Py_DECREF(list); list = path_error(path); goto exit; diff -urN a/Python/fileutils.c b/Python/fileutils.c --- a/Python/fileutils.c 2014-10-11 14:21:34.292127100 +0100 +++ b/Python/fileutils.c 2014-10-11 14:21:37.011282600 +0100 @@ -511,7 +511,7 @@ Not sure whether the MS_WINDOWS guards are necessary: perhaps for cygwin/mingw builds? */ -#if defined(HAVE_STAT) && !defined(MS_WINDOWS) +#if defined(HAVE_STAT) && (!defined(MS_WINDOWS) || defined(__MINGW32__)) /* Get file status. Encode the path to the locale encoding. */