| diff -Naur Python-2.7.9-orig/PC/getpathp.c Python-2.7.9/PC/getpathp.c |
| --- Python-2.7.9-orig/PC/getpathp.c 2014-12-11 13:49:49.891400000 +0300 |
| +++ Python-2.7.9/PC/getpathp.c 2014-12-11 13:49:59.579000000 +0300 |
| @@ -98,10 +98,17 @@ |
| |
| # define USE_POSIX_PREFIX |
| |
| +# ifdef Py_ENABLE_SHARED |
| +# define USE_EXEC_PREFIX |
| +# endif |
| + |
| #endif |
| |
| |
| static char prefix[MAXPATHLEN+1]; |
| +#ifdef USE_EXEC_PREFIX |
| +static char exec_prefix[MAXPATHLEN+1]; |
| +#endif |
| static char progpath[MAXPATHLEN+1]; |
| static char dllpath[MAXPATHLEN+1]; |
| static char *module_search_path = NULL; |
| @@ -285,6 +292,82 @@ |
| /* a string loaded from the DLL at startup.*/ |
| extern const char *PyWin_DLLVersionString; |
| |
| +#ifdef USE_EXEC_PREFIX |
| + |
| +/* based on getpath.c but with path relative to executabe */ |
| +/* search_for exec_prefix requires that paths be no more than |
| + MAXPATHLEN bytes long. |
| + return: 1 if found; -1 if found build directory |
| +*/ |
| +static int |
| +search_for_exec_prefix(char *argv0_path, char *home, char *_exec_prefix) |
| +{ |
| + size_t n; |
| + |
| + /* If PYTHONHOME is set, we believe it unconditionally */ |
| + if (home) { |
| + char *delim; |
| + delim = srtchr(home, DELIM); |
| + if (delim) |
| + strncpy(exec_prefix, delim+1, MAXPATHLEN); |
| + else |
| + strncpy(exec_prefix, home, MAXPATHLEN); |
| + join(exec_prefix, lib_python); |
| + join(exec_prefix, "lib-dynload"); |
| + return 1; |
| + } |
| + |
| + /* Check to see if argv[0] is in the build directory. "pybuilddir.txt" |
| + is written by setup.py and contains the relative path to the location |
| + of shared library modules. */ |
| + strcpy(exec_prefix, argv0_path); |
| + join(exec_prefix, "pybuilddir.txt"); |
| + if (exists(exec_prefix)) { |
| + FILE *f = _Py_fopen(exec_prefix, "rb"); |
| + if (f == NULL) |
| + errno = 0; |
| + else { |
| + char buf[MAXPATHLEN+1]; |
| + PyObject *decoded; |
| + char rel_builddir_path[MAXPATHLEN+1]; |
| + n = fread(buf, 1, MAXPATHLEN, f); |
| + buf[n] = '\0'; |
| + fclose(f); |
| + decoded = PyUnicode_DecodeMBCS(buf, n, NULL); |
| + if (decoded != NULL) { |
| + Py_ssize_t k; |
| + k = PyUnicode_AsWideChar(decoded, |
| + rel_builddir_path, MAXPATHLEN); |
| + Py_DECREF(decoded); |
| + if (k >= 0) { |
| + rel_builddir_path[k] = L'\0'; |
| + strcpy(exec_prefix, argv0_path); |
| + join(exec_prefix, rel_builddir_path); |
| + return -1; |
| + } |
| + } |
| + } |
| + } |
| + |
| + /* Search from argv0_path, until root is found */ |
| + strcpy(exec_prefix, argv0_path); |
| + do { |
| + n = strlen(exec_prefix); |
| + join(exec_prefix, lib_python); |
| + join(exec_prefix, "lib-dynload"); |
| + if (exists(exec_prefix)) |
| + return 1; |
| + exec_prefix[n] = '\0'; |
| + reduce(exec_prefix); |
| + } while (exec_prefix[0]); |
| + |
| + /* Configure exec_prefix is unused */ |
| + (void)_exec_prefix; |
| + |
| + /* Fail */ |
| + return 0; |
| +} |
| +#endif /*def USE_EXEC_PREFIX*/ |
| |
| /* Load a PYTHONPATH value from the registry. |
| Load from either HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER. |
| @@ -549,6 +632,9 @@ |
| #ifdef USE_POSIX_PREFIX |
| int pfound; |
| #endif |
| +#ifdef USE_EXEC_PREFIX |
| + int efound; |
| +#endif |
| |
| #ifdef MS_WINDOWS |
| int skiphome, skipdefault; |
| @@ -586,6 +672,16 @@ |
| if (envpath && *envpath == '\0') |
| envpath = NULL; |
| |
| +#ifdef USE_EXEC_PREFIX |
| + efound = search_for_exec_prefix(argv0_path, pythonhome, NULL); |
| + if (!efound) { |
| + strncpy(exec_prefix, argv0_path, MAXPATHLEN); |
| + reduce(exec_prefix); |
| + join(exec_prefix, lib_python); |
| + join(exec_prefix, "lib-dynload"); |
| + } |
| +#endif |
| + |
| #ifdef MS_WINDOWS |
| /* Calculate zip archive path */ |
| if (dllpath[0]) /* use name of python DLL */ |
| @@ -642,6 +738,9 @@ |
| #ifdef USE_POSIX_PREFIX |
| bufsz += strlen(prefix) + 1; |
| #endif |
| +#ifdef USE_EXEC_PREFIX |
| + bufsz +=strlen(exec_prefix) + 1; |
| +#endif |
| bufsz += strlen(PYTHONPATH) + 1; |
| bufsz += strlen(argv0_path) + 1; |
| #ifdef MS_WINDOWS |
| @@ -691,6 +790,11 @@ |
| buf = strchr(buf, '\0'); |
| *buf++ = DELIM; |
| #endif |
| +#ifdef USE_EXEC_PREFIX |
| + strcpy(buf, exec_prefix); |
| + buf = strchr(buf, L'\0'); |
| + *buf++ = DELIM; |
| +#endif |
| if (userpath) { |
| strcpy(buf, userpath); |
| buf = strchr(buf, '\0'); |
| @@ -758,6 +862,17 @@ |
| reduce(prefix); |
| reduce(prefix); |
| } |
| + else |
| + strcpy(prefix, argv0_path); |
| +#endif |
| +#ifdef USE_EXEC_PREFIX |
| + if (efound > 0) { |
| + reduce(exec_prefix); |
| + reduce(exec_prefix); |
| + reduce(exec_prefix); |
| + } |
| + else |
| + strcpy(exec_prefix, argv0_path); |
| #endif |
| if (*prefix=='\0') { |
| char lookBuf[MAXPATHLEN+1]; |
| @@ -809,7 +924,13 @@ |
| char * |
| Py_GetExecPrefix(void) |
| { |
| +#ifdef USE_EXEC_PREFIX |
| + if (!module_search_path) |
| + calculate_path(); |
| + return exec_prefix; |
| +#else |
| return Py_GetPrefix(); |
| +#endif |
| } |
| |
| char * |