diff options
author | Vinay Sajip <vinay_sajip@yahoo.co.uk> | 2012-07-17 17:33:46 +0100 |
---|---|---|
committer | Vinay Sajip <vinay_sajip@yahoo.co.uk> | 2012-07-17 17:33:46 +0100 |
commit | 90db661b4335eaf7a3cb5e9a4524ae9707eeaf76 (patch) | |
tree | b73b67deb7feab489b2f43d8cc43778e8ac8cb23 /Mac/Tools | |
parent | Use posixpath.join() explicitely in posixpath.join() test (diff) | |
download | cpython-90db661b4335eaf7a3cb5e9a4524ae9707eeaf76.tar.gz cpython-90db661b4335eaf7a3cb5e9a4524ae9707eeaf76.tar.bz2 cpython-90db661b4335eaf7a3cb5e9a4524ae9707eeaf76.zip |
Closes #15307: symlinks now work on OS X with framework Python builds. Patch by Ronald Oussoren.
Diffstat (limited to 'Mac/Tools')
-rw-r--r-- | Mac/Tools/pythonw.c | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/Mac/Tools/pythonw.c b/Mac/Tools/pythonw.c index f5cdff52d02..1d2db383f94 100644 --- a/Mac/Tools/pythonw.c +++ b/Mac/Tools/pythonw.c @@ -28,6 +28,7 @@ #include <dlfcn.h> #include <stdlib.h> #include <Python.h> +#include <mach-o/dyld.h> extern char** environ; @@ -158,9 +159,44 @@ main(int argc, char **argv) { /* Set the original executable path in the environment. */ status = _NSGetExecutablePath(path, &size); if (status == 0) { - if (realpath(path, real_path) != NULL) { - setenv("__PYVENV_LAUNCHER__", real_path, 1); + /* + * Note: don't call 'realpath', that will + * erase symlink information, and that + * breaks "pyvenv --symlink" + * + * It is nice to have the directory name + * as a cleaned up absolute path though, + * therefore call realpath on dirname(path) + */ + char* slash = strrchr(path, '/'); + if (slash) { + char replaced; + replaced = slash[1]; + slash[1] = 0; + if (realpath(path, real_path) == NULL) { + err(1, "realpath: %s", path); + } + slash[1] = replaced; + if (strlcat(real_path, slash, sizeof(real_path)) > sizeof(real_path)) { + errno = EINVAL; + err(1, "realpath: %s", path); + } + + } else { + if (realpath(".", real_path) == NULL) { + err(1, "realpath: %s", path); + } + if (strlcat(real_path, "/", sizeof(real_path)) > sizeof(real_path)) { + errno = EINVAL; + err(1, "realpath: %s", path); + } + if (strlcat(real_path, path, sizeof(real_path)) > sizeof(real_path)) { + errno = EINVAL; + err(1, "realpath: %s", path); + } } + + setenv("__PYVENV_LAUNCHER__", real_path, 1); } /* |