annotate Mac/Tools/pythonw.c @ 84007:dbfbdf2b5c19 3.3

Fix #17967: For ftp urls CWD to target instead of hopping to each directory towards target. This fixes a bug where target is accessible, but parent directories are restricted.
author Senthil Kumaran <senthil@uthcode.com>
date Sat, 01 Jun 2013 08:27:06 -0700
parents b79d276041a8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
1 /*
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
2 * This wrapper program executes a python executable hidden inside an
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
3 * application bundle inside the Python framework. This is needed to run
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
4 * GUI code: some GUI API's don't work unless the program is inside an
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
5 * application bundle.
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
6 *
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
7 * This program uses posix_spawn rather than plain execv because we need
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
8 * slightly more control over how the "real" interpreter is executed.
58819
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
9 *
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
10 * On OSX 10.4 (and earlier) this falls back to using exec because the
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
11 * posix_spawnv functions aren't available there.
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
12 */
58819
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
13
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
14 #pragma weak_import posix_spawnattr_init
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
15 #pragma weak_import posix_spawnattr_setbinpref_np
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
16 #pragma weak_import posix_spawnattr_setflags
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
17 #pragma weak_import posix_spawn
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
18
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
19 #include <Python.h>
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
20 #include <unistd.h>
58819
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
21 #ifdef HAVE_SPAWN_H
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
22 #include <spawn.h>
58819
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
23 #endif
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
24 #include <stdio.h>
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
25 #include <string.h>
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
26 #include <errno.h>
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
27 #include <err.h>
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
28 #include <dlfcn.h>
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
29 #include <stdlib.h>
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
30 #include <Python.h>
78160
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
31 #include <mach-o/dyld.h>
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
32
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
33
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
34 extern char** environ;
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
35
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
36 /*
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
37 * Locate the python framework by looking for the
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
38 * library that contains Py_Initialize.
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
39 *
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
40 * In a regular framework the structure is:
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
41 *
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
42 * Python.framework/Versions/2.7
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
43 * /Python
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
44 * /Resources/Python.app/Contents/MacOS/Python
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
45 *
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
46 * In a virtualenv style structure the expected
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
47 * structure is:
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
48 *
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
49 * ROOT
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
50 * /bin/pythonw
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
51 * /.Python <- the dylib
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
52 * /.Resources/Python.app/Contents/MacOS/Python
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
53 *
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
54 * NOTE: virtualenv's are not an officially supported
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
55 * feature, support for that structure is provided as
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
56 * a convenience.
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
57 */
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
58 static char* get_python_path(void)
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
59 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
60 size_t len;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
61 Dl_info info;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
62 char* end;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
63 char* g_path;
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
64
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
65 if (dladdr(Py_Initialize, &info) == 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
66 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
67 }
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
68
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
69 len = strlen(info.dli_fname);
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
70
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
71 g_path = malloc(len+60);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
72 if (g_path == NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
73 return NULL;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
74 }
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
75
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
76 strcpy(g_path, info.dli_fname);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
77 end = g_path + len - 1;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
78 while (end != g_path && *end != '/') {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
79 end --;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
80 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
81 end++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
82 if (*end == '.') {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
83 end++;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
84 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
85 strcpy(end, "Resources/Python.app/Contents/MacOS/" PYTHONFRAMEWORK);
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
86
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
87 return g_path;
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
88 }
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
89
58819
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
90 #ifdef HAVE_SPAWN_H
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
91 static void
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
92 setup_spawnattr(posix_spawnattr_t* spawnattr)
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
93 {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
94 size_t ocount;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
95 size_t count;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
96 cpu_type_t cpu_types[1];
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
97 short flags = 0;
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
98 #ifdef __LP64__
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
99 int ch;
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
100 #endif
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
101
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
102 if ((errno = posix_spawnattr_init(spawnattr)) != 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
103 err(2, "posix_spawnattr_int");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
104 /* NOTREACHTED */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
105 }
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
106
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
107 count = 1;
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
108
68489
81d7f78a633a #11515: Merge with 3.1.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 62027
diff changeset
109 /* Run the real python executable using the same architecture as this
81d7f78a633a #11515: Merge with 3.1.
Ezio Melotti <ezio.melotti@gmail.com>
parents: 62027
diff changeset
110 * executable, this allows users to control the architecture using
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
111 * "arch -ppc python"
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
112 */
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
113
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
114 #if defined(__ppc64__)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
115 cpu_types[0] = CPU_TYPE_POWERPC64;
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
116
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
117 #elif defined(__x86_64__)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
118 cpu_types[0] = CPU_TYPE_X86_64;
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
119
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
120 #elif defined(__ppc__)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
121 cpu_types[0] = CPU_TYPE_POWERPC;
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
122 #elif defined(__i386__)
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
123 cpu_types[0] = CPU_TYPE_X86;
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
124 #else
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
125 # error "Unknown CPU"
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
126 #endif
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
127
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
128 if (posix_spawnattr_setbinpref_np(spawnattr, count,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
129 cpu_types, &ocount) == -1) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
130 err(1, "posix_spawnattr_setbinpref");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
131 /* NOTREACHTED */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
132 }
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
133 if (count != ocount) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
134 fprintf(stderr, "posix_spawnattr_setbinpref failed to copy\n");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
135 exit(1);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
136 /* NOTREACHTED */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
137 }
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
138
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
139
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
140 /*
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
141 * Set flag that causes posix_spawn to behave like execv
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
142 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
143 flags |= POSIX_SPAWN_SETEXEC;
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
144 if ((errno = posix_spawnattr_setflags(spawnattr, flags)) != 0) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
145 err(1, "posix_spawnattr_setflags");
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
146 /* NOTREACHTED */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
147 }
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
148 }
58819
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
149 #endif
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
150
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
151 int
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
152 main(int argc, char **argv) {
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
153 char* exec_path = get_python_path();
77154
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 68489
diff changeset
154 static char path[PATH_MAX * 2];
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 68489
diff changeset
155 static char real_path[PATH_MAX * 2];
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 68489
diff changeset
156 int status;
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 68489
diff changeset
157 uint32_t size = PATH_MAX * 2;
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 68489
diff changeset
158
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 68489
diff changeset
159 /* Set the original executable path in the environment. */
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 68489
diff changeset
160 status = _NSGetExecutablePath(path, &size);
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 68489
diff changeset
161 if (status == 0) {
78160
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
162 /*
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
163 * Note: don't call 'realpath', that will
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
164 * erase symlink information, and that
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
165 * breaks "pyvenv --symlink"
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
166 *
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
167 * It is nice to have the directory name
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
168 * as a cleaned up absolute path though,
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
169 * therefore call realpath on dirname(path)
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
170 */
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
171 char* slash = strrchr(path, '/');
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
172 if (slash) {
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
173 char replaced;
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
174 replaced = slash[1];
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
175 slash[1] = 0;
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
176 if (realpath(path, real_path) == NULL) {
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
177 err(1, "realpath: %s", path);
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
178 }
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
179 slash[1] = replaced;
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
180 if (strlcat(real_path, slash, sizeof(real_path)) > sizeof(real_path)) {
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
181 errno = EINVAL;
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
182 err(1, "realpath: %s", path);
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
183 }
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
184
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
185 } else {
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
186 if (realpath(".", real_path) == NULL) {
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
187 err(1, "realpath: %s", path);
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
188 }
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
189 if (strlcat(real_path, "/", sizeof(real_path)) > sizeof(real_path)) {
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
190 errno = EINVAL;
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
191 err(1, "realpath: %s", path);
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
192 }
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
193 if (strlcat(real_path, path, sizeof(real_path)) > sizeof(real_path)) {
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
194 errno = EINVAL;
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
195 err(1, "realpath: %s", path);
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
196 }
77154
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 68489
diff changeset
197 }
78160
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
198
b79d276041a8 Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 77758
diff changeset
199 setenv("__PYVENV_LAUNCHER__", real_path, 1);
77154
294f8aeb4d4b Implemented PEP 405 (Python virtual environments).
Vinay Sajip <vinay_sajip@yahoo.co.uk>
parents: 68489
diff changeset
200 }
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
201
62027
34a637bfd4be Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 61466
diff changeset
202 /*
34a637bfd4be Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 61466
diff changeset
203 * Let argv[0] refer to the new interpreter. This is needed to
34a637bfd4be Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 61466
diff changeset
204 * get the effect we want on OSX 10.5 or earlier. That is, without
34a637bfd4be Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 61466
diff changeset
205 * changing argv[0] the real interpreter won't have access to
34a637bfd4be Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 61466
diff changeset
206 * the Window Server.
34a637bfd4be Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 61466
diff changeset
207 */
34a637bfd4be Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 61466
diff changeset
208 argv[0] = exec_path;
34a637bfd4be Merged revisions 81649 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 61466
diff changeset
209
58819
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
210 #ifdef HAVE_SPAWN_H
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
211 /* We're weak-linking to posix-spawnv to ensure that
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
212 * an executable build on 10.5 can work on 10.4.
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
213 */
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
214 if (posix_spawn != NULL) {
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
215 posix_spawnattr_t spawnattr = NULL;
57914
94e957cfda38 Merged revisions 77031 via svnmerge from
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 38673
diff changeset
216
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
217 setup_spawnattr(&spawnattr);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
218 posix_spawn(NULL, exec_path, NULL,
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
219 &spawnattr, argv, environ);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
220 err(1, "posix_spawn: %s", exec_path);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
221 }
58819
b834c8ee8e7c Forward port a number of OSX bugfixes from the trunk to 3.2
Ronald Oussoren <ronaldoussoren@mac.com>
parents: 57914
diff changeset
222 #endif
61466
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
223 execve(exec_path, argv, environ);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
224 err(1, "execve: %s", argv[0]);
cab14be0ada1 Recorded merge of revisions 81029 via svnmerge from
Antoine Pitrou <solipsis@pitrou.net>
parents: 60523
diff changeset
225 /* NOTREACHED */
38673
a19c20c5e5c7 Merge the rest of the trunk.
Thomas Wouters <thomas@python.org>
parents:
diff changeset
226 }