780b6f0
--- Python-2.4.1/pyconfig.h.in.canonicalize	2004-10-13 11:30:55.000000000 -0400
fdbec0a
+++ Python-2.4.1/pyconfig.h.in	2005-10-06 14:04:06.000000000 -0400
780b6f0
@@ -58,6 +58,9 @@
780b6f0
 /* Define if pthread_sigmask() does not work on your system. */
780b6f0
 #undef HAVE_BROKEN_PTHREAD_SIGMASK
780b6f0
 
780b6f0
+/* Define to 1 if you have the `canonicalize_file_name' function. */
780b6f0
+#undef HAVE_CANONICALIZE_FILE_NAME
780b6f0
+
780b6f0
 /* Define to 1 if you have the `chown' function. */
780b6f0
 #undef HAVE_CHOWN
780b6f0
 
Mihai Ibanescu a101798
--- Python-2.4.1/Python/sysmodule.c.canonicalize	2005-01-27 13:58:30.000000000 -0500
fdbec0a
+++ Python-2.4.1/Python/sysmodule.c	2005-10-06 14:56:37.000000000 -0400
a1be1af
@@ -1168,11 +1168,13 @@
a1be1af
 void
a1be1af
 PySys_SetArgv(int argc, char **argv)
a1be1af
 {
a1be1af
+#ifndef HAVE_CANONICALIZE_FILE_NAME
a1be1af
 #if defined(HAVE_REALPATH)
a1be1af
 	char fullpath[MAXPATHLEN];
a1be1af
 #elif defined(MS_WINDOWS)
a1be1af
 	char fullpath[MAX_PATH];
a1be1af
 #endif
a1be1af
+#endif
a1be1af
 	PyObject *av = makeargvobject(argc, argv);
a1be1af
 	PyObject *path = PySys_GetObject("path");
a1be1af
 	if (av == NULL)
fdbec0a
@@ -1184,6 +1186,64 @@
Mihai Ibanescu a101798
 		char *p = NULL;
Mihai Ibanescu a101798
 		int n = 0;
Mihai Ibanescu a101798
 		PyObject *a;
Mihai Ibanescu 7ccfc38
+#ifdef HAVE_CANONICALIZE_FILE_NAME
6f931e7
+		char *link = NULL, *argv0copy = NULL;
Mihai Ibanescu a101798
+                
780b6f0
+                if (argc > 0 && argv0 != NULL) {
6f931e7
+			
6f931e7
+			link = canonicalize_file_name(argv0);
fdbec0a
+			if (link == NULL) {
6f931e7
+				link = strdup(argv0);
6f931e7
+				if (!link)
6f931e7
+					Py_FatalError("no mem for sys.argv");
6f931e7
+			}
6f931e7
+		}
6f931e7
+		if (link) {
6f931e7
+			if (link[0] == SEP) /* Link to absolute path */
6f931e7
+				argv0 = link;
6f931e7
+			else if (strchr(link, SEP) == NULL) {
6f931e7
+				/* Link without path */
6f931e7
+				/* strdup argv0 so we can free it 
6f931e7
+				   unconditionally */
6f931e7
+				argv0 = strdup(argv0);
6f931e7
+				if (!argv0)
6f931e7
+					Py_FatalError("no mem for sys.argv");
6f931e7
+				free(link);
6f931e7
+			} else {
6f931e7
+				/* Must join(dirname(argv0), link) */
6f931e7
+				char *q = strrchr(argv0, SEP);
6f931e7
+				if (q == NULL) /* argv0 without path */
6f931e7
+					argv0 = link;
6f931e7
+				else {
6f931e7
+					/* Must make a copy */
6f931e7
+					argv0copy = calloc(
6f931e7
+                                                strlen(link) + strlen(q) +1,
6f931e7
+                                                sizeof (char));
6f931e7
+					if (!argv0copy)
6f931e7
+						Py_FatalError("no mem for sys.argv");
6f931e7
+					strcpy(argv0copy, argv0);
6f931e7
+					q = strrchr(argv0copy, SEP);
6f931e7
+					strcpy(argv0copy+1, link);
6f931e7
+					argv0 = argv0copy;
6f931e7
+					p = NULL;
6f931e7
+					free(link);
780b6f0
+				}
780b6f0
+			}
6f931e7
+		}
6f931e7
+		if (argc > 0 && argv0 != NULL) {
6f931e7
+			char *q;
6f931e7
+			p = strrchr(argv0, SEP);
6f931e7
+			/* Test for alternate separator */
6f931e7
+			q = strrchr(p ? p : argv0, '/');
6f931e7
+			if (q != NULL)
6f931e7
+				p = q;
6f931e7
+			if (p != NULL) {
6f931e7
+				n = p + 1 - argv0;
6f931e7
+				if (n > 1 && p[-1] != ':')
6f931e7
+					n--; /* Drop trailing separator */
6f931e7
+			}
780b6f0
+		}
Mihai Ibanescu 7ccfc38
+#else /* ! HAVE_CANONICALIZE_FILE_NAME */
Mihai Ibanescu a101798
 #ifdef HAVE_READLINK
Mihai Ibanescu a101798
 		char link[MAXPATHLEN+1];
Mihai Ibanescu a101798
 		char argv0copy[2*MAXPATHLEN+1];
fdbec0a
@@ -1256,9 +1316,14 @@
Mihai Ibanescu 7ccfc38
 #endif /* Unix */
Mihai Ibanescu 7ccfc38
 		}
Mihai Ibanescu 7ccfc38
 #endif /* All others */
Mihai Ibanescu 7ccfc38
+#endif /* ! HAVE_CANONICALIZE_FILE_NAME */
Mihai Ibanescu 7ccfc38
 		a = PyString_FromStringAndSize(argv0, n);
Mihai Ibanescu 7ccfc38
 		if (a == NULL)
Mihai Ibanescu 7ccfc38
 			Py_FatalError("no mem for sys.path insertion");
Mihai Ibanescu 7ccfc38
+#ifdef HAVE_CANONICALIZE_FILE_NAME
fdbec0a
+		if (argc > 0 && argv0 != NULL)
780b6f0
+			free(argv0);
Mihai Ibanescu 7ccfc38
+#endif /* HAVE_CANONICALIZE_FILE_NAME */
Mihai Ibanescu 7ccfc38
 		if (PyList_Insert(path, 0, a) < 0)
Mihai Ibanescu 7ccfc38
 			Py_FatalError("sys.path.insert(0) failed");
Mihai Ibanescu 7ccfc38
 		Py_DECREF(a);
Mihai Ibanescu a101798
--- Python-2.4.1/configure.in.canonicalize	2005-03-28 18:23:34.000000000 -0500
fdbec0a
+++ Python-2.4.1/configure.in	2005-10-06 14:04:06.000000000 -0400
Mihai Ibanescu 7ccfc38
@@ -2096,8 +2096,8 @@
Mihai Ibanescu 7ccfc38
 AC_MSG_RESULT(MACHDEP_OBJS)
Mihai Ibanescu 7ccfc38
 
Mihai Ibanescu 7ccfc38
 # checks for library functions
Mihai Ibanescu 7ccfc38
-AC_CHECK_FUNCS(alarm bind_textdomain_codeset chown clock confstr ctermid \
Mihai Ibanescu 7ccfc38
- execv fork fpathconf ftime ftruncate \
Mihai Ibanescu 7ccfc38
+AC_CHECK_FUNCS(alarm bind_textdomain_codeset canonicalize_file_name chown \
Mihai Ibanescu 7ccfc38
+ clock confstr ctermid execv fork fpathconf ftime ftruncate \
Mihai Ibanescu 7ccfc38
  gai_strerror getgroups getlogin getloadavg getpeername getpgid getpid \
Mihai Ibanescu 7ccfc38
  getpriority getpwent getsid getwd \
Mihai Ibanescu 7ccfc38
  kill killpg lchown lstat mkfifo mknod mktime \