python2/python-2.4.1-canonicalize.p...

122 lines
3.7 KiB
Diff

--- 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 \