Eric Blake wrote: > On 09/04/2012 04:57 AM, Eric Blake wrote: >>> * lib/fts.c (fts_open): Upon initialization, if a name ends in two >>> or more slashes, trim all but the final one. But if a name consists >>> solely of two or more slashes, reduce it to "//", not to "/". >> >> For two slashes, that is correct. But trimming "///" to "//" is a >> violation of POSIX and fails on cygwin; "///" must be the same as "/", >> not "///". >> >>> +++ b/lib/fts.c >>> @@ -487,6 +487,14 @@ fts_open (char * const *argv, >>> for (root = NULL, nitems = 0; *argv != NULL; ++argv, ++nitems) { >>> /* *Do* allow zero-length file names. */ >>> size_t len = strlen(*argv); >>> + >>> + /* If there are two or more trailing slashes, trim all but >>> one, >>> + but don't change "//" to "/". */ >>> + char const *v = *argv; >>> + if (2 < len && v[len - 1] == '/') >>> + while (2 < len && v[len - 2] == '/') >>> + --len; > > I think that this would do the right thing, though (notice that it > strips all but 1 slash for anything longer than "//" to begin with): > > + char const *v = *argv; > + if (2 < len && v[len - 1] == '/') > + while (1 < len && v[len - 1] == '/') > + --len;
Actually, that's not correct, either. You changed both '2's in the while condition, but that would have the effect of stripping all trailing slashes, whereas as the comment says, I want to leave one, in general: - while (2 < len && v[len - 2] == '/') + while (1 < len && v[len - 1] == '/') So I think the revised commit I posted is correct. It does this: - while (2 < len && v[len - 2] == '/') + while (1 < len && v[len - 2] == '/')