From: Guido van Rossum Date: Fri, 21 Apr 2000 18:54:45 +0000 (+0000) Subject: Patch by Brian Hooper, somewhat augmented by GvR, to strip a trailing X-Git-Tag: v2.0b1~1996 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ace88aebbbbb5c96eb3dd88308d03d3d3b9c73e5;p=python Patch by Brian Hooper, somewhat augmented by GvR, to strip a trailing 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!) --- diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index c948b952e1..e2691065ba 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -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