Blob Blame Raw
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);