]> granicus.if.org Git - python/commitdiff
Patch by Brian Hooper, somewhat augmented by GvR, to strip a trailing
authorGuido van Rossum <guido@python.org>
Fri, 21 Apr 2000 18:54:45 +0000 (18:54 +0000)
committerGuido van Rossum <guido@python.org>
Fri, 21 Apr 2000 18:54:45 +0000 (18:54 +0000)
backslash from the pathname argument to stat() on Windows -- while on
Unix, stat("/bin/") succeeds and does the same thing as stat("/bin"),
on Windows, stat("\\windows\\") fails while stat("\\windows") succeeds.
This modified version of the patch recognizes both / and \.

(This is odd behavior of the MS C library, since
os.listdir("\\windows\\") succeeds!)

Modules/posixmodule.c

index c948b952e13f17200e8a298ae02b78a99b06e28c..e2691065bab5f354b77e5dcb74187ae06d827a8b 100644 (file)
@@ -549,8 +549,36 @@ posix_do_stat(self, args, format, statfunc)
        struct stat st;
        char *path;
        int res;
+
+#ifdef MS_WIN32
+      int pathlen;
+      char pathcopy[MAX_PATH];
+#endif /* MS_WIN32 */
+
        if (!PyArg_ParseTuple(args, format, &path))
                return NULL;
+
+#ifdef MS_WIN32
+       pathlen = strlen(path);
+       /* the library call can blow up if the file name is too long! */
+       if (pathlen > MAX_PATH) {
+               errno = ENAMETOOLONG;
+               return posix_error();
+       }
+
+       if ((pathlen > 0) && (path[pathlen-1] == '\\' || path[pathlen-1] == '/')) {
+               /* exception for drive root */
+               if (!((pathlen == 3) &&
+                     (path[1] == ':') &&
+                     (path[2] == '\\' || path[2] == '/')))
+               {
+                       strncpy(pathcopy, path, pathlen);
+                       pathcopy[pathlen-1] = '\0'; /* nuke the trailing backslash */
+                       path = pathcopy;
+               }
+       }
+#endif /* MS_WIN32 */
+
        Py_BEGIN_ALLOW_THREADS
        res = (*statfunc)(path, &st);
        Py_END_ALLOW_THREADS