--- /dev/null
+--- Python-2.4.1/pyconfig.h.in.canonicalize 2004-10-13 11:30:55.000000000 -0400
++++ Python-2.4.1/pyconfig.h.in 2005-10-06 14:04:06.000000000 -0400
+@@ -58,6 +58,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
+
+--- Python-2.4.1/Python/sysmodule.c.canonicalize 2005-01-27 13:58:30.000000000 -0500
++++ Python-2.4.1/Python/sysmodule.c 2005-10-06 14:56:37.000000000 -0400
+@@ -1168,11 +1168,13 @@
+ 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)
+@@ -1184,6 +1186,64 @@
+ char *p = NULL;
+ int 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];
+@@ -1256,9 +1316,14 @@
+ #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);
+--- Python-2.4.1/configure.in.canonicalize 2005-03-28 18:23:34.000000000 -0500
++++ Python-2.4.1/configure.in 2005-10-06 14:04:06.000000000 -0400
+@@ -2096,8 +2096,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 getsid getwd \
+ kill killpg lchown lstat mkfifo mknod mktime \