Commits

Barry Warsaw committed 5c40113

Steve Majewski's patch #103495, MatchFilename() and find_module()
patch for case-preserving HFS+ suport. Untested except to verify that
it builds and doesn't break anything on Linux RH6.1.

  • Participants
  • Parent commits 8b318b8
  • Branches legacy-trunk

Comments (0)

Files changed (1)

 
 static int find_init_module(char *); /* Forward */
 
+#ifdef HAVE_DIRENT_H
+
+static int MatchFilename(char *pathname, char *filename);
+
+#include <sys/types.h>
+#include <dirent.h>
+
+static int MatchFilename(char *pathname, char *filename)
+{
+	DIR *dirp;
+	struct dirent *dp;
+	int len = strlen(filename);
+
+	if ((pathname == NULL) || (strlen(pathname) == 0))
+		pathname = ".";
+	dirp = opendir(pathname);
+	if (dirp) {
+		while ((dp = readdir(dirp)) != NULL) {
+#ifdef _DIRENT_HAVE_D_NAMELINE
+			int namelen = dp->d_namlen;
+#else  /* !_DIRENT_HAVE_D_NAMELINE */
+			int namelen = strlen(dp->d_name);
+#endif /* _DIRENT_HAVE_D_NAMELINE */
+			if (namelen == len && !strcmp(dp->d_name, filename)) {
+				(void)closedir(dirp);
+				return 1; /* Found */
+			}
+		}
+	}
+	(void)closedir(dirp);
+	return 0 ; /* Not found */
+}
+#endif /* HAVE_DIRENT_H */
+
 static struct filedescr *
 find_module(char *realname, PyObject *path, char *buf, size_t buflen,
 	    FILE **p_fp)
 			if (Py_VerboseFlag > 1)
 				PySys_WriteStderr("# trying %s\n", buf);
 			fp = fopen(buf, fdp->mode);
+#ifdef HAVE_DIRENT_H
+
+		        if (fp != NULL) {  /* check case */
+				char *curpath = PyString_AsString(v);
+				char *nstart = buf + strlen(curpath);
+				if (*nstart == SEP)
+					nstart++; 
+				if (MatchFilename(curpath, nstart)) {
+					break;      /* Found */
+				}
+				fclose(fp); /* No. Close & continue search */
+				fp = NULL;
+				if (Py_VerboseFlag > 1)
+					PySys_WriteStderr(
+					      "# case mismatch for %s:  %s\n", 
+					      name, buf);
+			}
+#else  /* !HAVE_DIRENT_H */
 			if (fp != NULL)
 				break;
+#endif /* HAVE_DIRENT_H */
 		}
 #endif /* !macintosh */
 		if (fp != NULL)