--- Python/sysmodule.c +++ Python/sysmodule.c @@ -1313,7 +1313,20 @@ char *p = NULL; Py_ssize_t n = 0; PyObject *a; -#ifdef HAVE_READLINK +#ifdef HAVE_CANONICALIZE_FILE_NAME + int errnum; + + if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) { + argv0 = canonicalize_file_name(argv0); + if (argv0 == NULL) argv0 = strdup(argv[0]); + } +#elif defined(HAVE_REALPATH) + if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) { + if (realpath(argv0, fullpath)) { + argv0 = fullpath; + } + } +#elif defined(HAVE_READLINK) char link[MAXPATHLEN+1]; char argv0copy[2*MAXPATHLEN+1]; int nr = 0; @@ -1340,7 +1353,8 @@ } } } -#endif /* HAVE_READLINK */ +#endif /* resolve method selection */ + #if SEP == '\\' /* Special case for MS filename syntax */ if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) { char *q; @@ -1366,11 +1380,6 @@ } #else /* All other filename syntaxes */ if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) { -#if defined(HAVE_REALPATH) - if (realpath(argv0, fullpath)) { - argv0 = fullpath; - } -#endif p = strrchr(argv0, SEP); } if (p != NULL) { @@ -1388,6 +1397,9 @@ a = PyString_FromStringAndSize(argv0, n); if (a == NULL) Py_FatalError("no mem for sys.path insertion"); +#ifdef HAVE_CANONICALIZE_FILE_NAME + if (argc > 0 && argv0 != NULL && strcmp(argv0, "-c") != 0) free(argv0); +#endif /* HAVE_CANONICALIZE_FILE_NAME */ if (PyList_Insert(path, 0, a) < 0) Py_FatalError("sys.path.insert(0) failed"); Py_DECREF(a); --- configure.in +++ configure.in @@ -2289,8 +2289,8 @@ AC_MSG_RESULT(MACHDEP_OBJS) # checks for library functions -AC_CHECK_FUNCS(alarm bind_textdomain_codeset chown clock confstr ctermid \ - execv fork fpathconf ftime ftruncate \ +AC_CHECK_FUNCS(alarm bind_textdomain_codeset canonicalize_file_name chown \ + clock confstr ctermid execv fork fpathconf ftime ftruncate \ gai_strerror getgroups getlogin getloadavg getpeername getpgid getpid \ getpriority getpwent getspnam getspent getsid getwd \ kill killpg lchown lstat mkfifo mknod mktime \ --- pyconfig.h.in +++ pyconfig.h.in @@ -61,6 +61,9 @@ /* Define if pthread_sigmask() does not work on your system. */ #undef HAVE_BROKEN_PTHREAD_SIGMASK +/* Define to 1 if you have the `canonicalize_file_name' function. */ +#undef HAVE_CANONICALIZE_FILE_NAME + /* Define to 1 if you have the `chown' function. */ #undef HAVE_CHOWN