annotate Modules/getpath.c @ 66978:aed2bbafa550 3.1

Blocked revisions 87324 via svnmerge ........ r87324 | r.david.murray | 2010-12-16 14:08:51 -0500 (Thu, 16 Dec 2010) | 9 lines #10719: restore messages generated on invalid compileall args Before the introduction of filename arguments to compileall it gave semi useful messages about not being able to 'list' names that weren't valid directories. This fix restores that behavior. In addition to the test for this case, the patch also adds a test for the default behavior of compileall when no arguments are provided, and fixes a bug in one of the previously added tests. ........
author R. David Murray <rdmurray@bitdance.com>
date Thu, 16 Dec 2010 19:10:16 +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