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