124 lines
4.0 KiB
Diff
124 lines
4.0 KiB
Diff
diff -up Python-2.6/configure.in.canonicalize Python-2.6/configure.in
|
|
--- Python-2.6/configure.in.canonicalize 2008-09-07 15:18:16.000000000 -0400
|
|
+++ Python-2.6/configure.in 2008-11-24 02:09:29.000000000 -0500
|
|
@@ -2445,7 +2445,8 @@ fi
|
|
AC_MSG_RESULT(MACHDEP_OBJS)
|
|
|
|
# checks for library functions
|
|
-AC_CHECK_FUNCS(alarm setitimer getitimer bind_textdomain_codeset chown \
|
|
+AC_CHECK_FUNCS(alarm setitimer getitimer bind_textdomain_codeset \
|
|
+ canonicalize_file_name chown \
|
|
clock confstr ctermid execv fchmod fchown fork fpathconf ftime ftruncate \
|
|
gai_strerror getgroups getlogin getloadavg getpeername getpgid getpid \
|
|
getpriority getpwent getspnam getspent getsid getwd \
|
|
diff -up Python-2.6/pyconfig.h.in.canonicalize Python-2.6/pyconfig.h.in
|
|
--- Python-2.6/pyconfig.h.in.canonicalize 2008-09-07 01:15:18.000000000 -0400
|
|
+++ Python-2.6/pyconfig.h.in 2008-11-24 02:07:11.000000000 -0500
|
|
@@ -79,6 +79,9 @@
|
|
/* Define to 1 if you have the `chflags' function. */
|
|
#undef HAVE_CHFLAGS
|
|
|
|
+/* 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
|
|
|
|
diff -up Python-2.6/Python/sysmodule.c.canonicalize Python-2.6/Python/sysmodule.c
|
|
--- Python-2.6/Python/sysmodule.c.canonicalize 2008-07-10 13:13:55.000000000 -0400
|
|
+++ Python-2.6/Python/sysmodule.c 2008-11-24 02:07:11.000000000 -0500
|
|
@@ -1524,11 +1524,13 @@ makeargvobject(int argc, char **argv)
|
|
void
|
|
PySys_SetArgv(int argc, char **argv)
|
|
{
|
|
+#ifndef HAVE_CANONICALIZE_FILE_NAME
|
|
#if defined(HAVE_REALPATH)
|
|
char fullpath[MAXPATHLEN];
|
|
#elif defined(MS_WINDOWS)
|
|
char fullpath[MAX_PATH];
|
|
#endif
|
|
+#endif
|
|
PyObject *av = makeargvobject(argc, argv);
|
|
PyObject *path = PySys_GetObject("path");
|
|
if (av == NULL)
|
|
@@ -1540,6 +1542,64 @@ PySys_SetArgv(int argc, char **argv)
|
|
char *p = NULL;
|
|
Py_ssize_t n = 0;
|
|
PyObject *a;
|
|
+#ifdef HAVE_CANONICALIZE_FILE_NAME
|
|
+ char *link = NULL, *argv0copy = NULL;
|
|
+
|
|
+ if (argc > 0 && argv0 != NULL) {
|
|
+
|
|
+ link = canonicalize_file_name(argv0);
|
|
+ if (link == NULL) {
|
|
+ link = strdup(argv0);
|
|
+ if (!link)
|
|
+ Py_FatalError("no mem for sys.argv");
|
|
+ }
|
|
+ }
|
|
+ if (link) {
|
|
+ if (link[0] == SEP) /* Link to absolute path */
|
|
+ argv0 = link;
|
|
+ else if (strchr(link, SEP) == NULL) {
|
|
+ /* Link without path */
|
|
+ /* strdup argv0 so we can free it
|
|
+ unconditionally */
|
|
+ argv0 = strdup(argv0);
|
|
+ if (!argv0)
|
|
+ Py_FatalError("no mem for sys.argv");
|
|
+ free(link);
|
|
+ } else {
|
|
+ /* Must join(dirname(argv0), link) */
|
|
+ char *q = strrchr(argv0, SEP);
|
|
+ if (q == NULL) /* argv0 without path */
|
|
+ argv0 = link;
|
|
+ else {
|
|
+ /* Must make a copy */
|
|
+ argv0copy = calloc(
|
|
+ strlen(link) + strlen(q) +1,
|
|
+ sizeof (char));
|
|
+ if (!argv0copy)
|
|
+ Py_FatalError("no mem for sys.argv");
|
|
+ strcpy(argv0copy, argv0);
|
|
+ q = strrchr(argv0copy, SEP);
|
|
+ strcpy(argv0copy+1, link);
|
|
+ argv0 = argv0copy;
|
|
+ p = NULL;
|
|
+ free(link);
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+ if (argc > 0 && argv0 != NULL) {
|
|
+ char *q;
|
|
+ p = strrchr(argv0, SEP);
|
|
+ /* Test for alternate separator */
|
|
+ q = strrchr(p ? p : argv0, '/');
|
|
+ if (q != NULL)
|
|
+ p = q;
|
|
+ if (p != NULL) {
|
|
+ n = p + 1 - argv0;
|
|
+ if (n > 1 && p[-1] != ':')
|
|
+ n--; /* Drop trailing separator */
|
|
+ }
|
|
+ }
|
|
+#else /* ! HAVE_CANONICALIZE_FILE_NAME */
|
|
#ifdef HAVE_READLINK
|
|
char link[MAXPATHLEN+1];
|
|
char argv0copy[2*MAXPATHLEN+1];
|
|
@@ -1612,9 +1672,14 @@ PySys_SetArgv(int argc, char **argv)
|
|
#endif /* Unix */
|
|
}
|
|
#endif /* All others */
|
|
+#endif /* ! HAVE_CANONICALIZE_FILE_NAME */
|
|
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)
|
|
+ free(argv0);
|
|
+#endif /* HAVE_CANONICALIZE_FILE_NAME */
|
|
if (PyList_Insert(path, 0, a) < 0)
|
|
Py_FatalError("sys.path.insert(0) failed");
|
|
Py_DECREF(a);
|