annotate PC/getpathp.c @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 18bb92b0c458
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
1
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
2 /* Return the initial module search path. */
79479
d853354e1470 #16135: Removal of OS/2 support (Remove OS2 and OS/2 references)
Jesus Cea <jcea@jcea.es>
parents: 77154
diff changeset
3 /* Used by DOS, Windows 3.1, Windows 95/98, Windows NT. */
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
4
12116
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
5 /* ----------------------------------------------------------------
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
6 PATH RULES FOR WINDOWS:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
7 This describes how sys.path is formed on Windows. It describes the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
8 functionality, not the implementation (ie, the order in which these
12116
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
9 are actually fetched is different)
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
10
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
11 * Python always adds an empty entry at the start, which corresponds
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
12 to the current directory.
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
13
35276
4adbd331d335 Fix all wrong instances of "it's".
Georg Brandl <georg@python.org>
parents: 33017
diff changeset
14 * If the PYTHONPATH env. var. exists, its entries are added next.
12116
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
15
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
16 * We look in the registry for "application paths" - that is, sub-keys
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
17 under the main PythonPath registry key. These are added next (the
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
18 order of sub-key processing is undefined).
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
19 HKEY_CURRENT_USER is searched and added first.
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
20 HKEY_LOCAL_MACHINE is searched and added next.
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
21 (Note that all known installers only use HKLM, so HKCU is typically
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
22 empty)
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
23
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
24 * We attempt to locate the "Python Home" - if the PYTHONHOME env var
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
25 is set, we believe it. Otherwise, we use the path of our host .EXE's
12775
8e2b35d386aa Patch from M.-A. Lemburg:
Jeremy Hylton <jeremy@alum.mit.edu>
parents: 12116
diff changeset
26 to try and locate our "landmark" (lib\\os.py) and deduce our home.
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
27 - If we DO have a Python Home: The relevant sub-directories (Lib,
47135
cce1b243c11d Tkinter, step 5: remove lib-tk subdirectory and update all places where it was mentioned.
Georg Brandl <georg@python.org>
parents: 46318
diff changeset
28 plat-win, etc) are based on the Python Home
12116
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
29 - If we DO NOT have a Python Home, the core Python Path is
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
30 loaded from the registry. This is the main PythonPath key,
12116
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
31 and both HKLM and HKCU are combined to form the path)
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
32
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
33 * Iff - we can not locate the Python Home, have not had a PYTHONPATH
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
34 specified, and can't locate any Registry entries (ie, we have _nothing_
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
35 we can assume is a good path), a default path with relative entries is
12116
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
36 used (eg. .\Lib;.\plat-win, etc)
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
37
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
38
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
39 The end result of all this is:
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
40 * When running python.exe, or any other .exe in the main Python directory
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
41 (either an installed version, or directly from the PCbuild directory),
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
42 the core path is deduced, and the core paths in the registry are
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
43 ignored. Other "application paths" in the registry are always read.
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
44
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
45 * When Python is hosted in another exe (different directory, embedded via
12116
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
46 COM, etc), the Python Home will not be deduced, so the core path from
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
47 the registry is used. Other "application paths" in the registry are
12116
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
48 always read.
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
49
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
50 * If Python can't find its home and there is no registry (eg, frozen
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
51 exe, some very strange installation setup) you get a path with
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
52 some default, but relative, paths.
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
53
64955
fd5e51035335 issue 9910
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
54 * An embedding application can use Py_SetPath() to override all of
fd5e51035335 issue 9910
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
55 these authomatic path computations.
fd5e51035335 issue 9910
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
56
12116
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
57 ---------------------------------------------------------------- */
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
58
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
59
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
60 #include "Python.h"
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
61 #include "osdefs.h"
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
62 #include <wchar.h>
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
63
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
64 #ifdef MS_WINDOWS
5999
f2d134bf6973 Some changes to make it work on NT; add the directory where the binary
Guido van Rossum <guido@python.org>
parents: 5545
diff changeset
65 #include <windows.h>
f2d134bf6973 Some changes to make it work on NT; add the directory where the binary
Guido van Rossum <guido@python.org>
parents: 5545
diff changeset
66 #endif
f2d134bf6973 Some changes to make it work on NT; add the directory where the binary
Guido van Rossum <guido@python.org>
parents: 5545
diff changeset
67
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 36507
diff changeset
68 #ifdef HAVE_SYS_TYPES_H
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
69 #include <sys/types.h>
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 36507
diff changeset
70 #endif /* HAVE_SYS_TYPES_H */
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 36507
diff changeset
71
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 36507
diff changeset
72 #ifdef HAVE_SYS_STAT_H
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
73 #include <sys/stat.h>
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 36507
diff changeset
74 #endif /* HAVE_SYS_STAT_H */
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 36507
diff changeset
75
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
76 #include <string.h>
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
77
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
78 /* Search in some common locations for the associated Python libraries.
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
79 *
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
80 * Py_GetPath() tries to return a sensible Python module search path.
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
81 *
7407
2c54901471f5 Fix some outdated comments (mostly by removing a large comment block
Guido van Rossum <guido@python.org>
parents: 6826
diff changeset
82 * The approach is an adaptation for Windows of the strategy used in
2c54901471f5 Fix some outdated comments (mostly by removing a large comment block
Guido van Rossum <guido@python.org>
parents: 6826
diff changeset
83 * ../Modules/getpath.c; it uses the Windows Registry as one of its
2c54901471f5 Fix some outdated comments (mostly by removing a large comment block
Guido van Rossum <guido@python.org>
parents: 6826
diff changeset
84 * information sources.
64955
fd5e51035335 issue 9910
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
85 *
fd5e51035335 issue 9910
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
86 * Py_SetPath() can be used to override this mechanism. Call Py_SetPath
fd5e51035335 issue 9910
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
87 * with a semicolon separated path prior to calling Py_Initialize.
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
88 */
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
89
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
90 #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
91 #define LANDMARK L"lib\\os.py"
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
92 #endif
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
93
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
94 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
95 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
96 static wchar_t dllpath[MAXPATHLEN+1];
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
97 static wchar_t *module_search_path = NULL;
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
98
6001
8056169ec448 Much rewritten. Added Win32 registry stuff (from getpath_nt.c, which
Guido van Rossum <guido@python.org>
parents: 5999
diff changeset
99
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
100 static int
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
101 is_sep(wchar_t ch) /* determine if "ch" is a separator character */
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
102 {
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
103 #ifdef ALTSEP
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
104 return ch == SEP || ch == ALTSEP;
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
105 #else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
106 return ch == SEP;
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
107 #endif
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
108 }
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
109
15084
9be67c5a823a Prevent possible buffer overflow exploits under Windows. As per (the very quick) patch Patch #101801.
Mark Hammond <mhammond@skippinet.com.au>
parents: 14500
diff changeset
110 /* assumes 'dir' null terminated in bounds. Never writes
9be67c5a823a Prevent possible buffer overflow exploits under Windows. As per (the very quick) patch Patch #101801.
Mark Hammond <mhammond@skippinet.com.au>
parents: 14500
diff changeset
111 beyond existing terminator.
9be67c5a823a Prevent possible buffer overflow exploits under Windows. As per (the very quick) patch Patch #101801.
Mark Hammond <mhammond@skippinet.com.au>
parents: 14500
diff changeset
112 */
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
113 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
114 reduce(wchar_t *dir)
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
115 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
116 size_t i = wcslen(dir);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
117 while (i > 0 && !is_sep(dir[i]))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
118 --i;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
119 dir[i] = '\0';
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
120 }
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
121
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
122
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
123 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
124 exists(wchar_t *filename)
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
125 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
126 return GetFileAttributesW(filename) != 0xFFFFFFFF;
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
127 }
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
128
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
129 /* Assumes 'filename' MAXPATHLEN+1 bytes long -
15084
9be67c5a823a Prevent possible buffer overflow exploits under Windows. As per (the very quick) patch Patch #101801.
Mark Hammond <mhammond@skippinet.com.au>
parents: 14500
diff changeset
130 may extend 'filename' by one character.
9be67c5a823a Prevent possible buffer overflow exploits under Windows. As per (the very quick) patch Patch #101801.
Mark Hammond <mhammond@skippinet.com.au>
parents: 14500
diff changeset
131 */
8902
6f73ae1cf934 Sigh. More restructuring was needed.
Guido van Rossum <guido@python.org>
parents: 8895
diff changeset
132 static int
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
133 ismodule(wchar_t *filename) /* Is module -- check for .pyc/.pyo too */
8902
6f73ae1cf934 Sigh. More restructuring was needed.
Guido van Rossum <guido@python.org>
parents: 8895
diff changeset
134 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
135 if (exists(filename))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
136 return 1;
8902
6f73ae1cf934 Sigh. More restructuring was needed.
Guido van Rossum <guido@python.org>
parents: 8895
diff changeset
137
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
138 /* Check for the compiled version of prefix. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
139 if (wcslen(filename) < MAXPATHLEN) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
140 wcscat(filename, Py_OptimizeFlag ? L"o" : L"c");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
141 if (exists(filename))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
142 return 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
143 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
144 return 0;
8902
6f73ae1cf934 Sigh. More restructuring was needed.
Guido van Rossum <guido@python.org>
parents: 8895
diff changeset
145 }
6f73ae1cf934 Sigh. More restructuring was needed.
Guido van Rossum <guido@python.org>
parents: 8895
diff changeset
146
33017
ab93aff4c90a SF bug 1003471: Python 1.5.2 security vulnerability
Tim Peters <tim.peters@gmail.com>
parents: 30180
diff changeset
147 /* Add a path component, by appending stuff to buffer.
ab93aff4c90a SF bug 1003471: Python 1.5.2 security vulnerability
Tim Peters <tim.peters@gmail.com>
parents: 30180
diff changeset
148 buffer must have at least MAXPATHLEN + 1 bytes allocated, and contain a
ab93aff4c90a SF bug 1003471: Python 1.5.2 security vulnerability
Tim Peters <tim.peters@gmail.com>
parents: 30180
diff changeset
149 NUL-terminated string with no more than MAXPATHLEN characters (not counting
ab93aff4c90a SF bug 1003471: Python 1.5.2 security vulnerability
Tim Peters <tim.peters@gmail.com>
parents: 30180
diff changeset
150 the trailing NUL). It's a fatal error if it contains a string longer than
ab93aff4c90a SF bug 1003471: Python 1.5.2 security vulnerability
Tim Peters <tim.peters@gmail.com>
parents: 30180
diff changeset
151 that (callers must be careful!). If these requirements are met, it's
ab93aff4c90a SF bug 1003471: Python 1.5.2 security vulnerability
Tim Peters <tim.peters@gmail.com>
parents: 30180
diff changeset
152 guaranteed that buffer will still be a NUL-terminated string with no more
ab93aff4c90a SF bug 1003471: Python 1.5.2 security vulnerability
Tim Peters <tim.peters@gmail.com>
parents: 30180
diff changeset
153 than MAXPATHLEN characters at exit. If stuff is too long, only as much of
ab93aff4c90a SF bug 1003471: Python 1.5.2 security vulnerability
Tim Peters <tim.peters@gmail.com>
parents: 30180
diff changeset
154 stuff as fits will be appended.
ab93aff4c90a SF bug 1003471: Python 1.5.2 security vulnerability
Tim Peters <tim.peters@gmail.com>
parents: 30180
diff changeset
155 */
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
156 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
157 join(wchar_t *buffer, wchar_t *stuff)
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
158 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
159 size_t n, k;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
160 if (is_sep(stuff[0]))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
161 n = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
162 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
163 n = wcslen(buffer);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
164 if (n > 0 && !is_sep(buffer[n-1]) && n < MAXPATHLEN)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
165 buffer[n++] = SEP;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
166 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
167 if (n > MAXPATHLEN)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
168 Py_FatalError("buffer overflow in getpathp.c's joinpath()");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
169 k = wcslen(stuff);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
170 if (n + k > MAXPATHLEN)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
171 k = MAXPATHLEN - n;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
172 wcsncpy(buffer+n, stuff, k);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
173 buffer[n+k] = '\0';
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
174 }
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
175
15084
9be67c5a823a Prevent possible buffer overflow exploits under Windows. As per (the very quick) patch Patch #101801.
Mark Hammond <mhammond@skippinet.com.au>
parents: 14500
diff changeset
176 /* gotlandmark only called by search_for_prefix, which ensures
9be67c5a823a Prevent possible buffer overflow exploits under Windows. As per (the very quick) patch Patch #101801.
Mark Hammond <mhammond@skippinet.com.au>
parents: 14500
diff changeset
177 'prefix' is null terminated in bounds. join() ensures
9be67c5a823a Prevent possible buffer overflow exploits under Windows. As per (the very quick) patch Patch #101801.
Mark Hammond <mhammond@skippinet.com.au>
parents: 14500
diff changeset
178 'landmark' can not overflow prefix if too long.
9be67c5a823a Prevent possible buffer overflow exploits under Windows. As per (the very quick) patch Patch #101801.
Mark Hammond <mhammond@skippinet.com.au>
parents: 14500
diff changeset
179 */
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
180 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
181 gotlandmark(wchar_t *landmark)
12090
9877e978170e Changes to completely ignore the registry when it detects that you are
Guido van Rossum <guido@python.org>
parents: 8967
diff changeset
182 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
183 int ok;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
184 Py_ssize_t n;
12090
9877e978170e Changes to completely ignore the registry when it detects that you are
Guido van Rossum <guido@python.org>
parents: 8967
diff changeset
185
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
186 n = wcslen(prefix);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
187 join(prefix, landmark);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
188 ok = ismodule(prefix);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
189 prefix[n] = '\0';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
190 return ok;
12090
9877e978170e Changes to completely ignore the registry when it detects that you are
Guido van Rossum <guido@python.org>
parents: 8967
diff changeset
191 }
9877e978170e Changes to completely ignore the registry when it detects that you are
Guido van Rossum <guido@python.org>
parents: 8967
diff changeset
192
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
193 /* assumes argv0_path is MAXPATHLEN+1 bytes long, already \0 term'd.
15084
9be67c5a823a Prevent possible buffer overflow exploits under Windows. As per (the very quick) patch Patch #101801.
Mark Hammond <mhammond@skippinet.com.au>
parents: 14500
diff changeset
194 assumption provided by only caller, calculate_path() */
12090
9877e978170e Changes to completely ignore the registry when it detects that you are
Guido van Rossum <guido@python.org>
parents: 8967
diff changeset
195 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
196 search_for_prefix(wchar_t *argv0_path, wchar_t *landmark)
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
197 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
198 /* Search from argv0_path, until landmark is found */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
199 wcscpy(prefix, argv0_path);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
200 do {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
201 if (gotlandmark(landmark))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
202 return 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
203 reduce(prefix);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
204 } while (prefix[0]);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
205 return 0;
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
206 }
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
207
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
208 #ifdef MS_WINDOWS
51264
87a985a1b5c9 Merged revisions 69207 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47667
diff changeset
209 #ifdef Py_ENABLE_SHARED
8902
6f73ae1cf934 Sigh. More restructuring was needed.
Guido van Rossum <guido@python.org>
parents: 8895
diff changeset
210
12116
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
211 /* a string loaded from the DLL at startup.*/
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
212 extern const char *PyWin_DLLVersionString;
6356
a857d2f87336 Seem to be some changes related to DLL version from string resource,
Guido van Rossum <guido@python.org>
parents: 6001
diff changeset
213
6001
8056169ec448 Much rewritten. Added Win32 registry stuff (from getpath_nt.c, which
Guido van Rossum <guido@python.org>
parents: 5999
diff changeset
214
8056169ec448 Much rewritten. Added Win32 registry stuff (from getpath_nt.c, which
Guido van Rossum <guido@python.org>
parents: 5999
diff changeset
215 /* Load a PYTHONPATH value from the registry.
8056169ec448 Much rewritten. Added Win32 registry stuff (from getpath_nt.c, which
Guido van Rossum <guido@python.org>
parents: 5999
diff changeset
216 Load from either HKEY_LOCAL_MACHINE or HKEY_CURRENT_USER.
8056169ec448 Much rewritten. Added Win32 registry stuff (from getpath_nt.c, which
Guido van Rossum <guido@python.org>
parents: 5999
diff changeset
217
12116
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
218 Works in both Unicode and 8bit environments. Only uses the
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
219 Ex family of functions so it also works with Windows CE.
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
220
6001
8056169ec448 Much rewritten. Added Win32 registry stuff (from getpath_nt.c, which
Guido van Rossum <guido@python.org>
parents: 5999
diff changeset
221 Returns NULL, or a pointer that should be freed.
16748
e444a5271181 Checkin updated version of patch #103933 . As Thomas says, fixes the bugs #131064, #129584, #127722. See the discussion in bug #131064
Mark Hammond <mhammond@skippinet.com.au>
parents: 15084
diff changeset
222
e444a5271181 Checkin updated version of patch #103933 . As Thomas says, fixes the bugs #131064, #129584, #127722. See the discussion in bug #131064
Mark Hammond <mhammond@skippinet.com.au>
parents: 15084
diff changeset
223 XXX - this code is pretty strange, as it used to also
e444a5271181 Checkin updated version of patch #103933 . As Thomas says, fixes the bugs #131064, #129584, #127722. See the discussion in bug #131064
Mark Hammond <mhammond@skippinet.com.au>
parents: 15084
diff changeset
224 work on Win16, where the buffer sizes werent available
e444a5271181 Checkin updated version of patch #103933 . As Thomas says, fixes the bugs #131064, #129584, #127722. See the discussion in bug #131064
Mark Hammond <mhammond@skippinet.com.au>
parents: 15084
diff changeset
225 in advance. It could be simplied now Win16/Win32s is dead!
6001
8056169ec448 Much rewritten. Added Win32 registry stuff (from getpath_nt.c, which
Guido van Rossum <guido@python.org>
parents: 5999
diff changeset
226 */
8056169ec448 Much rewritten. Added Win32 registry stuff (from getpath_nt.c, which
Guido van Rossum <guido@python.org>
parents: 5999
diff changeset
227
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
228 static wchar_t *
12116
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
229 getpythonregpath(HKEY keyBase, int skipcore)
6001
8056169ec448 Much rewritten. Added Win32 registry stuff (from getpath_nt.c, which
Guido van Rossum <guido@python.org>
parents: 5999
diff changeset
230 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
231 HKEY newKey = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
232 DWORD dataSize = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
233 DWORD numKeys = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
234 LONG rc;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
235 wchar_t *retval = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
236 WCHAR *dataBuf = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
237 static const WCHAR keyPrefix[] = L"Software\\Python\\PythonCore\\";
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
238 static const WCHAR keySuffix[] = L"\\PythonPath";
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
239 size_t versionLen;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
240 DWORD index;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
241 WCHAR *keyBuf = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
242 WCHAR *keyBufPtr;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
243 WCHAR **ppPaths = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
244
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
245 /* Tried to use sysget("winver") but here is too early :-( */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
246 versionLen = strlen(PyWin_DLLVersionString);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
247 /* Space for all the chars, plus one \0 */
84490
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 84030
diff changeset
248 keyBuf = keyBufPtr = PyMem_RawMalloc(sizeof(keyPrefix) +
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 84030
diff changeset
249 sizeof(WCHAR)*(versionLen-1) +
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 84030
diff changeset
250 sizeof(keySuffix));
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
251 if (keyBuf==NULL) goto done;
6356
a857d2f87336 Seem to be some changes related to DLL version from string resource,
Guido van Rossum <guido@python.org>
parents: 6001
diff changeset
252
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
253 memcpy(keyBufPtr, keyPrefix, sizeof(keyPrefix)-sizeof(WCHAR));
72510
b534b56379cb Use the new Py_ARRAY_LENGTH macro
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66664
diff changeset
254 keyBufPtr += Py_ARRAY_LENGTH(keyPrefix) - 1;
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
255 mbstowcs(keyBufPtr, PyWin_DLLVersionString, versionLen);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
256 keyBufPtr += versionLen;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
257 /* NULL comes with this one! */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
258 memcpy(keyBufPtr, keySuffix, sizeof(keySuffix));
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
259 /* Open the root Python key */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
260 rc=RegOpenKeyExW(keyBase,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
261 keyBuf, /* subkey */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
262 0, /* reserved */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
263 KEY_READ,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
264 &newKey);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
265 if (rc!=ERROR_SUCCESS) goto done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
266 /* Find out how big our core buffer is, and how many subkeys we have */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
267 rc = RegQueryInfoKey(newKey, NULL, NULL, NULL, &numKeys, NULL, NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
268 NULL, NULL, &dataSize, NULL, NULL);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
269 if (rc!=ERROR_SUCCESS) goto done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
270 if (skipcore) dataSize = 0; /* Only count core ones if we want them! */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
271 /* Allocate a temp array of char buffers, so we only need to loop
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
272 reading the registry once
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
273 */
84490
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 84030
diff changeset
274 ppPaths = PyMem_RawMalloc( sizeof(WCHAR *) * numKeys );
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
275 if (ppPaths==NULL) goto done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
276 memset(ppPaths, 0, sizeof(WCHAR *) * numKeys);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
277 /* Loop over all subkeys, allocating a temp sub-buffer. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
278 for(index=0;index<numKeys;index++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
279 WCHAR keyBuf[MAX_PATH+1];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
280 HKEY subKey = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
281 DWORD reqdSize = MAX_PATH+1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
282 /* Get the sub-key name */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
283 DWORD rc = RegEnumKeyExW(newKey, index, keyBuf, &reqdSize,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
284 NULL, NULL, NULL, NULL );
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
285 if (rc!=ERROR_SUCCESS) goto done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
286 /* Open the sub-key */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
287 rc=RegOpenKeyExW(newKey,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
288 keyBuf, /* subkey */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
289 0, /* reserved */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
290 KEY_READ,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
291 &subKey);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
292 if (rc!=ERROR_SUCCESS) goto done;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
293 /* Find the value of the buffer size, malloc, then read it */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
294 RegQueryValueExW(subKey, NULL, 0, NULL, NULL, &reqdSize);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
295 if (reqdSize) {
84490
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 84030
diff changeset
296 ppPaths[index] = PyMem_RawMalloc(reqdSize);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
297 if (ppPaths[index]) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
298 RegQueryValueExW(subKey, NULL, 0, NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
299 (LPBYTE)ppPaths[index],
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
300 &reqdSize);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
301 dataSize += reqdSize + 1; /* 1 for the ";" */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
302 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
303 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
304 RegCloseKey(subKey);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
305 }
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 36507
diff changeset
306
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
307 /* return null if no path to return */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
308 if (dataSize == 0) goto done;
39442
654c380cf8b9 Merged revisions 46753-51188 via svnmerge from
Thomas Wouters <thomas@python.org>
parents: 36507
diff changeset
309
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
310 /* original datasize from RegQueryInfo doesn't include the \0 */
84490
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 84030
diff changeset
311 dataBuf = PyMem_RawMalloc((dataSize+1) * sizeof(WCHAR));
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
312 if (dataBuf) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
313 WCHAR *szCur = dataBuf;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
314 DWORD reqdSize = dataSize;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
315 /* Copy our collected strings */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
316 for (index=0;index<numKeys;index++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
317 if (index > 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
318 *(szCur++) = L';';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
319 dataSize--;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
320 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
321 if (ppPaths[index]) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
322 Py_ssize_t len = wcslen(ppPaths[index]);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
323 wcsncpy(szCur, ppPaths[index], len);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
324 szCur += len;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
325 assert(dataSize > (DWORD)len);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
326 dataSize -= (DWORD)len;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
327 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
328 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
329 if (skipcore)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
330 *szCur = '\0';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
331 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
332 /* If we have no values, we dont need a ';' */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
333 if (numKeys) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
334 *(szCur++) = L';';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
335 dataSize--;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
336 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
337 /* Now append the core path entries -
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
338 this will include the NULL
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
339 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
340 rc = RegQueryValueExW(newKey, NULL, 0, NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
341 (LPBYTE)szCur, &dataSize);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
342 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
343 /* And set the result - caller must free */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
344 retval = dataBuf;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
345 }
12116
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
346 done:
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
347 /* Loop freeing my temp buffers */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
348 if (ppPaths) {
84490
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 84030
diff changeset
349 for(index=0; index<numKeys; index++)
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 84030
diff changeset
350 PyMem_RawFree(ppPaths[index]);
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 84030
diff changeset
351 PyMem_RawFree(ppPaths);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
352 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
353 if (newKey)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
354 RegCloseKey(newKey);
84490
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 84030
diff changeset
355 PyMem_RawFree(keyBuf);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
356 return retval;
6001
8056169ec448 Much rewritten. Added Win32 registry stuff (from getpath_nt.c, which
Guido van Rossum <guido@python.org>
parents: 5999
diff changeset
357 }
51264
87a985a1b5c9 Merged revisions 69207 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47667
diff changeset
358 #endif /* Py_ENABLE_SHARED */
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
359 #endif /* MS_WINDOWS */
6001
8056169ec448 Much rewritten. Added Win32 registry stuff (from getpath_nt.c, which
Guido van Rossum <guido@python.org>
parents: 5999
diff changeset
360
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
361 static void
13660
a1ce07218781 Miscelaneous ANSIfications. I'm assuming here 'main' should take (int,
Thomas Wouters <thomas@python.org>
parents: 13256
diff changeset
362 get_progpath(void)
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
363 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
364 extern wchar_t *Py_GetProgramName(void);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
365 wchar_t *path = _wgetenv(L"PATH");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
366 wchar_t *prog = Py_GetProgramName();
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
367
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
368 #ifdef MS_WINDOWS
51264
87a985a1b5c9 Merged revisions 69207 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47667
diff changeset
369 #ifdef Py_ENABLE_SHARED
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
370 extern HANDLE PyWin_DLLhModule;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
371 /* static init of progpath ensures final char remains \0 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
372 if (PyWin_DLLhModule)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
373 if (!GetModuleFileNameW(PyWin_DLLhModule, dllpath, MAXPATHLEN))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
374 dllpath[0] = 0;
51264
87a985a1b5c9 Merged revisions 69207 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47667
diff changeset
375 #else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
376 dllpath[0] = 0;
51264
87a985a1b5c9 Merged revisions 69207 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47667
diff changeset
377 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
378 if (GetModuleFileNameW(NULL, progpath, MAXPATHLEN))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
379 return;
6001
8056169ec448 Much rewritten. Added Win32 registry stuff (from getpath_nt.c, which
Guido van Rossum <guido@python.org>
parents: 5999
diff changeset
380 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
381 if (prog == NULL || *prog == '\0')
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
382 prog = L"python";
6001
8056169ec448 Much rewritten. Added Win32 registry stuff (from getpath_nt.c, which
Guido van Rossum <guido@python.org>
parents: 5999
diff changeset
383
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
384 /* If there is no slash in the argv0 path, then we have to
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
385 * assume python is on the user's $PATH, since there's no
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
386 * other way to find a directory to start the search from. If
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
387 * $PATH isn't exported, you lose.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
388 */
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
389 #ifdef ALTSEP
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
390 if (wcschr(prog, SEP) || wcschr(prog, ALTSEP))
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
391 #else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
392 if (wcschr(prog, SEP))
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
393 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
394 wcsncpy(progpath, prog, MAXPATHLEN);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
395 else if (path) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
396 while (1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
397 wchar_t *delim = wcschr(path, DELIM);
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
398
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
399 if (delim) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
400 size_t len = delim - path;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
401 /* ensure we can't overwrite buffer */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
402 len = min(MAXPATHLEN,len);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
403 wcsncpy(progpath, path, len);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
404 *(progpath + len) = '\0';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
405 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
406 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
407 wcsncpy(progpath, path, MAXPATHLEN);
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
408
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
409 /* join() is safe for MAXPATHLEN+1 size buffer */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
410 join(progpath, prog);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
411 if (exists(progpath))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
412 break;
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
413
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
414 if (!delim) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
415 progpath[0] = '\0';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
416 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
417 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
418 path = delim + 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
419 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
420 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
421 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
422 progpath[0] = '\0';
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
423 }
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
424
77154
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
425 static int
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
426 find_env_config_value(FILE * env_file, const wchar_t * key, wchar_t * value)
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
427 {
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
428 int result = 0; /* meaning not found */
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
429 char buffer[MAXPATHLEN*2+1]; /* allow extra for key, '=', etc. */
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
430
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
431 fseek(env_file, 0, SEEK_SET);
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
432 while (!feof(env_file)) {
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
433 char * p = fgets(buffer, MAXPATHLEN*2, env_file);
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
434 wchar_t tmpbuffer[MAXPATHLEN*2+1];
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
435 PyObject * decoded;
84030
41b8be55b160 Issue #9566: Fix compiler warning on Windows 64-bit
Victor Stinner <victor.stinner@gmail.com>
parents: 79479
diff changeset
436 size_t n;
77154
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
437
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
438 if (p == NULL)
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
439 break;
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
440 n = strlen(p);
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
441 if (p[n - 1] != '\n') {
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
442 /* line has overflowed - bail */
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
443 break;
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
444 }
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
445 if (p[0] == '#') /* Comment - skip */
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
446 continue;
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
447 decoded = PyUnicode_DecodeUTF8(buffer, n, "surrogateescape");
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
448 if (decoded != NULL) {
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
449 Py_ssize_t k;
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
450 k = PyUnicode_AsWideChar(decoded,
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
451 tmpbuffer, MAXPATHLEN * 2);
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
452 Py_DECREF(decoded);
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
453 if (k >= 0) {
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
454 wchar_t * tok = wcstok(tmpbuffer, L" \t\r\n");
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
455 if ((tok != NULL) && !wcscmp(tok, key)) {
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
456 tok = wcstok(NULL, L" \t");
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
457 if ((tok != NULL) && !wcscmp(tok, L"=")) {
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
458 tok = wcstok(NULL, L"\r\n");
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
459 if (tok != NULL) {
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
460 wcsncpy(value, tok, MAXPATHLEN);
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
461 result = 1;
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
462 break;
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
463 }
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
464 }
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
465 }
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
466 }
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
467 }
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
468 }
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
469 return result;
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
470 }
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
471
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
472 static void
13660
a1ce07218781 Miscelaneous ANSIfications. I'm assuming here 'main' should take (int,
Thomas Wouters <thomas@python.org>
parents: 13256
diff changeset
473 calculate_path(void)
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
474 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
475 wchar_t argv0_path[MAXPATHLEN+1];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
476 wchar_t *buf;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
477 size_t bufsz;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
478 wchar_t *pythonhome = Py_GetPythonHome();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
479 wchar_t *envpath = NULL;
8902
6f73ae1cf934 Sigh. More restructuring was needed.
Guido van Rossum <guido@python.org>
parents: 8895
diff changeset
480
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
481 #ifdef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
482 int skiphome, skipdefault;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
483 wchar_t *machinepath = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
484 wchar_t *userpath = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
485 wchar_t zip_path[MAXPATHLEN+1];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
486 size_t len;
54650
f5828742b46f Merged revisions 73322 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 51264
diff changeset
487
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
488 if (!Py_IgnoreEnvironmentFlag) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
489 envpath = _wgetenv(L"PYTHONPATH");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
490 }
54650
f5828742b46f Merged revisions 73322 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 51264
diff changeset
491 #else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
492 char *_envpath = Py_GETENV("PYTHONPATH");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
493 wchar_t wenvpath[MAXPATHLEN+1];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
494 if (_envpath) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
495 size_t r = mbstowcs(wenvpath, _envpath, MAXPATHLEN+1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
496 envpath = wenvpath;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
497 if (r == (size_t)-1 || r >= MAXPATHLEN)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
498 envpath = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
499 }
54650
f5828742b46f Merged revisions 73322 via svnmerge from
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 51264
diff changeset
500 #endif
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
501
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
502 get_progpath();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
503 /* progpath guaranteed \0 terminated in MAXPATH+1 bytes. */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
504 wcscpy(argv0_path, progpath);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
505 reduce(argv0_path);
77154
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
506
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
507 /* Search for an environment configuration file, first in the
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
508 executable's directory and then in the parent directory.
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
509 If found, open it for use when searching for prefixes.
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
510 */
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
511
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
512 {
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
513 wchar_t tmpbuffer[MAXPATHLEN+1];
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
514 wchar_t *env_cfg = L"pyvenv.cfg";
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
515 FILE * env_file = NULL;
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
516
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
517 wcscpy(tmpbuffer, argv0_path);
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
518 join(tmpbuffer, env_cfg);
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
519 env_file = _Py_wfopen(tmpbuffer, L"r");
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
520 if (env_file == NULL) {
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
521 errno = 0;
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
522 reduce(tmpbuffer);
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
523 reduce(tmpbuffer);
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
524 join(tmpbuffer, env_cfg);
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
525 env_file = _Py_wfopen(tmpbuffer, L"r");
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
526 if (env_file == NULL) {
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
527 errno = 0;
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
528 }
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
529 }
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
530 if (env_file != NULL) {
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
531 /* Look for a 'home' variable and set argv0_path to it, if found */
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
532 if (find_env_config_value(env_file, L"home", tmpbuffer)) {
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
533 wcscpy(argv0_path, tmpbuffer);
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
534 }
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
535 fclose(env_file);
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
536 env_file = NULL;
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
537 }
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
538 }
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 72510
diff changeset
539
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
540 if (pythonhome == NULL || *pythonhome == '\0') {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
541 if (search_for_prefix(argv0_path, LANDMARK))
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
542 pythonhome = prefix;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
543 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
544 pythonhome = NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
545 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
546 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
547 wcsncpy(prefix, pythonhome, MAXPATHLEN);
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
548
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
549 if (envpath && *envpath == '\0')
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
550 envpath = NULL;
6001
8056169ec448 Much rewritten. Added Win32 registry stuff (from getpath_nt.c, which
Guido van Rossum <guido@python.org>
parents: 5999
diff changeset
551
12090
9877e978170e Changes to completely ignore the registry when it detects that you are
Guido van Rossum <guido@python.org>
parents: 8967
diff changeset
552
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
553 #ifdef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
554 /* Calculate zip archive path */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
555 if (dllpath[0]) /* use name of python DLL */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
556 wcsncpy(zip_path, dllpath, MAXPATHLEN);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
557 else /* use name of executable program */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
558 wcsncpy(zip_path, progpath, MAXPATHLEN);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
559 zip_path[MAXPATHLEN] = '\0';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
560 len = wcslen(zip_path);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
561 if (len > 4) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
562 zip_path[len-3] = 'z'; /* change ending to "zip" */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
563 zip_path[len-2] = 'i';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
564 zip_path[len-1] = 'p';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
565 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
566 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
567 zip_path[0] = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
568 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
569
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
570 skiphome = pythonhome==NULL ? 0 : 1;
51264
87a985a1b5c9 Merged revisions 69207 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47667
diff changeset
571 #ifdef Py_ENABLE_SHARED
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
572 machinepath = getpythonregpath(HKEY_LOCAL_MACHINE, skiphome);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
573 userpath = getpythonregpath(HKEY_CURRENT_USER, skiphome);
51264
87a985a1b5c9 Merged revisions 69207 via svnmerge from
Martin v. Löwis <martin@v.loewis.de>
parents: 47667
diff changeset
574 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
575 /* We only use the default relative PYTHONPATH if we havent
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
576 anything better to use! */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
577 skipdefault = envpath!=NULL || pythonhome!=NULL || \
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
578 machinepath!=NULL || userpath!=NULL;
8902
6f73ae1cf934 Sigh. More restructuring was needed.
Guido van Rossum <guido@python.org>
parents: 8895
diff changeset
579 #endif
6f73ae1cf934 Sigh. More restructuring was needed.
Guido van Rossum <guido@python.org>
parents: 8895
diff changeset
580
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
581 /* We need to construct a path from the following parts.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
582 (1) the PYTHONPATH environment variable, if set;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
583 (2) for Win32, the zip archive file path;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
584 (3) for Win32, the machinepath and userpath, if set;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
585 (4) the PYTHONPATH config macro, with the leading "."
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
586 of each component replaced with pythonhome, if set;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
587 (5) the directory containing the executable (argv0_path).
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
588 The length calculation calculates #4 first.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
589 Extra rules:
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
590 - If PYTHONHOME is set (in any way) item (3) is ignored.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
591 - If registry values are used, (4) and (5) are ignored.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
592 */
6001
8056169ec448 Much rewritten. Added Win32 registry stuff (from getpath_nt.c, which
Guido van Rossum <guido@python.org>
parents: 5999
diff changeset
593
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
594 /* Calculate size of return buffer */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
595 if (pythonhome != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
596 wchar_t *p;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
597 bufsz = 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
598 for (p = PYTHONPATH; *p; p++) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
599 if (*p == DELIM)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
600 bufsz++; /* number of DELIM plus one */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
601 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
602 bufsz *= wcslen(pythonhome);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
603 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
604 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
605 bufsz = 0;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
606 bufsz += wcslen(PYTHONPATH) + 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
607 bufsz += wcslen(argv0_path) + 1;
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
608 #ifdef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
609 if (userpath)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
610 bufsz += wcslen(userpath) + 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
611 if (machinepath)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
612 bufsz += wcslen(machinepath) + 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
613 bufsz += wcslen(zip_path) + 1;
6001
8056169ec448 Much rewritten. Added Win32 registry stuff (from getpath_nt.c, which
Guido van Rossum <guido@python.org>
parents: 5999
diff changeset
614 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
615 if (envpath != NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
616 bufsz += wcslen(envpath) + 1;
6001
8056169ec448 Much rewritten. Added Win32 registry stuff (from getpath_nt.c, which
Guido van Rossum <guido@python.org>
parents: 5999
diff changeset
617
84490
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 84030
diff changeset
618 module_search_path = buf = PyMem_RawMalloc(bufsz*sizeof(wchar_t));
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
619 if (buf == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
620 /* We can't exit, so print a warning and limp along */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
621 fprintf(stderr, "Can't malloc dynamic PYTHONPATH.\n");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
622 if (envpath) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
623 fprintf(stderr, "Using environment $PYTHONPATH.\n");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
624 module_search_path = envpath;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
625 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
626 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
627 fprintf(stderr, "Using default static path.\n");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
628 module_search_path = PYTHONPATH;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
629 }
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
630 #ifdef MS_WINDOWS
84490
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 84030
diff changeset
631 PyMem_RawFree(machinepath);
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 84030
diff changeset
632 PyMem_RawFree(userpath);
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
633 #endif /* MS_WINDOWS */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
634 return;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
635 }
6001
8056169ec448 Much rewritten. Added Win32 registry stuff (from getpath_nt.c, which
Guido van Rossum <guido@python.org>
parents: 5999
diff changeset
636
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
637 if (envpath) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
638 wcscpy(buf, envpath);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
639 buf = wcschr(buf, L'\0');
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
640 *buf++ = DELIM;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
641 }
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
642 #ifdef MS_WINDOWS
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
643 if (zip_path[0]) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
644 wcscpy(buf, zip_path);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
645 buf = wcschr(buf, L'\0');
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
646 *buf++ = DELIM;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
647 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
648 if (userpath) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
649 wcscpy(buf, userpath);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
650 buf = wcschr(buf, L'\0');
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
651 *buf++ = DELIM;
84490
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 84030
diff changeset
652 PyMem_RawFree(userpath);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
653 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
654 if (machinepath) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
655 wcscpy(buf, machinepath);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
656 buf = wcschr(buf, L'\0');
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
657 *buf++ = DELIM;
84490
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 84030
diff changeset
658 PyMem_RawFree(machinepath);
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
659 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
660 if (pythonhome == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
661 if (!skipdefault) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
662 wcscpy(buf, PYTHONPATH);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
663 buf = wcschr(buf, L'\0');
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
664 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
665 }
12116
e6ab3c603ff9 Revamped path access again, by Mark Hammond, to be more robust in the
Guido van Rossum <guido@python.org>
parents: 12090
diff changeset
666 #else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
667 if (pythonhome == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
668 wcscpy(buf, PYTHONPATH);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
669 buf = wcschr(buf, L'\0');
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
670 }
24071
8142f8d668a0 Patch #569753: Remove support for WIN16.
Martin v. Löwis <martin@v.loewis.de>
parents: 21712
diff changeset
671 #endif /* MS_WINDOWS */
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
672 else {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
673 wchar_t *p = PYTHONPATH;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
674 wchar_t *q;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
675 size_t n;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
676 for (;;) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
677 q = wcschr(p, DELIM);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
678 if (q == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
679 n = wcslen(p);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
680 else
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
681 n = q-p;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
682 if (p[0] == '.' && is_sep(p[1])) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
683 wcscpy(buf, pythonhome);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
684 buf = wcschr(buf, L'\0');
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
685 p++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
686 n--;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
687 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
688 wcsncpy(buf, p, n);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
689 buf += n;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
690 if (q == NULL)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
691 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
692 *buf++ = DELIM;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
693 p = q+1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
694 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
695 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
696 if (argv0_path) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
697 *buf++ = DELIM;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
698 wcscpy(buf, argv0_path);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
699 buf = wcschr(buf, L'\0');
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
700 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
701 *buf = L'\0';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
702 /* Now to pull one last hack/trick. If sys.prefix is
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
703 empty, then try and find it somewhere on the paths
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
704 we calculated. We scan backwards, as our general policy
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
705 is that Python core directories are at the *end* of
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
706 sys.path. We assume that our "lib" directory is
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
707 on the path, and that our 'prefix' directory is
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
708 the parent of that.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
709 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
710 if (*prefix==L'\0') {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
711 wchar_t lookBuf[MAXPATHLEN+1];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
712 wchar_t *look = buf - 1; /* 'buf' is at the end of the buffer */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
713 while (1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
714 Py_ssize_t nchars;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
715 wchar_t *lookEnd = look;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
716 /* 'look' will end up one character before the
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
717 start of the path in question - even if this
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
718 is one character before the start of the buffer
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
719 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
720 while (look >= module_search_path && *look != DELIM)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
721 look--;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
722 nchars = lookEnd-look;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
723 wcsncpy(lookBuf, look+1, nchars);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
724 lookBuf[nchars] = L'\0';
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
725 /* Up one level to the parent */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
726 reduce(lookBuf);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
727 if (search_for_prefix(lookBuf, LANDMARK)) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
728 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
729 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
730 /* If we are out of paths to search - give up */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
731 if (look < module_search_path)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
732 break;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
733 look--;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
734 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
735 }
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
736 }
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
737
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
738
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
739 /* External interface */
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
740
64955
fd5e51035335 issue 9910
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
741 void
fd5e51035335 issue 9910
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
742 Py_SetPath(const wchar_t *path)
fd5e51035335 issue 9910
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
743 {
fd5e51035335 issue 9910
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
744 if (module_search_path != NULL) {
84490
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 84030
diff changeset
745 PyMem_RawFree(module_search_path);
64955
fd5e51035335 issue 9910
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
746 module_search_path = NULL;
fd5e51035335 issue 9910
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
747 }
fd5e51035335 issue 9910
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
748 if (path != NULL) {
fd5e51035335 issue 9910
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
749 extern wchar_t *Py_GetProgramName(void);
fd5e51035335 issue 9910
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
750 wchar_t *prog = Py_GetProgramName();
fd5e51035335 issue 9910
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
751 wcsncpy(progpath, prog, MAXPATHLEN);
fd5e51035335 issue 9910
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
752 prefix[0] = L'\0';
84490
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 84030
diff changeset
753 module_search_path = PyMem_RawMalloc((wcslen(path) + 1) * sizeof(wchar_t));
64955
fd5e51035335 issue 9910
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
754 if (module_search_path != NULL)
fd5e51035335 issue 9910
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
755 wcscpy(module_search_path, path);
84490
18bb92b0c458 Issue #18203: Replace malloc() with PyMem_RawMalloc() at Python initialization
Victor Stinner <victor.stinner@gmail.com>
parents: 84030
diff changeset
756 }
64955
fd5e51035335 issue 9910
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
757 }
fd5e51035335 issue 9910
Kristján Valur Jónsson <kristjan@ccpgames.com>
parents: 61466
diff changeset
758
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
759 wchar_t *
13660
a1ce07218781 Miscelaneous ANSIfications. I'm assuming here 'main' should take (int,
Thomas Wouters <thomas@python.org>
parents: 13256
diff changeset
760 Py_GetPath(void)
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
761 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
762 if (!module_search_path)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
763 calculate_path();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
764 return module_search_path;
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
765 }
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
766
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
767 wchar_t *
13660
a1ce07218781 Miscelaneous ANSIfications. I'm assuming here 'main' should take (int,
Thomas Wouters <thomas@python.org>
parents: 13256
diff changeset
768 Py_GetPrefix(void)
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
769 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
770 if (!module_search_path)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
771 calculate_path();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
772 return prefix;
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
773 }
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
774
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
775 wchar_t *
13660
a1ce07218781 Miscelaneous ANSIfications. I'm assuming here 'main' should take (int,
Thomas Wouters <thomas@python.org>
parents: 13256
diff changeset
776 Py_GetExecPrefix(void)
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
777 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
778 return Py_GetPrefix();
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
779 }
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
780
46318
22a74eaf6b22 Change command line processing API to use wchar_t.
Martin v. Löwis <martin@v.loewis.de>
parents: 41554
diff changeset
781 wchar_t *
13660
a1ce07218781 Miscelaneous ANSIfications. I'm assuming here 'main' should take (int,
Thomas Wouters <thomas@python.org>
parents: 13256
diff changeset
782 Py_GetProgramFullPath(void)
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
783 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
784 if (!module_search_path)
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
785 calculate_path();
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 54650
diff changeset
786 return progpath;
5545
7e4228780ff8 Jim Ahlstrom's contributions for DOS, OS/2, WIN3.1.
Guido van Rossum <guido@python.org>
parents:
diff changeset
787 }
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
788
72510
b534b56379cb Use the new Py_ARRAY_LENGTH macro
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66664
diff changeset
789 /* Load python3.dll before loading any extension module that might refer
b534b56379cb Use the new Py_ARRAY_LENGTH macro
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66664
diff changeset
790 to it. That way, we can be sure that always the python3.dll corresponding
66664
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
791 to this python DLL is loaded, not a python3.dll that might be on the path
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
792 by chance.
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
793 Return whether the DLL was found.
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
794 */
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
795 static int python3_checked = 0;
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
796 static HANDLE hPython3;
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
797 int
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
798 _Py_CheckPython3()
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
799 {
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
800 wchar_t py3path[MAXPATHLEN+1];
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
801 wchar_t *s;
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
802 if (python3_checked)
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
803 return hPython3 != NULL;
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
804 python3_checked = 1;
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
805
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
806 /* If there is a python3.dll next to the python3y.dll,
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
807 assume this is a build tree; use that DLL */
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
808 wcscpy(py3path, dllpath);
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
809 s = wcsrchr(py3path, L'\\');
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
810 if (!s)
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
811 s = py3path;
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
812 wcscpy(s, L"\\python3.dll");
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
813 hPython3 = LoadLibraryExW(py3path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
814 if (hPython3 != NULL)
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
815 return 1;
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
816
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
817 /* Check sys.prefix\DLLs\python3.dll */
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
818 wcscpy(py3path, Py_GetPrefix());
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
819 wcscat(py3path, L"\\DLLs\\python3.dll");
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
820 hPython3 = LoadLibraryExW(py3path, NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
821 return hPython3 != NULL;
62b61abd02b8 Merge branches/pep-0384.
Martin v. Löwis <martin@v.loewis.de>
parents: 64955
diff changeset
822 }