annotate Modules/getpath.c @ 67467:abe201dfd3dc 3.1

Merged revisions 87861,87863 via svnmerge from svn+ssh://pythondev@svn.python.org/python/branches/py3k ........ r87861 | antoine.pitrou | 2011-01-08 11:23:29 +0100 (sam., 08 janv. 2011) | 3 lines Fix test_ssl after r87849 ........ r87863 | antoine.pitrou | 2011-01-08 11:28:11 +0100 (sam., 08 janv. 2011) | 3 lines Add EHOSTUNREACH ('No route to host') to the errnos trapped by transient_internet(). ........
author Antoine Pitrou <solipsis@pitrou.net>
date Sat, 08 Jan 2011 10:31:09 +0000
parents 39a0b943e3e1
children 3c9232a684ae
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3621
f158edccc72c grand renaming; added copyright to some files
Guido van Rossum <guido@python.org>
parents: 3416
diff changeset
1 /* Return the initial module search path. */
f158edccc72c grand renaming; added copyright to some files
Guido van Rossum <guido@python.org>
parents: 3416
diff changeset
2
2896
f0d9f800a4aa Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
3 #include "Python.h"
f0d9f800a4aa Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
4 #include "osdefs.h"
f0d9f800a4aa Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
5
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
6 #include <sys/types.h>
5698
ba860dc0a585 Use string.h, not strings.h
Guido van Rossum <guido@python.org>
parents: 5568
diff changeset
7 #include <string.h>
2896
f0d9f800a4aa Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
8
32410
8444849c9448 Modules/getpath.c now compiles properly under OS X when using the
Brett Cannon <bcannon@gmail.com>
parents: 32399
diff changeset
9 #ifdef __APPLE__
9970
8efa37a770c6 Patches by William Lewis for Nextstep descendants.
Guido van Rossum <guido@python.org>
parents: 8203
diff changeset
10 #include <mach-o/dyld.h>
8efa37a770c6 Patches by William Lewis for Nextstep descendants.
Guido van Rossum <guido@python.org>
parents: 8203
diff changeset
11 #endif
8efa37a770c6 Patches by William Lewis for Nextstep descendants.
Guido van Rossum <guido@python.org>
parents: 8203
diff changeset
12
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
13 /* Search in some common locations for the associated Python libraries.
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
14 *
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
15 * Two directories must be found, the platform independent directory
5316
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
16 * (prefix), containing the common .py and .pyc files, and the platform
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
17 * dependent directory (exec_prefix), containing the shared library
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
18 * modules. Note that prefix and exec_prefix can be the same directory,
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
19 * but for some installations, they are different.
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
20 *
5316
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
21 * Py_GetPath() carries out separate searches for prefix and exec_prefix.
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
22 * Each search tries a number of different locations until a ``landmark''
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
23 * file or directory is found. If no prefix or exec_prefix is found, a
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
24 * warning message is issued and the preprocessor defined PREFIX and
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
25 * EXEC_PREFIX are used (even though they will not work); python carries on
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
26 * as best as is possible, but most imports will fail.
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
27 *
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
28 * Before any searches are done, the location of the executable is
41554
06145fbc7ab9 Merged revisions 53952-54987 via svnmerge from
Guido van Rossum <guido@python.org>
parents: 39442
diff changeset
29 * determined. If argv[0] has one or more slashes in it, it is used
5316
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
30 * unchanged. Otherwise, it must have been invoked from the shell's path,
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
31 * so we search $PATH for the named executable and use that. If the
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
32 * executable was not found on $PATH (or there was no $PATH environment
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
33 * variable), the original argv[0] string is used.
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
34 *
5316
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
35 * Next, the executable location is examined to see if it is a symbolic
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
36 * link. If so, the link is chased (correctly interpreting a relative
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
37 * pathname if one is found) and the directory of the link target is used.
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
38 *
5316
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
39 * Finally, argv0_path is set to the directory containing the executable
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
40 * (i.e. the last component is stripped).
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
41 *
5316
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
42 * With argv0_path in hand, we perform a number of steps. The same steps
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
43 * are performed for prefix and for exec_prefix, but with a different
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
44 * landmark.
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
45 *
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
46 * Step 1. Are we running python out of the build directory? This is
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
47 * checked by looking for a different kind of landmark relative to
5316
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
48 * argv0_path. For prefix, the landmark's path is derived from the VPATH
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
49 * preprocessor variable (taking into account that its value is almost, but
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
50 * not quite, what we need). For exec_prefix, the landmark is
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
51 * Modules/Setup. If the landmark is found, we're done.
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
52 *
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
53 * For the remaining steps, the prefix landmark will always be
12775
8e2b35d386aa Patch from M.-A. Lemburg:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
54 * lib/python$VERSION/os.py and the exec_prefix will always be
6498
4981fd2b3211 Change sharedmodules to lib-dynload.
Guido van Rossum <guido@python.org>
parents: 6121
diff changeset
55 * lib/python$VERSION/lib-dynload, where $VERSION is Python's version
5316
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
56 * number as supplied by the Makefile. Note that this means that no more
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
57 * build directory checking is performed; if the first step did not find
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
58 * the landmarks, the assumption is that python is running from an
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
59 * installed setup.
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
60 *
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
61 * Step 2. See if the $PYTHONHOME environment variable points to the
5316
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
62 * installed location of the Python libraries. If $PYTHONHOME is set, then
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
63 * it points to prefix and exec_prefix. $PYTHONHOME can be a single
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
64 * directory, which is used for both, or the prefix and exec_prefix
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
65 * directories separated by a colon.
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
66 *
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
67 * Step 3. Try to find prefix and exec_prefix relative to argv0_path,
5316
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
68 * backtracking up the path until it is exhausted. This is the most common
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
69 * step to succeed. Note that if prefix and exec_prefix are different,
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
70 * exec_prefix is more likely to be found; however if exec_prefix is a
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
71 * subdirectory of prefix, both will be found.
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
72 *
5316
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
73 * Step 4. Search the directories pointed to by the preprocessor variables
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
74 * PREFIX and EXEC_PREFIX. These are supplied by the Makefile but can be
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
75 * passed in as options to the configure script.
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
76 *
5316
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
77 * That's it!
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
78 *
5316
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
79 * Well, almost. Once we have determined prefix and exec_prefix, the
13620
5b727ab37092 Spelling fixes supplied by Rob W. W. Hooft. All these are fixes in either
Thomas Wouters <thomas@python.org>
parents: 13428
diff changeset
80 * preprocessor variable PYTHONPATH is used to construct a path. Each
5316
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
81 * relative path on PYTHONPATH is prefixed with prefix. Then the directory
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
82 * containing the shared library modules is appended. The environment
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
83 * variable $PYTHONPATH is inserted in front of it all. Finally, the
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
84 * prefix and exec_prefix globals are tweaked so they reflect the values
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
85 * expected by other code, by stripping the "lib/python$VERSION/..." stuff
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
86 * off. If either points to the build directory, the globals are reset to
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
87 * the corresponding preprocessor variables (so sys.prefix will reflect the
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
88 * installation location, even though sys.path points into the build
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
89 * directory). This seems to make more sense given that currently the only
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
90 * known use of sys.prefix and sys.exec_prefix is for the ILU installation
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
91 * process to find the installed Python tree.
63983
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
92 *
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
93 * NOTE: Windows MSVC builds use PC/getpathp.c instead!
5316
c8e24c4b8bfb Removed two unused static function: string_addsep() and
Barry Warsaw <barry@python.org>
parents: 5300
diff changeset
94 */
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
95
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36623
diff changeset
96 #ifdef __cplusplus
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36623
diff changeset
97 extern "C" {
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36623
diff changeset
98 #endif
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36623
diff changeset
99
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36623
diff changeset
100
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
101 #ifndef VERSION
16147
fbf8abec93d1 Clean up some comments and the default VERSION.
Guido van Rossum <guido@python.org>
parents: 14907
diff changeset
102 #define VERSION "2.1"
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
103 #endif
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
104
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
105 #ifndef VPATH
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
106 #define VPATH "."
2896
f0d9f800a4aa Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 #endif
f0d9f800a4aa Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
108
3674
3eaf2c673a11 provide access to $(exec_)prefix
Guido van Rossum <guido@python.org>
parents: 3621
diff changeset
109 #ifndef PREFIX
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
110 # ifdef __VMS
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
111 # define PREFIX ""
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
112 # else
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
113 # define PREFIX "/usr/local"
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 37879
diff changeset
114 # endif
3674
3eaf2c673a11 provide access to $(exec_)prefix
Guido van Rossum <guido@python.org>
parents: 3621
diff changeset
115 #endif
3eaf2c673a11 provide access to $(exec_)prefix
Guido van Rossum <guido@python.org>
parents: 3621
diff changeset
116
3eaf2c673a11 provide access to $(exec_)prefix
Guido van Rossum <guido@python.org>
parents: 3621
diff changeset
117 #ifndef EXEC_PREFIX
3878
4286910080a9 Don't have "." in the default path.
Guido van Rossum <guido@python.org>
parents: 3674
diff changeset
118 #define EXEC_PREFIX PREFIX
3674
3eaf2c673a11 provide access to $(exec_)prefix
Guido van Rossum <guido@python.org>
parents: 3621
diff changeset
119 #endif
3eaf2c673a11 provide access to $(exec_)prefix
Guido van Rossum <guido@python.org>
parents: 3621
diff changeset
120
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
121 #ifndef PYTHONPATH
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
122 #define PYTHONPATH PREFIX "/lib/python" VERSION ":" \
20156
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
123 EXEC_PREFIX "/lib/python" VERSION "/lib-dynload"
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
124 #endif
2896
f0d9f800a4aa Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
125
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
126 #ifndef LANDMARK
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
127 #define LANDMARK L"os.py"
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
128 #endif
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
129
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
130 static wchar_t prefix[MAXPATHLEN+1];
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
131 static wchar_t exec_prefix[MAXPATHLEN+1];
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
132 static wchar_t progpath[MAXPATHLEN+1];
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
133 static wchar_t *module_search_path = NULL;
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
134 static wchar_t lib_python[] = L"lib/python" VERSION;
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
135
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
136 /* In principle, this should use HAVE__WSTAT, and _wstat
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
137 should be detected by autoconf. However, no current
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
138 POSIX system provides that function, so testing for
63983
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
139 it is pointless.
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
140 Not sure whether the MS_WINDOWS guards are necessary:
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
141 perhaps for cygwin/mingw builds?
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
142 */
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
143 #ifndef MS_WINDOWS
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
144 static int
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
145 _wstat(const wchar_t* path, struct stat *buf)
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
146 {
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
147 char fname[PATH_MAX];
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
148 size_t res = wcstombs(fname, path, sizeof(fname));
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
149 if (res == (size_t)-1) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
150 errno = EINVAL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
151 return -1;
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
152 }
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
153 return stat(fname, buf);
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
154 }
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
155 #endif
20156
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
156
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
157 #ifndef MS_WINDOWS
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
158 static wchar_t*
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
159 _wgetcwd(wchar_t *buf, size_t size)
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
160 {
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
161 char fname[PATH_MAX];
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
162 if (getcwd(fname, PATH_MAX) == NULL)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
163 return NULL;
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
164 if (mbstowcs(buf, fname, size) >= size) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
165 errno = ERANGE;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
166 return NULL;
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
167 }
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
168 return buf;
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
169 }
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
170 #endif
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
171
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
172 #ifdef HAVE_READLINK
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
173 int
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
174 _Py_wreadlink(const wchar_t *path, wchar_t *buf, size_t bufsiz)
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
175 {
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
176 char cbuf[PATH_MAX];
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
177 char cpath[PATH_MAX];
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
178 int res;
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
179 size_t r1 = wcstombs(cpath, path, PATH_MAX);
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
180 if (r1 == (size_t)-1 || r1 >= PATH_MAX) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
181 errno = EINVAL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
182 return -1;
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
183 }
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
184 res = (int)readlink(cpath, cbuf, PATH_MAX);
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
185 if (res == -1)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
186 return -1;
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
187 if (res == PATH_MAX) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
188 errno = EINVAL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
189 return -1;
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
190 }
49110
cd61d54fc8c0 Issue #3813: cannot lanch python.exe via symbolic link on cygwin.
Hirokazu Yamamoto <ocean-city@m2.ccsnet.ne.jp>
parents: 46318
diff changeset
191 cbuf[res] = '\0'; /* buf will be null terminated */
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
192 r1 = mbstowcs(buf, cbuf, bufsiz);
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
193 if (r1 == -1) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
194 errno = EINVAL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
195 return -1;
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
196 }
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
197 return (int)r1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
198
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
199 }
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
200 #endif
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
201
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
202 static void
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
203 reduce(wchar_t *dir)
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
204 {
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
205 size_t i = wcslen(dir);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
206 while (i > 0 && dir[i] != SEP)
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
207 --i;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
208 dir[i] = '\0';
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
209 }
7117
419dca2b3a61 Instead of a single exists(), differentiate between files, modules,
Guido van Rossum <guido@python.org>
parents: 6823
diff changeset
210
419dca2b3a61 Instead of a single exists(), differentiate between files, modules,
Guido van Rossum <guido@python.org>
parents: 6823
diff changeset
211
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
212 static int
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
213 isfile(wchar_t *filename) /* Is file, not directory */
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
214 {
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
215 struct stat buf;
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
216 if (_wstat(filename, &buf) != 0)
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
217 return 0;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
218 if (!S_ISREG(buf.st_mode))
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
219 return 0;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
220 return 1;
7117
419dca2b3a61 Instead of a single exists(), differentiate between files, modules,
Guido van Rossum <guido@python.org>
parents: 6823
diff changeset
221 }
419dca2b3a61 Instead of a single exists(), differentiate between files, modules,
Guido van Rossum <guido@python.org>
parents: 6823
diff changeset
222
419dca2b3a61 Instead of a single exists(), differentiate between files, modules,
Guido van Rossum <guido@python.org>
parents: 6823
diff changeset
223
419dca2b3a61 Instead of a single exists(), differentiate between files, modules,
Guido van Rossum <guido@python.org>
parents: 6823
diff changeset
224 static int
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
225 ismodule(wchar_t *filename) /* Is module -- check for .pyc/.pyo too */
7117
419dca2b3a61 Instead of a single exists(), differentiate between files, modules,
Guido van Rossum <guido@python.org>
parents: 6823
diff changeset
226 {
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
227 if (isfile(filename))
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
228 return 1;
7117
419dca2b3a61 Instead of a single exists(), differentiate between files, modules,
Guido van Rossum <guido@python.org>
parents: 6823
diff changeset
229
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
230 /* Check for the compiled version of prefix. */
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
231 if (wcslen(filename) < MAXPATHLEN) {
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
232 wcscat(filename, Py_OptimizeFlag ? L"o" : L"c");
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
233 if (isfile(filename))
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
234 return 1;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
235 }
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
236 return 0;
7117
419dca2b3a61 Instead of a single exists(), differentiate between files, modules,
Guido van Rossum <guido@python.org>
parents: 6823
diff changeset
237 }
419dca2b3a61 Instead of a single exists(), differentiate between files, modules,
Guido van Rossum <guido@python.org>
parents: 6823
diff changeset
238
419dca2b3a61 Instead of a single exists(), differentiate between files, modules,
Guido van Rossum <guido@python.org>
parents: 6823
diff changeset
239
419dca2b3a61 Instead of a single exists(), differentiate between files, modules,
Guido van Rossum <guido@python.org>
parents: 6823
diff changeset
240 static int
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
241 isxfile(wchar_t *filename) /* Is executable file */
7117
419dca2b3a61 Instead of a single exists(), differentiate between files, modules,
Guido van Rossum <guido@python.org>
parents: 6823
diff changeset
242 {
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
243 struct stat buf;
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
244 if (_wstat(filename, &buf) != 0)
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
245 return 0;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
246 if (!S_ISREG(buf.st_mode))
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
247 return 0;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
248 if ((buf.st_mode & 0111) == 0)
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
249 return 0;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
250 return 1;
7117
419dca2b3a61 Instead of a single exists(), differentiate between files, modules,
Guido van Rossum <guido@python.org>
parents: 6823
diff changeset
251 }
419dca2b3a61 Instead of a single exists(), differentiate between files, modules,
Guido van Rossum <guido@python.org>
parents: 6823
diff changeset
252
419dca2b3a61 Instead of a single exists(), differentiate between files, modules,
Guido van Rossum <guido@python.org>
parents: 6823
diff changeset
253
419dca2b3a61 Instead of a single exists(), differentiate between files, modules,
Guido van Rossum <guido@python.org>
parents: 6823
diff changeset
254 static int
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
255 isdir(wchar_t *filename) /* Is directory */
7117
419dca2b3a61 Instead of a single exists(), differentiate between files, modules,
Guido van Rossum <guido@python.org>
parents: 6823
diff changeset
256 {
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
257 struct stat buf;
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
258 if (_wstat(filename, &buf) != 0)
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
259 return 0;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
260 if (!S_ISDIR(buf.st_mode))
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
261 return 0;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
262 return 1;
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
263 }
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
264
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
265
33038
fee2038b8fa9 Bug 1003471: Python 1.5.2 security vulnerability still present in 2.3.4
Tim Peters <tim.peters@gmail.com>
parents: 32410
diff changeset
266 /* Add a path component, by appending stuff to buffer.
fee2038b8fa9 Bug 1003471: Python 1.5.2 security vulnerability still present in 2.3.4
Tim Peters <tim.peters@gmail.com>
parents: 32410
diff changeset
267 buffer must have at least MAXPATHLEN + 1 bytes allocated, and contain a
fee2038b8fa9 Bug 1003471: Python 1.5.2 security vulnerability still present in 2.3.4
Tim Peters <tim.peters@gmail.com>
parents: 32410
diff changeset
268 NUL-terminated string with no more than MAXPATHLEN characters (not counting
fee2038b8fa9 Bug 1003471: Python 1.5.2 security vulnerability still present in 2.3.4
Tim Peters <tim.peters@gmail.com>
parents: 32410
diff changeset
269 the trailing NUL). It's a fatal error if it contains a string longer than
fee2038b8fa9 Bug 1003471: Python 1.5.2 security vulnerability still present in 2.3.4
Tim Peters <tim.peters@gmail.com>
parents: 32410
diff changeset
270 that (callers must be careful!). If these requirements are met, it's
fee2038b8fa9 Bug 1003471: Python 1.5.2 security vulnerability still present in 2.3.4
Tim Peters <tim.peters@gmail.com>
parents: 32410
diff changeset
271 guaranteed that buffer will still be a NUL-terminated string with no more
fee2038b8fa9 Bug 1003471: Python 1.5.2 security vulnerability still present in 2.3.4
Tim Peters <tim.peters@gmail.com>
parents: 32410
diff changeset
272 than MAXPATHLEN characters at exit. If stuff is too long, only as much of
fee2038b8fa9 Bug 1003471: Python 1.5.2 security vulnerability still present in 2.3.4
Tim Peters <tim.peters@gmail.com>
parents: 32410
diff changeset
273 stuff as fits will be appended.
14898
4bea4f59c4e4 Fix buffer overflow vulnerabilities in calculate_path(). Code used
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14845
diff changeset
274 */
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
275 static void
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
276 joinpath(wchar_t *buffer, wchar_t *stuff)
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
277 {
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
278 size_t n, k;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
279 if (stuff[0] == SEP)
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
280 n = 0;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
281 else {
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
282 n = wcslen(buffer);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
283 if (n > 0 && buffer[n-1] != SEP && n < MAXPATHLEN)
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
284 buffer[n++] = SEP;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
285 }
33038
fee2038b8fa9 Bug 1003471: Python 1.5.2 security vulnerability still present in 2.3.4
Tim Peters <tim.peters@gmail.com>
parents: 32410
diff changeset
286 if (n > MAXPATHLEN)
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
287 Py_FatalError("buffer overflow in getpath.c's joinpath()");
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
288 k = wcslen(stuff);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
289 if (n + k > MAXPATHLEN)
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
290 k = MAXPATHLEN - n;
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
291 wcsncpy(buffer+n, stuff, k);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
292 buffer[n+k] = '\0';
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
293 }
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
294
20156
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
295 /* copy_absolute requires that path be allocated at least
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
296 MAXPATHLEN + 1 bytes and that p be no more than MAXPATHLEN bytes. */
14845
88d3a8974409 fix bug #114290: when interpreter's argv[0] has a relative path make
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14375
diff changeset
297 static void
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
298 copy_absolute(wchar_t *path, wchar_t *p)
14845
88d3a8974409 fix bug #114290: when interpreter's argv[0] has a relative path make
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14375
diff changeset
299 {
20156
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
300 if (p[0] == SEP)
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
301 wcscpy(path, p);
14845
88d3a8974409 fix bug #114290: when interpreter's argv[0] has a relative path make
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14375
diff changeset
302 else {
65171
39a0b943e3e1 copy_absolute(): keep the relative path if _wgetcwd() failed
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63983
diff changeset
303 if (!_wgetcwd(path, MAXPATHLEN)) {
39a0b943e3e1 copy_absolute(): keep the relative path if _wgetcwd() failed
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63983
diff changeset
304 /* unable to get the current directory */
39a0b943e3e1 copy_absolute(): keep the relative path if _wgetcwd() failed
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63983
diff changeset
305 wcscpy(path, p);
39a0b943e3e1 copy_absolute(): keep the relative path if _wgetcwd() failed
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63983
diff changeset
306 return;
39a0b943e3e1 copy_absolute(): keep the relative path if _wgetcwd() failed
Victor Stinner <victor.stinner@haypocalc.com>
parents: 63983
diff changeset
307 }
20156
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
308 if (p[0] == '.' && p[1] == SEP)
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
309 p += 2;
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
310 joinpath(path, p);
14845
88d3a8974409 fix bug #114290: when interpreter's argv[0] has a relative path make
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14375
diff changeset
311 }
88d3a8974409 fix bug #114290: when interpreter's argv[0] has a relative path make
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14375
diff changeset
312 }
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
313
20156
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
314 /* absolutize() requires that path be allocated at least MAXPATHLEN+1 bytes. */
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
315 static void
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
316 absolutize(wchar_t *path)
20156
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
317 {
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
318 wchar_t buffer[MAXPATHLEN + 1];
20156
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
319
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
320 if (path[0] == SEP)
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
321 return;
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
322 copy_absolute(buffer, path);
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
323 wcscpy(path, buffer);
20156
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
324 }
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
325
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
326 /* search_for_prefix requires that argv0_path be no more than MAXPATHLEN
14898
4bea4f59c4e4 Fix buffer overflow vulnerabilities in calculate_path(). Code used
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14845
diff changeset
327 bytes long.
4bea4f59c4e4 Fix buffer overflow vulnerabilities in calculate_path(). Code used
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14845
diff changeset
328 */
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
329 static int
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
330 search_for_prefix(wchar_t *argv0_path, wchar_t *home)
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
331 {
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
332 size_t n;
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
333 wchar_t *vpath;
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
334
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
335 /* If PYTHONHOME is set, we believe it unconditionally */
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
336 if (home) {
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
337 wchar_t *delim;
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
338 wcsncpy(prefix, home, MAXPATHLEN);
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
339 delim = wcschr(prefix, DELIM);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
340 if (delim)
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
341 *delim = L'\0';
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
342 joinpath(prefix, lib_python);
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
343 joinpath(prefix, LANDMARK);
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
344 return 1;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
345 }
12775
8e2b35d386aa Patch from M.-A. Lemburg:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
346
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
347 /* Check to see if argv[0] is in the build directory */
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
348 wcscpy(prefix, argv0_path);
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
349 joinpath(prefix, L"Modules/Setup");
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
350 if (isfile(prefix)) {
16222
a0e46c3be63e Build now happens in toplevel directory, not Modules. Don't monkey with
Neil Schemenauer <nascheme@enme.ucalgary.ca>
parents: 16147
diff changeset
351 /* Check VPATH to see if argv0_path is in the build directory. */
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
352 vpath = L"" VPATH;
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
353 wcscpy(prefix, argv0_path);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
354 joinpath(prefix, vpath);
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
355 joinpath(prefix, L"Lib");
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
356 joinpath(prefix, LANDMARK);
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
357 if (ismodule(prefix))
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
358 return -1;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
359 }
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
360
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
361 /* Search from argv0_path, until root is found */
20156
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
362 copy_absolute(prefix, argv0_path);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
363 do {
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
364 n = wcslen(prefix);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
365 joinpath(prefix, lib_python);
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
366 joinpath(prefix, LANDMARK);
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
367 if (ismodule(prefix))
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
368 return 1;
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
369 prefix[n] = L'\0';
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
370 reduce(prefix);
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
371 } while (prefix[0]);
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
372
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
373 /* Look at configure's PREFIX */
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
374 wcsncpy(prefix, L"" PREFIX, MAXPATHLEN);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
375 joinpath(prefix, lib_python);
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
376 joinpath(prefix, LANDMARK);
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
377 if (ismodule(prefix))
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
378 return 1;
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
379
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
380 /* Fail */
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
381 return 0;
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
382 }
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
383
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
384
14898
4bea4f59c4e4 Fix buffer overflow vulnerabilities in calculate_path(). Code used
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14845
diff changeset
385 /* search_for_exec_prefix requires that argv0_path be no more than
20156
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
386 MAXPATHLEN bytes long.
14898
4bea4f59c4e4 Fix buffer overflow vulnerabilities in calculate_path(). Code used
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14845
diff changeset
387 */
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
388 static int
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
389 search_for_exec_prefix(wchar_t *argv0_path, wchar_t *home)
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
390 {
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
391 size_t n;
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
392
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
393 /* If PYTHONHOME is set, we believe it unconditionally */
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
394 if (home) {
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
395 wchar_t *delim;
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
396 delim = wcschr(home, DELIM);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
397 if (delim)
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
398 wcsncpy(exec_prefix, delim+1, MAXPATHLEN);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
399 else
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
400 wcsncpy(exec_prefix, home, MAXPATHLEN);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
401 joinpath(exec_prefix, lib_python);
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
402 joinpath(exec_prefix, L"lib-dynload");
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
403 return 1;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
404 }
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
405
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
406 /* Check to see if argv[0] is in the build directory */
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
407 wcscpy(exec_prefix, argv0_path);
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
408 joinpath(exec_prefix, L"Modules/Setup");
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
409 if (isfile(exec_prefix)) {
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
410 reduce(exec_prefix);
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
411 return -1;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
412 }
12775
8e2b35d386aa Patch from M.-A. Lemburg:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12576
diff changeset
413
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
414 /* Search from argv0_path, until root is found */
20156
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
415 copy_absolute(exec_prefix, argv0_path);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
416 do {
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
417 n = wcslen(exec_prefix);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
418 joinpath(exec_prefix, lib_python);
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
419 joinpath(exec_prefix, L"lib-dynload");
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
420 if (isdir(exec_prefix))
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
421 return 1;
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
422 exec_prefix[n] = L'\0';
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
423 reduce(exec_prefix);
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
424 } while (exec_prefix[0]);
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
425
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
426 /* Look at configure's EXEC_PREFIX */
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
427 wcsncpy(exec_prefix, L"" EXEC_PREFIX, MAXPATHLEN);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
428 joinpath(exec_prefix, lib_python);
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
429 joinpath(exec_prefix, L"lib-dynload");
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
430 if (isdir(exec_prefix))
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
431 return 1;
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
432
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
433 /* Fail */
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
434 return 0;
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
435 }
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
436
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
437
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
438 static void
13651
8a063423e0b7 Bunch of minor ANSIfications: 'void initfunc()' -> 'void initfunc(void)',
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
439 calculate_path(void)
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
440 {
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
441 extern wchar_t *Py_GetProgramName(void);
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
442
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
443 static wchar_t delimiter[2] = {DELIM, '\0'};
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
444 static wchar_t separator[2] = {SEP, '\0'};
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
445 wchar_t *pythonpath = L"" PYTHONPATH;
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
446 char *_rtpypath = Py_GETENV("PYTHONPATH"); /* XXX use wide version on Windows */
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
447 wchar_t rtpypath[MAXPATHLEN+1];
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
448 wchar_t *home = Py_GetPythonHome();
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
449 char *_path = getenv("PATH");
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
450 wchar_t wpath[MAXPATHLEN+1];
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
451 wchar_t *path = NULL;
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
452 wchar_t *prog = Py_GetProgramName();
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
453 wchar_t argv0_path[MAXPATHLEN+1];
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
454 wchar_t zip_path[MAXPATHLEN+1];
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
455 int pfound, efound; /* 1 if found; -1 if found build directory */
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
456 wchar_t *buf;
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
457 size_t bufsz;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
458 size_t prefixsz;
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
459 wchar_t *defpath = pythonpath;
9970
8efa37a770c6 Patches by William Lewis for Nextstep descendants.
Guido van Rossum <guido@python.org>
parents: 8203
diff changeset
460 #ifdef WITH_NEXT_FRAMEWORK
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
461 NSModule pythonModule;
9970
8efa37a770c6 Patches by William Lewis for Nextstep descendants.
Guido van Rossum <guido@python.org>
parents: 8203
diff changeset
462 #endif
32229
27967fbba48f Fix for #932977: MacOSX does not pass the whole pathname in argv[0] for
Jack Jansen <jack.jansen@cwi.nl>
parents: 26944
diff changeset
463 #ifdef __APPLE__
36205
01cbed5e8731 squash compiler warning on Mac OSX 10.3
Skip Montanaro <skip@pobox.com>
parents: 35578
diff changeset
464 #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4
35578
c28d0ed86ff0 Change type on variable to silence gcc 4 warning. Call signature was found at
Brett Cannon <bcannon@gmail.com>
parents: 33038
diff changeset
465 uint32_t nsexeclength = MAXPATHLEN;
36205
01cbed5e8731 squash compiler warning on Mac OSX 10.3
Skip Montanaro <skip@pobox.com>
parents: 35578
diff changeset
466 #else
01cbed5e8731 squash compiler warning on Mac OSX 10.3
Skip Montanaro <skip@pobox.com>
parents: 35578
diff changeset
467 unsigned long nsexeclength = MAXPATHLEN;
01cbed5e8731 squash compiler warning on Mac OSX 10.3
Skip Montanaro <skip@pobox.com>
parents: 35578
diff changeset
468 #endif
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
469 char execpath[MAXPATHLEN+1];
32229
27967fbba48f Fix for #932977: MacOSX does not pass the whole pathname in argv[0] for
Jack Jansen <jack.jansen@cwi.nl>
parents: 26944
diff changeset
470 #endif
20156
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
471
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
472 if (_path) {
63983
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
473 size_t r = mbstowcs(wpath, _path, MAXPATHLEN+1);
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
474 path = wpath;
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
475 if (r == (size_t)-1 || r > MAXPATHLEN) {
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
476 /* Could not convert PATH, or it's too long. */
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
477 path = NULL;
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
478 }
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
479 }
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
480
63983
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
481 /* If there is no slash in the argv0 path, then we have to
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
482 * assume python is on the user's $PATH, since there's no
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
483 * other way to find a directory to start the search from. If
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
484 * $PATH isn't exported, you lose.
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
485 */
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
486 if (wcschr(prog, SEP))
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
487 wcsncpy(progpath, prog, MAXPATHLEN);
32229
27967fbba48f Fix for #932977: MacOSX does not pass the whole pathname in argv[0] for
Jack Jansen <jack.jansen@cwi.nl>
parents: 26944
diff changeset
488 #ifdef __APPLE__
27967fbba48f Fix for #932977: MacOSX does not pass the whole pathname in argv[0] for
Jack Jansen <jack.jansen@cwi.nl>
parents: 26944
diff changeset
489 /* On Mac OS X, if a script uses an interpreter of the form
27967fbba48f Fix for #932977: MacOSX does not pass the whole pathname in argv[0] for
Jack Jansen <jack.jansen@cwi.nl>
parents: 26944
diff changeset
490 * "#!/opt/python2.3/bin/python", the kernel only passes "python"
27967fbba48f Fix for #932977: MacOSX does not pass the whole pathname in argv[0] for
Jack Jansen <jack.jansen@cwi.nl>
parents: 26944
diff changeset
491 * as argv[0], which falls through to the $PATH search below.
27967fbba48f Fix for #932977: MacOSX does not pass the whole pathname in argv[0] for
Jack Jansen <jack.jansen@cwi.nl>
parents: 26944
diff changeset
492 * If /opt/python2.3/bin isn't in your path, or is near the end,
27967fbba48f Fix for #932977: MacOSX does not pass the whole pathname in argv[0] for
Jack Jansen <jack.jansen@cwi.nl>
parents: 26944
diff changeset
493 * this algorithm may incorrectly find /usr/bin/python. To work
27967fbba48f Fix for #932977: MacOSX does not pass the whole pathname in argv[0] for
Jack Jansen <jack.jansen@cwi.nl>
parents: 26944
diff changeset
494 * around this, we can use _NSGetExecutablePath to get a better
27967fbba48f Fix for #932977: MacOSX does not pass the whole pathname in argv[0] for
Jack Jansen <jack.jansen@cwi.nl>
parents: 26944
diff changeset
495 * hint of what the intended interpreter was, although this
27967fbba48f Fix for #932977: MacOSX does not pass the whole pathname in argv[0] for
Jack Jansen <jack.jansen@cwi.nl>
parents: 26944
diff changeset
496 * will fail if a relative path was used. but in that case,
27967fbba48f Fix for #932977: MacOSX does not pass the whole pathname in argv[0] for
Jack Jansen <jack.jansen@cwi.nl>
parents: 26944
diff changeset
497 * absolutize() should help us out below
27967fbba48f Fix for #932977: MacOSX does not pass the whole pathname in argv[0] for
Jack Jansen <jack.jansen@cwi.nl>
parents: 26944
diff changeset
498 */
63983
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
499 else if(0 == _NSGetExecutablePath(execpath, &nsexeclength) && execpath[0] == SEP) {
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
500 size_t r = mbstowcs(progpath, execpath, MAXPATHLEN+1);
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
501 if (r == (size_t)-1 || r > MAXPATHLEN) {
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
502 /* Could not convert execpath, or it's too long. */
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
503 progpath[0] = '\0';
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
504 }
63983
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
505 }
32399
472023d0a10d Change comment from C++ style to C.
Brett Cannon <bcannon@gmail.com>
parents: 32229
diff changeset
506 #endif /* __APPLE__ */
63983
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
507 else if (path) {
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
508 while (1) {
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
509 wchar_t *delim = wcschr(path, DELIM);
21141
51b4572cf013 Changed logic for finding python home in Mac OS X framework Pythons.
Jack Jansen <jack.jansen@cwi.nl>
parents: 20156
diff changeset
510
63983
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
511 if (delim) {
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
512 size_t len = delim - path;
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
513 if (len > MAXPATHLEN)
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
514 len = MAXPATHLEN;
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
515 wcsncpy(progpath, path, len);
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
516 *(progpath + len) = '\0';
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
517 }
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
518 else
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
519 wcsncpy(progpath, path, MAXPATHLEN);
21141
51b4572cf013 Changed logic for finding python home in Mac OS X framework Pythons.
Jack Jansen <jack.jansen@cwi.nl>
parents: 20156
diff changeset
520
63983
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
521 joinpath(progpath, prog);
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
522 if (isxfile(progpath))
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
523 break;
21141
51b4572cf013 Changed logic for finding python home in Mac OS X framework Pythons.
Jack Jansen <jack.jansen@cwi.nl>
parents: 20156
diff changeset
524
63983
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
525 if (!delim) {
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
526 progpath[0] = L'\0';
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
527 break;
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
528 }
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
529 path = delim + 1;
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
530 }
63983
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
531 }
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
532 else
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
533 progpath[0] = '\0';
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
534 if (progpath[0] != SEP && progpath[0] != '\0')
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
535 absolutize(progpath);
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
536 wcsncpy(argv0_path, progpath, MAXPATHLEN);
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
537 argv0_path[MAXPATHLEN] = '\0';
21141
51b4572cf013 Changed logic for finding python home in Mac OS X framework Pythons.
Jack Jansen <jack.jansen@cwi.nl>
parents: 20156
diff changeset
538
9970
8efa37a770c6 Patches by William Lewis for Nextstep descendants.
Guido van Rossum <guido@python.org>
parents: 8203
diff changeset
539 #ifdef WITH_NEXT_FRAMEWORK
63983
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
540 /* On Mac OS X we have a special case if we're running from a framework.
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
541 ** This is because the python home should be set relative to the library,
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
542 ** which is in the framework, not relative to the executable, which may
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
543 ** be outside of the framework. Except when we're in the build directory...
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
544 */
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
545 pythonModule = NSModuleForSymbol(NSLookupAndBindSymbol("_Py_Initialize"));
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
546 /* Use dylib functions to find out where the framework was loaded from */
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
547 buf = (wchar_t *)NSLibraryNameForModule(pythonModule);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
548 if (buf != NULL) {
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
549 /* We're in a framework. */
19261
ca7dbacbbe18 With WITH_NEXT_FRAMEWORK defined we now also expect a normal Python
Jack Jansen <jack.jansen@cwi.nl>
parents: 19061
diff changeset
550 /* See if we might be in the build directory. The framework in the
ca7dbacbbe18 With WITH_NEXT_FRAMEWORK defined we now also expect a normal Python
Jack Jansen <jack.jansen@cwi.nl>
parents: 19061
diff changeset
551 ** build directory is incomplete, it only has the .dylib and a few
ca7dbacbbe18 With WITH_NEXT_FRAMEWORK defined we now also expect a normal Python
Jack Jansen <jack.jansen@cwi.nl>
parents: 19061
diff changeset
552 ** needed symlinks, it doesn't have the Lib directories and such.
ca7dbacbbe18 With WITH_NEXT_FRAMEWORK defined we now also expect a normal Python
Jack Jansen <jack.jansen@cwi.nl>
parents: 19061
diff changeset
553 ** If we're running with the framework from the build directory we must
ca7dbacbbe18 With WITH_NEXT_FRAMEWORK defined we now also expect a normal Python
Jack Jansen <jack.jansen@cwi.nl>
parents: 19061
diff changeset
554 ** be running the interpreter in the build directory, so we use the
ca7dbacbbe18 With WITH_NEXT_FRAMEWORK defined we now also expect a normal Python
Jack Jansen <jack.jansen@cwi.nl>
parents: 19061
diff changeset
555 ** build-directory-specific logic to find Lib and such.
ca7dbacbbe18 With WITH_NEXT_FRAMEWORK defined we now also expect a normal Python
Jack Jansen <jack.jansen@cwi.nl>
parents: 19061
diff changeset
556 */
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
557 wcsncpy(argv0_path, buf, MAXPATHLEN);
19261
ca7dbacbbe18 With WITH_NEXT_FRAMEWORK defined we now also expect a normal Python
Jack Jansen <jack.jansen@cwi.nl>
parents: 19061
diff changeset
558 reduce(argv0_path);
ca7dbacbbe18 With WITH_NEXT_FRAMEWORK defined we now also expect a normal Python
Jack Jansen <jack.jansen@cwi.nl>
parents: 19061
diff changeset
559 joinpath(argv0_path, lib_python);
ca7dbacbbe18 With WITH_NEXT_FRAMEWORK defined we now also expect a normal Python
Jack Jansen <jack.jansen@cwi.nl>
parents: 19061
diff changeset
560 joinpath(argv0_path, LANDMARK);
ca7dbacbbe18 With WITH_NEXT_FRAMEWORK defined we now also expect a normal Python
Jack Jansen <jack.jansen@cwi.nl>
parents: 19061
diff changeset
561 if (!ismodule(argv0_path)) {
63983
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
562 /* We are in the build directory so use the name of the
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
563 executable - we know that the absolute path is passed */
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
564 wcsncpy(argv0_path, progpath, MAXPATHLEN);
19261
ca7dbacbbe18 With WITH_NEXT_FRAMEWORK defined we now also expect a normal Python
Jack Jansen <jack.jansen@cwi.nl>
parents: 19061
diff changeset
565 }
ca7dbacbbe18 With WITH_NEXT_FRAMEWORK defined we now also expect a normal Python
Jack Jansen <jack.jansen@cwi.nl>
parents: 19061
diff changeset
566 else {
63983
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
567 /* Use the location of the library as the progpath */
293e332b8b4b Merged revisions 84008-84009 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 63169
diff changeset
568 wcsncpy(argv0_path, buf, MAXPATHLEN);
19261
ca7dbacbbe18 With WITH_NEXT_FRAMEWORK defined we now also expect a normal Python
Jack Jansen <jack.jansen@cwi.nl>
parents: 19061
diff changeset
569 }
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
570 }
9970
8efa37a770c6 Patches by William Lewis for Nextstep descendants.
Guido van Rossum <guido@python.org>
parents: 8203
diff changeset
571 #endif
20156
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
572
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
573 #if HAVE_READLINK
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
574 {
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
575 wchar_t tmpbuffer[MAXPATHLEN+1];
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
576 int linklen = _Py_wreadlink(progpath, tmpbuffer, MAXPATHLEN);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
577 while (linklen != -1) {
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
578 if (tmpbuffer[0] == SEP)
20156
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
579 /* tmpbuffer should never be longer than MAXPATHLEN,
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
580 but extra check does not hurt */
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
581 wcsncpy(argv0_path, tmpbuffer, MAXPATHLEN);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
582 else {
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
583 /* Interpret relative to progpath */
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
584 reduce(argv0_path);
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
585 joinpath(argv0_path, tmpbuffer);
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
586 }
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
587 linklen = _Py_wreadlink(argv0_path, tmpbuffer, MAXPATHLEN);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
588 }
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
589 }
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
590 #endif /* HAVE_READLINK */
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
591
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
592 reduce(argv0_path);
14898
4bea4f59c4e4 Fix buffer overflow vulnerabilities in calculate_path(). Code used
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14845
diff changeset
593 /* At this point, argv0_path is guaranteed to be less than
4bea4f59c4e4 Fix buffer overflow vulnerabilities in calculate_path(). Code used
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14845
diff changeset
594 MAXPATHLEN bytes long.
4bea4f59c4e4 Fix buffer overflow vulnerabilities in calculate_path(). Code used
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 14845
diff changeset
595 */
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
596
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
597 if (!(pfound = search_for_prefix(argv0_path, home))) {
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
598 if (!Py_FrozenFlag)
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
599 fprintf(stderr,
20156
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
600 "Could not find platform independent libraries <prefix>\n");
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
601 wcsncpy(prefix, L"" PREFIX, MAXPATHLEN);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
602 joinpath(prefix, lib_python);
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
603 }
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
604 else
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
605 reduce(prefix);
20156
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
606
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
607 wcsncpy(zip_path, prefix, MAXPATHLEN);
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
608 zip_path[MAXPATHLEN] = L'\0';
26885
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26764
diff changeset
609 if (pfound > 0) { /* Use the reduced prefix returned by Py_GetPrefix() */
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26764
diff changeset
610 reduce(zip_path);
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26764
diff changeset
611 reduce(zip_path);
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26764
diff changeset
612 }
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26764
diff changeset
613 else
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
614 wcsncpy(zip_path, L"" PREFIX, MAXPATHLEN);
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
615 joinpath(zip_path, L"lib/python00.zip");
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
616 bufsz = wcslen(zip_path); /* Replace "00" with version */
26885
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26764
diff changeset
617 zip_path[bufsz - 6] = VERSION[0];
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26764
diff changeset
618 zip_path[bufsz - 5] = VERSION[2];
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26764
diff changeset
619
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
620 if (!(efound = search_for_exec_prefix(argv0_path, home))) {
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
621 if (!Py_FrozenFlag)
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
622 fprintf(stderr,
20156
416f0bc228e8 Be more rigorous about making pathnames absolute, to address SF bug
Guido van Rossum <guido@python.org>
parents: 19261
diff changeset
623 "Could not find platform dependent libraries <exec_prefix>\n");
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
624 wcsncpy(exec_prefix, L"" EXEC_PREFIX, MAXPATHLEN);
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
625 joinpath(exec_prefix, L"lib/lib-dynload");
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
626 }
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
627 /* If we found EXEC_PREFIX do *not* reduce it! (Yet.) */
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
628
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
629 if ((!pfound || !efound) && !Py_FrozenFlag)
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
630 fprintf(stderr,
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
631 "Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]\n");
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
632
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
633 /* Calculate size of return buffer.
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
634 */
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
635 bufsz = 0;
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
636
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
637 if (_rtpypath) {
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
638 size_t s = mbstowcs(rtpypath, _rtpypath, sizeof(rtpypath)/sizeof(wchar_t));
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
639 if (s == (size_t)-1 || s >=sizeof(rtpypath))
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
640 /* XXX deal with errors more gracefully */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
641 _rtpypath = NULL;
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
642 if (_rtpypath)
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
643 bufsz += wcslen(rtpypath) + 1;
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
644 }
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
645
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
646 prefixsz = wcslen(prefix) + 1;
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
647
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
648 while (1) {
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
649 wchar_t *delim = wcschr(defpath, DELIM);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
650
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
651 if (defpath[0] != SEP)
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
652 /* Paths are relative to prefix */
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
653 bufsz += prefixsz;
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
654
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
655 if (delim)
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
656 bufsz += delim - defpath + 1;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
657 else {
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
658 bufsz += wcslen(defpath) + 1;
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
659 break;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
660 }
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
661 defpath = delim + 1;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
662 }
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
663
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
664 bufsz += wcslen(zip_path) + 1;
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
665 bufsz += wcslen(exec_prefix) + 1;
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
666
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
667 /* This is the only malloc call in this file */
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
668 buf = (wchar_t *)PyMem_Malloc(bufsz*sizeof(wchar_t));
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
669
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
670 if (buf == NULL) {
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
671 /* We can't exit, so print a warning and limp along */
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
672 fprintf(stderr, "Not enough memory for dynamic PYTHONPATH.\n");
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
673 fprintf(stderr, "Using default static PYTHONPATH.\n");
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
674 module_search_path = L"" PYTHONPATH;
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
675 }
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
676 else {
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
677 /* Run-time value of $PYTHONPATH goes first */
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
678 if (_rtpypath) {
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
679 wcscpy(buf, rtpypath);
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
680 wcscat(buf, delimiter);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
681 }
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
682 else
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
683 buf[0] = '\0';
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
684
26885
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26764
diff changeset
685 /* Next is the default zip path */
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
686 wcscat(buf, zip_path);
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
687 wcscat(buf, delimiter);
26885
54aacb87beda PEP 302 + zipimport:
Just van Rossum <just@letterror.com>
parents: 26764
diff changeset
688
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
689 /* Next goes merge of compile-time $PYTHONPATH with
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
690 * dynamically located prefix.
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
691 */
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
692 defpath = pythonpath;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
693 while (1) {
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
694 wchar_t *delim = wcschr(defpath, DELIM);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
695
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
696 if (defpath[0] != SEP) {
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
697 wcscat(buf, prefix);
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
698 wcscat(buf, separator);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
699 }
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
700
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
701 if (delim) {
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
702 size_t len = delim - defpath + 1;
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
703 size_t end = wcslen(buf) + len;
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
704 wcsncat(buf, defpath, len);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
705 *(buf + end) = '\0';
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
706 }
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
707 else {
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
708 wcscat(buf, defpath);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
709 break;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
710 }
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
711 defpath = delim + 1;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
712 }
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
713 wcscat(buf, delimiter);
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
714
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
715 /* Finally, on goes the directory for dynamic-load modules */
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
716 wcscat(buf, exec_prefix);
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
717
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
718 /* And publish the results */
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
719 module_search_path = buf;
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
720 }
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
721
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
722 /* Reduce prefix and exec_prefix to their essence,
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
723 * e.g. /usr/local/lib/python1.5 is reduced to /usr/local.
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
724 * If we're loading relative to the build directory,
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
725 * return the compiled-in defaults instead.
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
726 */
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
727 if (pfound > 0) {
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
728 reduce(prefix);
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
729 reduce(prefix);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
730 /* The prefix is the root directory, but reduce() chopped
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
731 * off the "/". */
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
732 if (!prefix[0])
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
733 wcscpy(prefix, separator);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
734 }
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
735 else
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
736 wcsncpy(prefix, L"" PREFIX, MAXPATHLEN);
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
737
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
738 if (efound > 0) {
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
739 reduce(exec_prefix);
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
740 reduce(exec_prefix);
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
741 reduce(exec_prefix);
61467
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
742 if (!exec_prefix[0])
f197407bdba2 Recorded merge of revisions 81032 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 59856
diff changeset
743 wcscpy(exec_prefix, separator);
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
744 }
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
745 else
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
746 wcsncpy(exec_prefix, L"" EXEC_PREFIX, MAXPATHLEN);
5300
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
747 }
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
748
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
749
e77942562dd3 Completely revamped the way the default path is constructed.
Guido van Rossum <guido@python.org>
parents: 4503
diff changeset
750 /* External interface */
2896
f0d9f800a4aa Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
751
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
752 wchar_t *
13651
8a063423e0b7 Bunch of minor ANSIfications: 'void initfunc()' -> 'void initfunc(void)',
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
753 Py_GetPath(void)
2896
f0d9f800a4aa Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
754 {
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
755 if (!module_search_path)
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
756 calculate_path();
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
757 return module_search_path;
2896
f0d9f800a4aa Initial revision
Guido van Rossum <guido@python.org>
parents:
diff changeset
758 }
3674
3eaf2c673a11 provide access to $(exec_)prefix
Guido van Rossum <guido@python.org>
parents: 3621
diff changeset
759
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
760 wchar_t *
13651
8a063423e0b7 Bunch of minor ANSIfications: 'void initfunc()' -> 'void initfunc(void)',
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
761 Py_GetPrefix(void)
3674
3eaf2c673a11 provide access to $(exec_)prefix
Guido van Rossum <guido@python.org>
parents: 3621
diff changeset
762 {
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
763 if (!module_search_path)
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
764 calculate_path();
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
765 return prefix;
3674
3eaf2c673a11 provide access to $(exec_)prefix
Guido van Rossum <guido@python.org>
parents: 3621
diff changeset
766 }
3eaf2c673a11 provide access to $(exec_)prefix
Guido van Rossum <guido@python.org>
parents: 3621
diff changeset
767
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
768 wchar_t *
13651
8a063423e0b7 Bunch of minor ANSIfications: 'void initfunc()' -> 'void initfunc(void)',
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
769 Py_GetExecPrefix(void)
3674
3eaf2c673a11 provide access to $(exec_)prefix
Guido van Rossum <guido@python.org>
parents: 3621
diff changeset
770 {
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
771 if (!module_search_path)
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
772 calculate_path();
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
773 return exec_prefix;
3674
3eaf2c673a11 provide access to $(exec_)prefix
Guido van Rossum <guido@python.org>
parents: 3621
diff changeset
774 }
5568
139ab21d2629 Make delimiter and separator static for K&R C.
Guido van Rossum <guido@python.org>
parents: 5500
diff changeset
775
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
776 wchar_t *
13651
8a063423e0b7 Bunch of minor ANSIfications: 'void initfunc()' -> 'void initfunc(void)',
Thomas Wouters <thomas@python.org>
parents: 13620
diff changeset
777 Py_GetProgramFullPath(void)
5568
139ab21d2629 Make delimiter and separator static for K&R C.
Guido van Rossum <guido@python.org>
parents: 5500
diff changeset
778 {
13428
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
779 if (!module_search_path)
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
780 calculate_path();
0d6af303a86c ANSI-fied sources, converted to four-space indentation.
Fred Drake <fdrake@acm.org>
parents: 13256
diff changeset
781 return progpath;
5568
139ab21d2629 Make delimiter and separator static for K&R C.
Guido van Rossum <guido@python.org>
parents: 5500
diff changeset
782 }
37879
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36623
diff changeset
783
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36623
diff changeset
784
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36623
diff changeset
785 #ifdef __cplusplus
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36623
diff changeset
786 }
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36623
diff changeset
787 #endif
f731859e9b3b Merge p3yk branch with the trunk up to revision 45595. This breaks a fair
Thomas Wouters <thomas@python.org>
parents: 36623
diff changeset
788