1582646aecc3776109b784e1638849ea9c6389a55Guido van Rossum/* Return the initial module search path. */ 2582646aecc3776109b784e1638849ea9c6389a55Guido van Rossum 3667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum#include "Python.h" 4667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum#include "osdefs.h" 5667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 6305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum#include <sys/types.h> 721f8497a46f30eebe1ec2a6846dd899bb77bb675Guido van Rossum#include <string.h> 8667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 9f6af76da61fcbd9e6f0d43dcbd236864e12ec334Brett Cannon#ifdef __APPLE__ 1054ecc3d24f52ae45ca54a24167e434915c88b60fGuido van Rossum#include <mach-o/dyld.h> 1154ecc3d24f52ae45ca54a24167e434915c88b60fGuido van Rossum#endif 1254ecc3d24f52ae45ca54a24167e434915c88b60fGuido van Rossum 13305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum/* Search in some common locations for the associated Python libraries. 14305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum * 15305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum * Two directories must be found, the platform independent directory 1690126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * (prefix), containing the common .py and .pyc files, and the platform 1790126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * dependent directory (exec_prefix), containing the shared library 1890126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * modules. Note that prefix and exec_prefix can be the same directory, 1990126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * but for some installations, they are different. 20305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum * 2190126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * Py_GetPath() carries out separate searches for prefix and exec_prefix. 2290126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * Each search tries a number of different locations until a ``landmark'' 2390126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * file or directory is found. If no prefix or exec_prefix is found, a 2490126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * warning message is issued and the preprocessor defined PREFIX and 2590126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * EXEC_PREFIX are used (even though they will not work); python carries on 2690126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * as best as is possible, but most imports will fail. 27305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum * 28305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum * Before any searches are done, the location of the executable is 29d8faa3654c2887eaa146dcdb553a9f9793bd2e5aGuido van Rossum * determined. If argv[0] has one or more slashes in it, it is used 3090126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * unchanged. Otherwise, it must have been invoked from the shell's path, 3190126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * so we search $PATH for the named executable and use that. If the 3290126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * executable was not found on $PATH (or there was no $PATH environment 3390126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * variable), the original argv[0] string is used. 34305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum * 3590126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * Next, the executable location is examined to see if it is a symbolic 3690126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * link. If so, the link is chased (correctly interpreting a relative 3790126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * pathname if one is found) and the directory of the link target is used. 38305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum * 3990126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * Finally, argv0_path is set to the directory containing the executable 4090126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * (i.e. the last component is stripped). 41305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum * 4290126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * With argv0_path in hand, we perform a number of steps. The same steps 4390126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * are performed for prefix and for exec_prefix, but with a different 4490126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * landmark. 45305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum * 46305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum * Step 1. Are we running python out of the build directory? This is 47305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum * checked by looking for a different kind of landmark relative to 4890126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * argv0_path. For prefix, the landmark's path is derived from the VPATH 4990126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * preprocessor variable (taking into account that its value is almost, but 5090126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * not quite, what we need). For exec_prefix, the landmark is 51eba57b6f3a7deca951b0f98b83893f0c99a1002bAntoine Pitrou * pybuilddir.txt. If the landmark is found, we're done. 52305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum * 53305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum * For the remaining steps, the prefix landmark will always be 54847a9968e9289376d47e87ecdd374d280016bd8aJeremy Hylton * lib/python$VERSION/os.py and the exec_prefix will always be 55266033e89b52b1ed6264cb0dc3aacd4ab185ed23Guido van Rossum * lib/python$VERSION/lib-dynload, where $VERSION is Python's version 5690126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * number as supplied by the Makefile. Note that this means that no more 5790126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * build directory checking is performed; if the first step did not find 5890126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * the landmarks, the assumption is that python is running from an 5990126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * installed setup. 60305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum * 61305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum * Step 2. See if the $PYTHONHOME environment variable points to the 6290126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * installed location of the Python libraries. If $PYTHONHOME is set, then 6390126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * it points to prefix and exec_prefix. $PYTHONHOME can be a single 6490126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * directory, which is used for both, or the prefix and exec_prefix 6590126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * directories separated by a colon. 66305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum * 67305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum * Step 3. Try to find prefix and exec_prefix relative to argv0_path, 6890126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * backtracking up the path until it is exhausted. This is the most common 6990126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * step to succeed. Note that if prefix and exec_prefix are different, 7090126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * exec_prefix is more likely to be found; however if exec_prefix is a 7190126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * subdirectory of prefix, both will be found. 72305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum * 7390126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * Step 4. Search the directories pointed to by the preprocessor variables 7490126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * PREFIX and EXEC_PREFIX. These are supplied by the Makefile but can be 7590126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * passed in as options to the configure script. 76305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum * 7790126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * That's it! 7890126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * 7990126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * Well, almost. Once we have determined prefix and exec_prefix, the 807e47402264cf87b9bbb61fc9ff610af08add7c7bThomas Wouters * preprocessor variable PYTHONPATH is used to construct a path. Each 8190126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * relative path on PYTHONPATH is prefixed with prefix. Then the directory 8290126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * containing the shared library modules is appended. The environment 8390126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * variable $PYTHONPATH is inserted in front of it all. Finally, the 8490126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * prefix and exec_prefix globals are tweaked so they reflect the values 8590126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * expected by other code, by stripping the "lib/python$VERSION/..." stuff 8690126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * off. If either points to the build directory, the globals are reset to 8790126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * the corresponding preprocessor variables (so sys.prefix will reflect the 8890126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * installation location, even though sys.path points into the build 8990126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * directory). This seems to make more sense given that currently the only 9090126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * known use of sys.prefix and sys.exec_prefix is for the ILU installation 9190126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw * process to find the installed Python tree. 92eba57b6f3a7deca951b0f98b83893f0c99a1002bAntoine Pitrou * 933b69db27d70f05584b76ece61bb882c26ecfcc68Kristján Valur Jónsson * An embedding application can use Py_SetPath() to override all of 943b69db27d70f05584b76ece61bb882c26ecfcc68Kristján Valur Jónsson * these authomatic path computations. 953b69db27d70f05584b76ece61bb882c26ecfcc68Kristján Valur Jónsson * 96eba57b6f3a7deca951b0f98b83893f0c99a1002bAntoine Pitrou * NOTE: Windows MSVC builds use PC/getpathp.c instead! 9790126035cab1aad6edbc62376a9ff9cb0453523fBarry Warsaw */ 98305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum 9949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus 10049fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters extern "C" { 10149fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif 10249fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 10349fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 104f5854148138280c69fdc9d350636dc2140d57753Benjamin Peterson#if !defined(PREFIX) || !defined(EXEC_PREFIX) || !defined(VERSION) || !defined(VPATH) 105f5854148138280c69fdc9d350636dc2140d57753Benjamin Peterson#error "PREFIX, EXEC_PREFIX, VERSION, and VPATH must be constant defined" 106305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum#endif 107667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum 108305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum#ifndef LANDMARK 109790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis#define LANDMARK L"os.py" 110305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum#endif 111e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossum 112790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisstatic wchar_t prefix[MAXPATHLEN+1]; 113790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisstatic wchar_t exec_prefix[MAXPATHLEN+1]; 114790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisstatic wchar_t progpath[MAXPATHLEN+1]; 115790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisstatic wchar_t *module_search_path = NULL; 116790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis 11791afbb60885d5904dc6cb4d063ae33454507bf71Victor Stinner/* Get file status. Encode the path to the locale encoding. */ 11891afbb60885d5904dc6cb4d063ae33454507bf71Victor Stinner 11991afbb60885d5904dc6cb4d063ae33454507bf71Victor Stinnerstatic int 12091afbb60885d5904dc6cb4d063ae33454507bf71Victor Stinner_Py_wstat(const wchar_t* path, struct stat *buf) 12191afbb60885d5904dc6cb4d063ae33454507bf71Victor Stinner{ 12291afbb60885d5904dc6cb4d063ae33454507bf71Victor Stinner int err; 12391afbb60885d5904dc6cb4d063ae33454507bf71Victor Stinner char *fname; 12491afbb60885d5904dc6cb4d063ae33454507bf71Victor Stinner fname = Py_EncodeLocale(path, NULL); 12591afbb60885d5904dc6cb4d063ae33454507bf71Victor Stinner if (fname == NULL) { 12691afbb60885d5904dc6cb4d063ae33454507bf71Victor Stinner errno = EINVAL; 12791afbb60885d5904dc6cb4d063ae33454507bf71Victor Stinner return -1; 12891afbb60885d5904dc6cb4d063ae33454507bf71Victor Stinner } 12991afbb60885d5904dc6cb4d063ae33454507bf71Victor Stinner err = stat(fname, buf); 13091afbb60885d5904dc6cb4d063ae33454507bf71Victor Stinner PyMem_Free(fname); 13191afbb60885d5904dc6cb4d063ae33454507bf71Victor Stinner return err; 13291afbb60885d5904dc6cb4d063ae33454507bf71Victor Stinner} 13391afbb60885d5904dc6cb4d063ae33454507bf71Victor Stinner 134305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossumstatic void 135790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisreduce(wchar_t *dir) 136305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum{ 137790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis size_t i = wcslen(dir); 138edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake while (i > 0 && dir[i] != SEP) 139edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake --i; 140edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake dir[i] = '\0'; 141305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum} 142d29806c37e69042bb6dcaded85beaeef790db605Guido van Rossum 143d29806c37e69042bb6dcaded85beaeef790db605Guido van Rossumstatic int 144790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisisfile(wchar_t *filename) /* Is file, not directory */ 145d29806c37e69042bb6dcaded85beaeef790db605Guido van Rossum{ 146edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake struct stat buf; 1474e31443c4d2c1fb211a6ea90fc6a8fbd9ff81c97Victor Stinner if (_Py_wstat(filename, &buf) != 0) 148edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return 0; 149edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (!S_ISREG(buf.st_mode)) 150edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return 0; 151edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return 1; 152d29806c37e69042bb6dcaded85beaeef790db605Guido van Rossum} 153d29806c37e69042bb6dcaded85beaeef790db605Guido van Rossum 154d29806c37e69042bb6dcaded85beaeef790db605Guido van Rossum 155d29806c37e69042bb6dcaded85beaeef790db605Guido van Rossumstatic int 156f299abdafa0f2b6eb7abae274861b19b361c96bcBrett Cannonismodule(wchar_t *filename) /* Is module -- check for .pyc too */ 157d29806c37e69042bb6dcaded85beaeef790db605Guido van Rossum{ 158edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (isfile(filename)) 159edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return 1; 160edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 161edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake /* Check for the compiled version of prefix. */ 162790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis if (wcslen(filename) < MAXPATHLEN) { 163f299abdafa0f2b6eb7abae274861b19b361c96bcBrett Cannon wcscat(filename, L"c"); 164edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (isfile(filename)) 165edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return 1; 166edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake } 167edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return 0; 168d29806c37e69042bb6dcaded85beaeef790db605Guido van Rossum} 169d29806c37e69042bb6dcaded85beaeef790db605Guido van Rossum 170d29806c37e69042bb6dcaded85beaeef790db605Guido van Rossum 171d29806c37e69042bb6dcaded85beaeef790db605Guido van Rossumstatic int 172790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisisxfile(wchar_t *filename) /* Is executable file */ 173d29806c37e69042bb6dcaded85beaeef790db605Guido van Rossum{ 174edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake struct stat buf; 1754e31443c4d2c1fb211a6ea90fc6a8fbd9ff81c97Victor Stinner if (_Py_wstat(filename, &buf) != 0) 176edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return 0; 177edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (!S_ISREG(buf.st_mode)) 178edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return 0; 179edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if ((buf.st_mode & 0111) == 0) 180edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return 0; 181edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return 1; 182d29806c37e69042bb6dcaded85beaeef790db605Guido van Rossum} 183d29806c37e69042bb6dcaded85beaeef790db605Guido van Rossum 184305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum 185305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossumstatic int 186790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisisdir(wchar_t *filename) /* Is directory */ 187305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum{ 188edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake struct stat buf; 1894e31443c4d2c1fb211a6ea90fc6a8fbd9ff81c97Victor Stinner if (_Py_wstat(filename, &buf) != 0) 190edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return 0; 191edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (!S_ISDIR(buf.st_mode)) 192edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return 0; 193edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return 1; 194305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum} 195305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum 196305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum 197ec8c5a931136b61231b295f2aded8dc04035e9b7Tim Peters/* Add a path component, by appending stuff to buffer. 198ec8c5a931136b61231b295f2aded8dc04035e9b7Tim Peters buffer must have at least MAXPATHLEN + 1 bytes allocated, and contain a 199ec8c5a931136b61231b295f2aded8dc04035e9b7Tim Peters NUL-terminated string with no more than MAXPATHLEN characters (not counting 200ec8c5a931136b61231b295f2aded8dc04035e9b7Tim Peters the trailing NUL). It's a fatal error if it contains a string longer than 201ec8c5a931136b61231b295f2aded8dc04035e9b7Tim Peters that (callers must be careful!). If these requirements are met, it's 202ec8c5a931136b61231b295f2aded8dc04035e9b7Tim Peters guaranteed that buffer will still be a NUL-terminated string with no more 203ec8c5a931136b61231b295f2aded8dc04035e9b7Tim Peters than MAXPATHLEN characters at exit. If stuff is too long, only as much of 204ec8c5a931136b61231b295f2aded8dc04035e9b7Tim Peters stuff as fits will be appended. 2056372fe1e40385d5d37bb938688e7bd5ecd2517beJeremy Hylton*/ 206305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossumstatic void 207790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisjoinpath(wchar_t *buffer, wchar_t *stuff) 208305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum{ 209edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake size_t n, k; 210edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (stuff[0] == SEP) 211edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake n = 0; 212edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake else { 213790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis n = wcslen(buffer); 214edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (n > 0 && buffer[n-1] != SEP && n < MAXPATHLEN) 215edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake buffer[n++] = SEP; 216edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake } 217ec8c5a931136b61231b295f2aded8dc04035e9b7Tim Peters if (n > MAXPATHLEN) 218f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou Py_FatalError("buffer overflow in getpath.c's joinpath()"); 219790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis k = wcslen(stuff); 220edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (n + k > MAXPATHLEN) 221edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake k = MAXPATHLEN - n; 222790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis wcsncpy(buffer+n, stuff, k); 223edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake buffer[n+k] = '\0'; 224305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum} 225305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum 226e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossum/* copy_absolute requires that path be allocated at least 227e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossum MAXPATHLEN + 1 bytes and that p be no more than MAXPATHLEN bytes. */ 2287198ba986d7174e9b36ec63664f340d53a5a2af3Jeremy Hyltonstatic void 229f4061dac607d9bc2b3af0b72da5e8917428d869eVictor Stinnercopy_absolute(wchar_t *path, wchar_t *p, size_t pathlen) 2307198ba986d7174e9b36ec63664f340d53a5a2af3Jeremy Hylton{ 231e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossum if (p[0] == SEP) 232790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis wcscpy(path, p); 2337198ba986d7174e9b36ec63664f340d53a5a2af3Jeremy Hylton else { 234f4061dac607d9bc2b3af0b72da5e8917428d869eVictor Stinner if (!_Py_wgetcwd(path, pathlen)) { 2354f3abb0f091b14e09d257ee4eb40632471177d6dVictor Stinner /* unable to get the current directory */ 2364f3abb0f091b14e09d257ee4eb40632471177d6dVictor Stinner wcscpy(path, p); 2374f3abb0f091b14e09d257ee4eb40632471177d6dVictor Stinner return; 2384f3abb0f091b14e09d257ee4eb40632471177d6dVictor Stinner } 239e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossum if (p[0] == '.' && p[1] == SEP) 240e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossum p += 2; 241e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossum joinpath(path, p); 2427198ba986d7174e9b36ec63664f340d53a5a2af3Jeremy Hylton } 2437198ba986d7174e9b36ec63664f340d53a5a2af3Jeremy Hylton} 244305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum 245e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossum/* absolutize() requires that path be allocated at least MAXPATHLEN+1 bytes. */ 246e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossumstatic void 247790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwisabsolutize(wchar_t *path) 248e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossum{ 249f4061dac607d9bc2b3af0b72da5e8917428d869eVictor Stinner wchar_t buffer[MAXPATHLEN+1]; 250e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossum 251e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossum if (path[0] == SEP) 252e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossum return; 253f4061dac607d9bc2b3af0b72da5e8917428d869eVictor Stinner copy_absolute(buffer, path, MAXPATHLEN+1); 254790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis wcscpy(path, buffer); 255e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossum} 256e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossum 2577ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip/* search for a prefix value in an environment file. If found, copy it 2587ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip to the provided buffer, which is expected to be no more than MAXPATHLEN 2597ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip bytes long. 2607ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip*/ 2617ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip 2627ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajipstatic int 2637ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajipfind_env_config_value(FILE * env_file, const wchar_t * key, wchar_t * value) 2647ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip{ 2657ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip int result = 0; /* meaning not found */ 2667ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip char buffer[MAXPATHLEN*2+1]; /* allow extra for key, '=', etc. */ 2677ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip 2687ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip fseek(env_file, 0, SEEK_SET); 2697ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip while (!feof(env_file)) { 2707ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip char * p = fgets(buffer, MAXPATHLEN*2, env_file); 2717ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip wchar_t tmpbuffer[MAXPATHLEN*2+1]; 2727ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip PyObject * decoded; 2737ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip int n; 2747ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip 2757ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip if (p == NULL) 2767ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip break; 2777ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip n = strlen(p); 2787ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip if (p[n - 1] != '\n') { 2797ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip /* line has overflowed - bail */ 2807ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip break; 2817ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip } 2827ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip if (p[0] == '#') /* Comment - skip */ 2837ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip continue; 2847ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip decoded = PyUnicode_DecodeUTF8(buffer, n, "surrogateescape"); 2857ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip if (decoded != NULL) { 2867ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip Py_ssize_t k; 2877ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip wchar_t * state; 2887ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip k = PyUnicode_AsWideChar(decoded, 2897ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip tmpbuffer, MAXPATHLEN * 2); 2907ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip Py_DECREF(decoded); 2917ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip if (k >= 0) { 2927ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip wchar_t * tok = wcstok(tmpbuffer, L" \t\r\n", &state); 2937ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip if ((tok != NULL) && !wcscmp(tok, key)) { 2947ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip tok = wcstok(NULL, L" \t", &state); 2957ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip if ((tok != NULL) && !wcscmp(tok, L"=")) { 2967ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip tok = wcstok(NULL, L"\r\n", &state); 2977ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip if (tok != NULL) { 2987ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip wcsncpy(value, tok, MAXPATHLEN); 2997ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip result = 1; 3007ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip break; 3017ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip } 3027ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip } 3037ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip } 3047ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip } 3057ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip } 3067ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip } 3077ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip return result; 3087ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip} 3097ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip 310e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossum/* search_for_prefix requires that argv0_path be no more than MAXPATHLEN 3116372fe1e40385d5d37bb938688e7bd5ecd2517beJeremy Hylton bytes long. 3126372fe1e40385d5d37bb938688e7bd5ecd2517beJeremy Hylton*/ 313305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossumstatic int 314ce4179d0226768988965ac238ad15791cd377defVictor Stinnersearch_for_prefix(wchar_t *argv0_path, wchar_t *home, wchar_t *_prefix, 315ce4179d0226768988965ac238ad15791cd377defVictor Stinner wchar_t *lib_python) 316305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum{ 317edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake size_t n; 318790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis wchar_t *vpath; 319edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 320edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake /* If PYTHONHOME is set, we believe it unconditionally */ 321edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (home) { 322790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis wchar_t *delim; 323790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis wcsncpy(prefix, home, MAXPATHLEN); 32460a60677093e2792439c9e34debe6d55feead63fChristian Heimes prefix[MAXPATHLEN] = L'\0'; 325790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis delim = wcschr(prefix, DELIM); 326edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (delim) 327790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis *delim = L'\0'; 328edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake joinpath(prefix, lib_python); 329edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake joinpath(prefix, LANDMARK); 330edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return 1; 331edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake } 332edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 333edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake /* Check to see if argv[0] is in the build directory */ 33460a60677093e2792439c9e34debe6d55feead63fChristian Heimes wcsncpy(prefix, argv0_path, MAXPATHLEN); 33560a60677093e2792439c9e34debe6d55feead63fChristian Heimes prefix[MAXPATHLEN] = L'\0'; 336790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis joinpath(prefix, L"Modules/Setup"); 337edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (isfile(prefix)) { 3386cf0702a79541eedbc87e4b3727db0d73f72e68dNeil Schemenauer /* Check VPATH to see if argv0_path is in the build directory. */ 339f6a271ae980d2f3fb450f745b8f87624378156c4Victor Stinner vpath = Py_DecodeLocale(VPATH, NULL); 3402158231433c19e1e8eec24d8d053da2a02256747Victor Stinner if (vpath != NULL) { 34160a60677093e2792439c9e34debe6d55feead63fChristian Heimes wcsncpy(prefix, argv0_path, MAXPATHLEN); 34260a60677093e2792439c9e34debe6d55feead63fChristian Heimes prefix[MAXPATHLEN] = L'\0'; 3432158231433c19e1e8eec24d8d053da2a02256747Victor Stinner joinpath(prefix, vpath); 3441a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner PyMem_RawFree(vpath); 3452158231433c19e1e8eec24d8d053da2a02256747Victor Stinner joinpath(prefix, L"Lib"); 3462158231433c19e1e8eec24d8d053da2a02256747Victor Stinner joinpath(prefix, LANDMARK); 3472158231433c19e1e8eec24d8d053da2a02256747Victor Stinner if (ismodule(prefix)) 3482158231433c19e1e8eec24d8d053da2a02256747Victor Stinner return -1; 3492158231433c19e1e8eec24d8d053da2a02256747Victor Stinner } 350edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake } 351edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 352edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake /* Search from argv0_path, until root is found */ 353f4061dac607d9bc2b3af0b72da5e8917428d869eVictor Stinner copy_absolute(prefix, argv0_path, MAXPATHLEN+1); 354edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake do { 355790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis n = wcslen(prefix); 356edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake joinpath(prefix, lib_python); 357edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake joinpath(prefix, LANDMARK); 358edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (ismodule(prefix)) 359edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return 1; 360790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis prefix[n] = L'\0'; 361edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake reduce(prefix); 362edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake } while (prefix[0]); 363edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 364edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake /* Look at configure's PREFIX */ 365ae4836df6d0ea92d778ef30bd37417d048fc37fcVictor Stinner wcsncpy(prefix, _prefix, MAXPATHLEN); 36660a60677093e2792439c9e34debe6d55feead63fChristian Heimes prefix[MAXPATHLEN] = L'\0'; 367edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake joinpath(prefix, lib_python); 368edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake joinpath(prefix, LANDMARK); 369edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (ismodule(prefix)) 370edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return 1; 371edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 372edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake /* Fail */ 373edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return 0; 374305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum} 375305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum 376305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum 3776372fe1e40385d5d37bb938688e7bd5ecd2517beJeremy Hylton/* search_for_exec_prefix requires that argv0_path be no more than 378e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossum MAXPATHLEN bytes long. 3796372fe1e40385d5d37bb938688e7bd5ecd2517beJeremy Hylton*/ 380305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossumstatic int 381ce4179d0226768988965ac238ad15791cd377defVictor Stinnersearch_for_exec_prefix(wchar_t *argv0_path, wchar_t *home, 382ce4179d0226768988965ac238ad15791cd377defVictor Stinner wchar_t *_exec_prefix, wchar_t *lib_python) 383305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum{ 384edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake size_t n; 385edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 386edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake /* If PYTHONHOME is set, we believe it unconditionally */ 387edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (home) { 388790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis wchar_t *delim; 389790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis delim = wcschr(home, DELIM); 390edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (delim) 391790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis wcsncpy(exec_prefix, delim+1, MAXPATHLEN); 392edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake else 393790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis wcsncpy(exec_prefix, home, MAXPATHLEN); 39460a60677093e2792439c9e34debe6d55feead63fChristian Heimes exec_prefix[MAXPATHLEN] = L'\0'; 395edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake joinpath(exec_prefix, lib_python); 396790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis joinpath(exec_prefix, L"lib-dynload"); 397edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return 1; 398edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake } 399edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 400e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou /* Check to see if argv[0] is in the build directory. "pybuilddir.txt" 401e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou is written by setup.py and contains the relative path to the location 402e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou of shared library modules. */ 40360a60677093e2792439c9e34debe6d55feead63fChristian Heimes wcsncpy(exec_prefix, argv0_path, MAXPATHLEN); 40460a60677093e2792439c9e34debe6d55feead63fChristian Heimes exec_prefix[MAXPATHLEN] = L'\0'; 405e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou joinpath(exec_prefix, L"pybuilddir.txt"); 406edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (isfile(exec_prefix)) { 407e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou FILE *f = _Py_wfopen(exec_prefix, L"rb"); 408e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou if (f == NULL) 409e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou errno = 0; 410e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou else { 411e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou char buf[MAXPATHLEN+1]; 412e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou PyObject *decoded; 413e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou wchar_t rel_builddir_path[MAXPATHLEN+1]; 414e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou n = fread(buf, 1, MAXPATHLEN, f); 415e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou buf[n] = '\0'; 416e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou fclose(f); 417e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou decoded = PyUnicode_DecodeUTF8(buf, n, "surrogateescape"); 418e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou if (decoded != NULL) { 41947f637ce17022464307b093cee6f367e2dc7f024Victor Stinner Py_ssize_t k; 4204d0d471a8031de90a2b1ce99c4ac4780e60b3bc9Martin v. Löwis k = PyUnicode_AsWideChar(decoded, 421e406ef41b162698478df3f7a000999debb7135f7Victor Stinner rel_builddir_path, MAXPATHLEN); 422e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou Py_DECREF(decoded); 42347f637ce17022464307b093cee6f367e2dc7f024Victor Stinner if (k >= 0) { 42447f637ce17022464307b093cee6f367e2dc7f024Victor Stinner rel_builddir_path[k] = L'\0'; 42560a60677093e2792439c9e34debe6d55feead63fChristian Heimes wcsncpy(exec_prefix, argv0_path, MAXPATHLEN); 42660a60677093e2792439c9e34debe6d55feead63fChristian Heimes exec_prefix[MAXPATHLEN] = L'\0'; 427e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou joinpath(exec_prefix, rel_builddir_path); 428e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou return -1; 429e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou } 430e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou } 431e9b428f9977f8733e6b0d2c321c093779f95080fAntoine Pitrou } 432edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake } 433edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 434edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake /* Search from argv0_path, until root is found */ 435f4061dac607d9bc2b3af0b72da5e8917428d869eVictor Stinner copy_absolute(exec_prefix, argv0_path, MAXPATHLEN+1); 436edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake do { 437790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis n = wcslen(exec_prefix); 438edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake joinpath(exec_prefix, lib_python); 439790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis joinpath(exec_prefix, L"lib-dynload"); 440edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (isdir(exec_prefix)) 441edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return 1; 442790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis exec_prefix[n] = L'\0'; 443edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake reduce(exec_prefix); 444edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake } while (exec_prefix[0]); 445edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 446edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake /* Look at configure's EXEC_PREFIX */ 447ae4836df6d0ea92d778ef30bd37417d048fc37fcVictor Stinner wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN); 44860a60677093e2792439c9e34debe6d55feead63fChristian Heimes exec_prefix[MAXPATHLEN] = L'\0'; 449edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake joinpath(exec_prefix, lib_python); 450790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis joinpath(exec_prefix, L"lib-dynload"); 451edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (isdir(exec_prefix)) 452edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return 1; 453edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 454edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake /* Fail */ 455edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return 0; 456305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum} 457305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum 458305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossumstatic void 459f3f33dcf03eaed3c4e720178f9d69205a66d6a91Thomas Wouterscalculate_path(void) 460667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum{ 461790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis extern wchar_t *Py_GetProgramName(void); 462790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis 4632d06e8445587d9b4d0bf79bdb08ab4743b780249Serhiy Storchaka static const wchar_t delimiter[2] = {DELIM, '\0'}; 4642d06e8445587d9b4d0bf79bdb08ab4743b780249Serhiy Storchaka static const wchar_t separator[2] = {SEP, '\0'}; 465790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis char *_rtpypath = Py_GETENV("PYTHONPATH"); /* XXX use wide version on Windows */ 46699563b1df835218fd61fe1c86930b49dd55044beVictor Stinner wchar_t *rtpypath = NULL; 467790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis wchar_t *home = Py_GetPythonHome(); 468790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis char *_path = getenv("PATH"); 46961aad57dc9df19c2e073779e0ab389b949960801Victor Stinner wchar_t *path_buffer = NULL; 470790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis wchar_t *path = NULL; 471790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis wchar_t *prog = Py_GetProgramName(); 472790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis wchar_t argv0_path[MAXPATHLEN+1]; 473790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis wchar_t zip_path[MAXPATHLEN+1]; 474edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake int pfound, efound; /* 1 if found; -1 if found build directory */ 475790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis wchar_t *buf; 476edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake size_t bufsz; 477edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake size_t prefixsz; 478ae4836df6d0ea92d778ef30bd37417d048fc37fcVictor Stinner wchar_t *defpath; 47954ecc3d24f52ae45ca54a24167e434915c88b60fGuido van Rossum#ifdef WITH_NEXT_FRAMEWORK 480edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake NSModule pythonModule; 48190db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip const char* modPath; 48254ecc3d24f52ae45ca54a24167e434915c88b60fGuido van Rossum#endif 4831afd4807d9b3df5ba24fa245920d677497025722Jack Jansen#ifdef __APPLE__ 4842b47445234bd44b1382cc434c408a390eb4aa07eSkip Montanaro#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 485bd9c3f702825a82e0ac8fbcc2cdc40364de6747fBrett Cannon uint32_t nsexeclength = MAXPATHLEN; 4862b47445234bd44b1382cc434c408a390eb4aa07eSkip Montanaro#else 4872b47445234bd44b1382cc434c408a390eb4aa07eSkip Montanaro unsigned long nsexeclength = MAXPATHLEN; 4882b47445234bd44b1382cc434c408a390eb4aa07eSkip Montanaro#endif 489ae4836df6d0ea92d778ef30bd37417d048fc37fcVictor Stinner char execpath[MAXPATHLEN+1]; 4901afd4807d9b3df5ba24fa245920d677497025722Jack Jansen#endif 491ae4836df6d0ea92d778ef30bd37417d048fc37fcVictor Stinner wchar_t *_pythonpath, *_prefix, *_exec_prefix; 492ce4179d0226768988965ac238ad15791cd377defVictor Stinner wchar_t *lib_python; 493ae4836df6d0ea92d778ef30bd37417d048fc37fcVictor Stinner 494f6a271ae980d2f3fb450f745b8f87624378156c4Victor Stinner _pythonpath = Py_DecodeLocale(PYTHONPATH, NULL); 495f6a271ae980d2f3fb450f745b8f87624378156c4Victor Stinner _prefix = Py_DecodeLocale(PREFIX, NULL); 496f6a271ae980d2f3fb450f745b8f87624378156c4Victor Stinner _exec_prefix = Py_DecodeLocale(EXEC_PREFIX, NULL); 497f6a271ae980d2f3fb450f745b8f87624378156c4Victor Stinner lib_python = Py_DecodeLocale("lib/python" VERSION, NULL); 498ae4836df6d0ea92d778ef30bd37417d048fc37fcVictor Stinner 499ce4179d0226768988965ac238ad15791cd377defVictor Stinner if (!_pythonpath || !_prefix || !_exec_prefix || !lib_python) { 500ae4836df6d0ea92d778ef30bd37417d048fc37fcVictor Stinner Py_FatalError( 501ae4836df6d0ea92d778ef30bd37417d048fc37fcVictor Stinner "Unable to decode path variables in getpath.c: " 502ae4836df6d0ea92d778ef30bd37417d048fc37fcVictor Stinner "memory error"); 503ae4836df6d0ea92d778ef30bd37417d048fc37fcVictor Stinner } 504e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossum 50561aad57dc9df19c2e073779e0ab389b949960801Victor Stinner if (_path) { 506f6a271ae980d2f3fb450f745b8f87624378156c4Victor Stinner path_buffer = Py_DecodeLocale(_path, NULL); 50761aad57dc9df19c2e073779e0ab389b949960801Victor Stinner path = path_buffer; 50861aad57dc9df19c2e073779e0ab389b949960801Victor Stinner } 509790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis 51099773acf38ec250036df910438fae72134d2b129Antoine Pitrou /* If there is no slash in the argv0 path, then we have to 51199773acf38ec250036df910438fae72134d2b129Antoine Pitrou * assume python is on the user's $PATH, since there's no 51299773acf38ec250036df910438fae72134d2b129Antoine Pitrou * other way to find a directory to start the search from. If 51399773acf38ec250036df910438fae72134d2b129Antoine Pitrou * $PATH isn't exported, you lose. 51499773acf38ec250036df910438fae72134d2b129Antoine Pitrou */ 51599773acf38ec250036df910438fae72134d2b129Antoine Pitrou if (wcschr(prog, SEP)) 51699773acf38ec250036df910438fae72134d2b129Antoine Pitrou wcsncpy(progpath, prog, MAXPATHLEN); 5171afd4807d9b3df5ba24fa245920d677497025722Jack Jansen#ifdef __APPLE__ 5181afd4807d9b3df5ba24fa245920d677497025722Jack Jansen /* On Mac OS X, if a script uses an interpreter of the form 5191afd4807d9b3df5ba24fa245920d677497025722Jack Jansen * "#!/opt/python2.3/bin/python", the kernel only passes "python" 5201afd4807d9b3df5ba24fa245920d677497025722Jack Jansen * as argv[0], which falls through to the $PATH search below. 5211afd4807d9b3df5ba24fa245920d677497025722Jack Jansen * If /opt/python2.3/bin isn't in your path, or is near the end, 5221afd4807d9b3df5ba24fa245920d677497025722Jack Jansen * this algorithm may incorrectly find /usr/bin/python. To work 5231afd4807d9b3df5ba24fa245920d677497025722Jack Jansen * around this, we can use _NSGetExecutablePath to get a better 5241afd4807d9b3df5ba24fa245920d677497025722Jack Jansen * hint of what the intended interpreter was, although this 5251afd4807d9b3df5ba24fa245920d677497025722Jack Jansen * will fail if a relative path was used. but in that case, 5261afd4807d9b3df5ba24fa245920d677497025722Jack Jansen * absolutize() should help us out below 5271afd4807d9b3df5ba24fa245920d677497025722Jack Jansen */ 52899773acf38ec250036df910438fae72134d2b129Antoine Pitrou else if(0 == _NSGetExecutablePath(execpath, &nsexeclength) && execpath[0] == SEP) { 52999773acf38ec250036df910438fae72134d2b129Antoine Pitrou size_t r = mbstowcs(progpath, execpath, MAXPATHLEN+1); 53099773acf38ec250036df910438fae72134d2b129Antoine Pitrou if (r == (size_t)-1 || r > MAXPATHLEN) { 53199773acf38ec250036df910438fae72134d2b129Antoine Pitrou /* Could not convert execpath, or it's too long. */ 53299773acf38ec250036df910438fae72134d2b129Antoine Pitrou progpath[0] = '\0'; 533f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 53499773acf38ec250036df910438fae72134d2b129Antoine Pitrou } 5356cc48148fe0ecd600f796031ecfd16813f7f0d1eBrett Cannon#endif /* __APPLE__ */ 53699773acf38ec250036df910438fae72134d2b129Antoine Pitrou else if (path) { 53799773acf38ec250036df910438fae72134d2b129Antoine Pitrou while (1) { 53899773acf38ec250036df910438fae72134d2b129Antoine Pitrou wchar_t *delim = wcschr(path, DELIM); 53999773acf38ec250036df910438fae72134d2b129Antoine Pitrou 54099773acf38ec250036df910438fae72134d2b129Antoine Pitrou if (delim) { 54199773acf38ec250036df910438fae72134d2b129Antoine Pitrou size_t len = delim - path; 54299773acf38ec250036df910438fae72134d2b129Antoine Pitrou if (len > MAXPATHLEN) 54399773acf38ec250036df910438fae72134d2b129Antoine Pitrou len = MAXPATHLEN; 54499773acf38ec250036df910438fae72134d2b129Antoine Pitrou wcsncpy(progpath, path, len); 54599773acf38ec250036df910438fae72134d2b129Antoine Pitrou *(progpath + len) = '\0'; 54699773acf38ec250036df910438fae72134d2b129Antoine Pitrou } 54799773acf38ec250036df910438fae72134d2b129Antoine Pitrou else 54899773acf38ec250036df910438fae72134d2b129Antoine Pitrou wcsncpy(progpath, path, MAXPATHLEN); 54999773acf38ec250036df910438fae72134d2b129Antoine Pitrou 55099773acf38ec250036df910438fae72134d2b129Antoine Pitrou joinpath(progpath, prog); 55199773acf38ec250036df910438fae72134d2b129Antoine Pitrou if (isxfile(progpath)) 55299773acf38ec250036df910438fae72134d2b129Antoine Pitrou break; 55399773acf38ec250036df910438fae72134d2b129Antoine Pitrou 55499773acf38ec250036df910438fae72134d2b129Antoine Pitrou if (!delim) { 55599773acf38ec250036df910438fae72134d2b129Antoine Pitrou progpath[0] = L'\0'; 55699773acf38ec250036df910438fae72134d2b129Antoine Pitrou break; 55799773acf38ec250036df910438fae72134d2b129Antoine Pitrou } 55899773acf38ec250036df910438fae72134d2b129Antoine Pitrou path = delim + 1; 559f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou } 56099773acf38ec250036df910438fae72134d2b129Antoine Pitrou } 56199773acf38ec250036df910438fae72134d2b129Antoine Pitrou else 56299773acf38ec250036df910438fae72134d2b129Antoine Pitrou progpath[0] = '\0'; 5631a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner PyMem_RawFree(path_buffer); 56499773acf38ec250036df910438fae72134d2b129Antoine Pitrou if (progpath[0] != SEP && progpath[0] != '\0') 56599773acf38ec250036df910438fae72134d2b129Antoine Pitrou absolutize(progpath); 56699773acf38ec250036df910438fae72134d2b129Antoine Pitrou wcsncpy(argv0_path, progpath, MAXPATHLEN); 56799773acf38ec250036df910438fae72134d2b129Antoine Pitrou argv0_path[MAXPATHLEN] = '\0'; 56855070f5d966f09256c603c3a82fab9b034430c6fJack Jansen 56954ecc3d24f52ae45ca54a24167e434915c88b60fGuido van Rossum#ifdef WITH_NEXT_FRAMEWORK 57099773acf38ec250036df910438fae72134d2b129Antoine Pitrou /* On Mac OS X we have a special case if we're running from a framework. 57199773acf38ec250036df910438fae72134d2b129Antoine Pitrou ** This is because the python home should be set relative to the library, 57299773acf38ec250036df910438fae72134d2b129Antoine Pitrou ** which is in the framework, not relative to the executable, which may 57399773acf38ec250036df910438fae72134d2b129Antoine Pitrou ** be outside of the framework. Except when we're in the build directory... 57499773acf38ec250036df910438fae72134d2b129Antoine Pitrou */ 575edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake pythonModule = NSModuleForSymbol(NSLookupAndBindSymbol("_Py_Initialize")); 576edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake /* Use dylib functions to find out where the framework was loaded from */ 57790db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip modPath = NSLibraryNameForModule(pythonModule); 57890db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip if (modPath != NULL) { 579edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake /* We're in a framework. */ 580e925faff8edb2463fb58f6283647caaeb40372faJack Jansen /* See if we might be in the build directory. The framework in the 581e925faff8edb2463fb58f6283647caaeb40372faJack Jansen ** build directory is incomplete, it only has the .dylib and a few 582e925faff8edb2463fb58f6283647caaeb40372faJack Jansen ** needed symlinks, it doesn't have the Lib directories and such. 583e925faff8edb2463fb58f6283647caaeb40372faJack Jansen ** If we're running with the framework from the build directory we must 584e925faff8edb2463fb58f6283647caaeb40372faJack Jansen ** be running the interpreter in the build directory, so we use the 585e925faff8edb2463fb58f6283647caaeb40372faJack Jansen ** build-directory-specific logic to find Lib and such. 586e925faff8edb2463fb58f6283647caaeb40372faJack Jansen */ 587f6a271ae980d2f3fb450f745b8f87624378156c4Victor Stinner wchar_t* wbuf = Py_DecodeLocale(modPath, NULL); 58890db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip if (wbuf == NULL) { 58990db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip Py_FatalError("Cannot decode framework location"); 59090db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip } 59190db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip 59290db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip wcsncpy(argv0_path, wbuf, MAXPATHLEN); 593e925faff8edb2463fb58f6283647caaeb40372faJack Jansen reduce(argv0_path); 594e925faff8edb2463fb58f6283647caaeb40372faJack Jansen joinpath(argv0_path, lib_python); 595e925faff8edb2463fb58f6283647caaeb40372faJack Jansen joinpath(argv0_path, LANDMARK); 596e925faff8edb2463fb58f6283647caaeb40372faJack Jansen if (!ismodule(argv0_path)) { 59799773acf38ec250036df910438fae72134d2b129Antoine Pitrou /* We are in the build directory so use the name of the 59899773acf38ec250036df910438fae72134d2b129Antoine Pitrou executable - we know that the absolute path is passed */ 59999773acf38ec250036df910438fae72134d2b129Antoine Pitrou wcsncpy(argv0_path, progpath, MAXPATHLEN); 600e925faff8edb2463fb58f6283647caaeb40372faJack Jansen } 601e925faff8edb2463fb58f6283647caaeb40372faJack Jansen else { 60299773acf38ec250036df910438fae72134d2b129Antoine Pitrou /* Use the location of the library as the progpath */ 60390db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip wcsncpy(argv0_path, wbuf, MAXPATHLEN); 604e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossum } 6051a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner PyMem_RawFree(wbuf); 606edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake } 60754ecc3d24f52ae45ca54a24167e434915c88b60fGuido van Rossum#endif 608305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum 609305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum#if HAVE_READLINK 610edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake { 611790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis wchar_t tmpbuffer[MAXPATHLEN+1]; 612790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis int linklen = _Py_wreadlink(progpath, tmpbuffer, MAXPATHLEN); 613edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake while (linklen != -1) { 614edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (tmpbuffer[0] == SEP) 615e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossum /* tmpbuffer should never be longer than MAXPATHLEN, 616e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossum but extra check does not hurt */ 617790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis wcsncpy(argv0_path, tmpbuffer, MAXPATHLEN); 618edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake else { 619edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake /* Interpret relative to progpath */ 620edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake reduce(argv0_path); 621edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake joinpath(argv0_path, tmpbuffer); 622edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake } 623790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis linklen = _Py_wreadlink(argv0_path, tmpbuffer, MAXPATHLEN); 624edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake } 625edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake } 626305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum#endif /* HAVE_READLINK */ 627305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum 628edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake reduce(argv0_path); 6296372fe1e40385d5d37bb938688e7bd5ecd2517beJeremy Hylton /* At this point, argv0_path is guaranteed to be less than 6306372fe1e40385d5d37bb938688e7bd5ecd2517beJeremy Hylton MAXPATHLEN bytes long. 6316372fe1e40385d5d37bb938688e7bd5ecd2517beJeremy Hylton */ 632edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 6337ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip /* Search for an environment configuration file, first in the 6347ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip executable's directory and then in the parent directory. 6357ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip If found, open it for use when searching for prefixes. 6367ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip */ 6377ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip 6387ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip { 6397ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip wchar_t tmpbuffer[MAXPATHLEN+1]; 6407ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip wchar_t *env_cfg = L"pyvenv.cfg"; 6417ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip FILE * env_file = NULL; 6427ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip 6437ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip wcscpy(tmpbuffer, argv0_path); 64490db661b4335eaf7a3cb5e9a4524ae9707eeaf76Vinay Sajip 6457ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip joinpath(tmpbuffer, env_cfg); 6467ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip env_file = _Py_wfopen(tmpbuffer, L"r"); 6477ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip if (env_file == NULL) { 6487ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip errno = 0; 6497ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip reduce(tmpbuffer); 6507ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip reduce(tmpbuffer); 6517ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip joinpath(tmpbuffer, env_cfg); 6527ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip env_file = _Py_wfopen(tmpbuffer, L"r"); 6537ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip if (env_file == NULL) { 6547ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip errno = 0; 6557ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip } 6567ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip } 6577ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip if (env_file != NULL) { 6587ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip /* Look for a 'home' variable and set argv0_path to it, if found */ 6597ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip if (find_env_config_value(env_file, L"home", tmpbuffer)) { 6607ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip wcscpy(argv0_path, tmpbuffer); 6617ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip } 6627ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip fclose(env_file); 6637ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip env_file = NULL; 6647ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip } 6657ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip } 6667ded1f0f694f0f99252ea19eca18b74ea5e36cb0Vinay Sajip 667ce4179d0226768988965ac238ad15791cd377defVictor Stinner pfound = search_for_prefix(argv0_path, home, _prefix, lib_python); 668ce4179d0226768988965ac238ad15791cd377defVictor Stinner if (!pfound) { 669edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (!Py_FrozenFlag) 670edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake fprintf(stderr, 671e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossum "Could not find platform independent libraries <prefix>\n"); 672ae4836df6d0ea92d778ef30bd37417d048fc37fcVictor Stinner wcsncpy(prefix, _prefix, MAXPATHLEN); 673edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake joinpath(prefix, lib_python); 674edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake } 675edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake else 676edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake reduce(prefix); 677e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossum 678790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis wcsncpy(zip_path, prefix, MAXPATHLEN); 679790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis zip_path[MAXPATHLEN] = L'\0'; 68052e14d640be3a7fa2c17f5a2a6bc9626d622aa40Just van Rossum if (pfound > 0) { /* Use the reduced prefix returned by Py_GetPrefix() */ 68152e14d640be3a7fa2c17f5a2a6bc9626d622aa40Just van Rossum reduce(zip_path); 68252e14d640be3a7fa2c17f5a2a6bc9626d622aa40Just van Rossum reduce(zip_path); 68352e14d640be3a7fa2c17f5a2a6bc9626d622aa40Just van Rossum } 68452e14d640be3a7fa2c17f5a2a6bc9626d622aa40Just van Rossum else 685ae4836df6d0ea92d778ef30bd37417d048fc37fcVictor Stinner wcsncpy(zip_path, _prefix, MAXPATHLEN); 686790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis joinpath(zip_path, L"lib/python00.zip"); 687f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou bufsz = wcslen(zip_path); /* Replace "00" with version */ 68852e14d640be3a7fa2c17f5a2a6bc9626d622aa40Just van Rossum zip_path[bufsz - 6] = VERSION[0]; 68952e14d640be3a7fa2c17f5a2a6bc9626d622aa40Just van Rossum zip_path[bufsz - 5] = VERSION[2]; 69052e14d640be3a7fa2c17f5a2a6bc9626d622aa40Just van Rossum 691ce4179d0226768988965ac238ad15791cd377defVictor Stinner efound = search_for_exec_prefix(argv0_path, home, 692ce4179d0226768988965ac238ad15791cd377defVictor Stinner _exec_prefix, lib_python); 693ce4179d0226768988965ac238ad15791cd377defVictor Stinner if (!efound) { 694edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (!Py_FrozenFlag) 695edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake fprintf(stderr, 696e296cedef97220d832fa3e8ddba71c49bc574516Guido van Rossum "Could not find platform dependent libraries <exec_prefix>\n"); 697ae4836df6d0ea92d778ef30bd37417d048fc37fcVictor Stinner wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN); 698790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis joinpath(exec_prefix, L"lib/lib-dynload"); 699edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake } 700edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */ 701edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 702edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if ((!pfound || !efound) && !Py_FrozenFlag) 703edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake fprintf(stderr, 704edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake "Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]\n"); 705edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 706edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake /* Calculate size of return buffer. 707edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake */ 708edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake bufsz = 0; 709edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 71069032c81aaad1eaff7b58d5cbf9e51537e135c55Andrew Svetlov if (_rtpypath && _rtpypath[0] != '\0') { 71199563b1df835218fd61fe1c86930b49dd55044beVictor Stinner size_t rtpypath_len; 712f6a271ae980d2f3fb450f745b8f87624378156c4Victor Stinner rtpypath = Py_DecodeLocale(_rtpypath, &rtpypath_len); 71399563b1df835218fd61fe1c86930b49dd55044beVictor Stinner if (rtpypath != NULL) 71499563b1df835218fd61fe1c86930b49dd55044beVictor Stinner bufsz += rtpypath_len + 1; 715790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis } 716edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 717ae4836df6d0ea92d778ef30bd37417d048fc37fcVictor Stinner defpath = _pythonpath; 718790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis prefixsz = wcslen(prefix) + 1; 719edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake while (1) { 720790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis wchar_t *delim = wcschr(defpath, DELIM); 721edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 722edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (defpath[0] != SEP) 723edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake /* Paths are relative to prefix */ 724edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake bufsz += prefixsz; 725edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 726edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (delim) 727edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake bufsz += delim - defpath + 1; 728edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake else { 729790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis bufsz += wcslen(defpath) + 1; 730edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake break; 731edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake } 732edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake defpath = delim + 1; 733edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake } 734edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 735790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis bufsz += wcslen(zip_path) + 1; 736790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis bufsz += wcslen(exec_prefix) + 1; 737edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 7381a1ff29659f068659dea07f1bd67b8fd4331071cSerhiy Storchaka buf = PyMem_New(wchar_t, bufsz); 739edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (buf == NULL) { 74072967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner Py_FatalError( 74172967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner "Not enough memory for dynamic PYTHONPATH"); 742edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake } 743edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 74472967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner /* Run-time value of $PYTHONPATH goes first */ 74572967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner if (rtpypath) { 74672967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner wcscpy(buf, rtpypath); 747790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwis wcscat(buf, delimiter); 74872967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner } 74972967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner else 75072967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner buf[0] = '\0'; 75152e14d640be3a7fa2c17f5a2a6bc9626d622aa40Just van Rossum 75272967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner /* Next is the default zip path */ 75372967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner wcscat(buf, zip_path); 75472967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner wcscat(buf, delimiter); 755edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 75672967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner /* Next goes merge of compile-time $PYTHONPATH with 75772967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner * dynamically located prefix. 75872967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner */ 75972967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner defpath = _pythonpath; 76072967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner while (1) { 76172967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner wchar_t *delim = wcschr(defpath, DELIM); 762edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 76372967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner if (defpath[0] != SEP) { 76472967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner wcscat(buf, prefix); 76562e32d6352e318ed03eb519aedbc975b772114b5Serhiy Storchaka if (prefixsz >= 2 && prefix[prefixsz - 2] != SEP && 76662e32d6352e318ed03eb519aedbc975b772114b5Serhiy Storchaka defpath[0] != (delim ? DELIM : L'\0')) { /* not empty */ 76762e32d6352e318ed03eb519aedbc975b772114b5Serhiy Storchaka wcscat(buf, separator); 76862e32d6352e318ed03eb519aedbc975b772114b5Serhiy Storchaka } 769edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake } 770edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 77172967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner if (delim) { 77272967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner size_t len = delim - defpath + 1; 77372967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner size_t end = wcslen(buf) + len; 77472967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner wcsncat(buf, defpath, len); 77572967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner *(buf + end) = '\0'; 77672967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner } 77772967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner else { 77872967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner wcscat(buf, defpath); 77972967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner break; 78072967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner } 78172967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner defpath = delim + 1; 782edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake } 78372967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner wcscat(buf, delimiter); 78472967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner 78572967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner /* Finally, on goes the directory for dynamic-load modules */ 78672967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner wcscat(buf, exec_prefix); 78772967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner 78872967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner /* And publish the results */ 78972967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner module_search_path = buf; 790edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 791edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake /* Reduce prefix and exec_prefix to their essence, 792edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake * e.g. /usr/local/lib/python1.5 is reduced to /usr/local. 793edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake * If we're loading relative to the build directory, 794edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake * return the compiled-in defaults instead. 795edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake */ 796edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (pfound > 0) { 797edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake reduce(prefix); 798edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake reduce(prefix); 799f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou /* The prefix is the root directory, but reduce() chopped 800f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou * off the "/". */ 801f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (!prefix[0]) 802f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou wcscpy(prefix, separator); 803edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake } 804edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake else 805ae4836df6d0ea92d778ef30bd37417d048fc37fcVictor Stinner wcsncpy(prefix, _prefix, MAXPATHLEN); 806edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake 807edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (efound > 0) { 808edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake reduce(exec_prefix); 809edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake reduce(exec_prefix); 810edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake reduce(exec_prefix); 811f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou if (!exec_prefix[0]) 812f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou wcscpy(exec_prefix, separator); 813edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake } 814edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake else 815ae4836df6d0ea92d778ef30bd37417d048fc37fcVictor Stinner wcsncpy(exec_prefix, _exec_prefix, MAXPATHLEN); 816ae4836df6d0ea92d778ef30bd37417d048fc37fcVictor Stinner 8171a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner PyMem_RawFree(_pythonpath); 8181a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner PyMem_RawFree(_prefix); 8191a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner PyMem_RawFree(_exec_prefix); 820ce4179d0226768988965ac238ad15791cd377defVictor Stinner PyMem_RawFree(lib_python); 8211a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner PyMem_RawFree(rtpypath); 822667d704997f26a1a22f4e981bbb3c2f8399cfc41Guido van Rossum} 823c34c9a50016f31db443a9afdf717f48eca9d34d9Guido van Rossum 824c34c9a50016f31db443a9afdf717f48eca9d34d9Guido van Rossum 825305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum/* External interface */ 8263b69db27d70f05584b76ece61bb882c26ecfcc68Kristján Valur Jónssonvoid 8273b69db27d70f05584b76ece61bb882c26ecfcc68Kristján Valur JónssonPy_SetPath(const wchar_t *path) 8283b69db27d70f05584b76ece61bb882c26ecfcc68Kristján Valur Jónsson{ 8293b69db27d70f05584b76ece61bb882c26ecfcc68Kristján Valur Jónsson if (module_search_path != NULL) { 83072967a4c1ad2b4d17fbaa922e7bda45472f1fe1dVictor Stinner PyMem_RawFree(module_search_path); 8313b69db27d70f05584b76ece61bb882c26ecfcc68Kristján Valur Jónsson module_search_path = NULL; 8323b69db27d70f05584b76ece61bb882c26ecfcc68Kristján Valur Jónsson } 8333b69db27d70f05584b76ece61bb882c26ecfcc68Kristján Valur Jónsson if (path != NULL) { 8343b69db27d70f05584b76ece61bb882c26ecfcc68Kristján Valur Jónsson extern wchar_t *Py_GetProgramName(void); 8353b69db27d70f05584b76ece61bb882c26ecfcc68Kristján Valur Jónsson wchar_t *prog = Py_GetProgramName(); 8363b69db27d70f05584b76ece61bb882c26ecfcc68Kristján Valur Jónsson wcsncpy(progpath, prog, MAXPATHLEN); 8373b69db27d70f05584b76ece61bb882c26ecfcc68Kristján Valur Jónsson exec_prefix[0] = prefix[0] = L'\0'; 8381a7425f67a0d141483d89ca80ca01e3cb7f6be92Victor Stinner module_search_path = PyMem_RawMalloc((wcslen(path) + 1) * sizeof(wchar_t)); 8393b69db27d70f05584b76ece61bb882c26ecfcc68Kristján Valur Jónsson if (module_search_path != NULL) 8403b69db27d70f05584b76ece61bb882c26ecfcc68Kristján Valur Jónsson wcscpy(module_search_path, path); 8413b69db27d70f05584b76ece61bb882c26ecfcc68Kristján Valur Jónsson } 8423b69db27d70f05584b76ece61bb882c26ecfcc68Kristján Valur Jónsson} 843305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum 844790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwiswchar_t * 845f3f33dcf03eaed3c4e720178f9d69205a66d6a91Thomas WoutersPy_GetPath(void) 846305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum{ 847edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (!module_search_path) 848edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake calculate_path(); 849edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return module_search_path; 850305e5d0d4f3a24f199cfea4f9b0e53980de79847Guido van Rossum} 851c34c9a50016f31db443a9afdf717f48eca9d34d9Guido van Rossum 852790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwiswchar_t * 853f3f33dcf03eaed3c4e720178f9d69205a66d6a91Thomas WoutersPy_GetPrefix(void) 854c34c9a50016f31db443a9afdf717f48eca9d34d9Guido van Rossum{ 855edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (!module_search_path) 856edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake calculate_path(); 857edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return prefix; 858c34c9a50016f31db443a9afdf717f48eca9d34d9Guido van Rossum} 859c34c9a50016f31db443a9afdf717f48eca9d34d9Guido van Rossum 860790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwiswchar_t * 861f3f33dcf03eaed3c4e720178f9d69205a66d6a91Thomas WoutersPy_GetExecPrefix(void) 862c34c9a50016f31db443a9afdf717f48eca9d34d9Guido van Rossum{ 863edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (!module_search_path) 864edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake calculate_path(); 865edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return exec_prefix; 866c34c9a50016f31db443a9afdf717f48eca9d34d9Guido van Rossum} 8677929c6fe957e1d2529e90a919505f91bee64e4fbGuido van Rossum 868790465fd90e8a72590386465f518db9e67ab843fMartin v. Löwiswchar_t * 869f3f33dcf03eaed3c4e720178f9d69205a66d6a91Thomas WoutersPy_GetProgramFullPath(void) 8707929c6fe957e1d2529e90a919505f91bee64e4fbGuido van Rossum{ 871edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake if (!module_search_path) 872edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake calculate_path(); 873edabdc1e9e923d83b2a9eb835996c8bc2e92e297Fred Drake return progpath; 8747929c6fe957e1d2529e90a919505f91bee64e4fbGuido van Rossum} 87549fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 87649fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters 87749fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#ifdef __cplusplus 87849fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters} 87949fd7fa4431da299196d74087df4a04f99f9c46fThomas Wouters#endif 880