Index: src/port/path.c =================================================================== RCS file: /cvsroot/pgsql/src/port/path.c,v retrieving revision 1.44 diff -c -c -r1.44 path.c *** src/port/path.c 6 Nov 2004 21:39:45 -0000 1.44 --- src/port/path.c 7 Nov 2004 01:53:58 -0000 *************** *** 203,223 **** * o make Win32 path use Unix slashes * o remove trailing quote on Win32 * o remove trailing slash * o remove trailing '.' * o process trailing '..' ourselves */ void canonicalize_path(char *path) { ! #ifdef WIN32 /* * The Windows command processor will accept suitably quoted paths * with forward slashes, but barfs badly with mixed forward and back * slashes. */ - char *p; - for (p = path; *p; p++) { if (*p == '\\') --- 203,224 ---- * o make Win32 path use Unix slashes * o remove trailing quote on Win32 * o remove trailing slash + * o remove duplicate adjacent separators * o remove trailing '.' * o process trailing '..' ourselves */ void canonicalize_path(char *path) { ! char *p, *to_p; ! bool was_sep = false; + #ifdef WIN32 /* * The Windows command processor will accept suitably quoted paths * with forward slashes, but barfs badly with mixed forward and back * slashes. */ for (p = path; *p; p++) { if (*p == '\\') *************** *** 226,232 **** /* * In Win32, if you do: prog.exe "a b" "\c\d\" the system will pass ! * \c\d" as argv[2]. */ if (p > path && *(p - 1) == '"') *(p - 1) = '/'; --- 227,233 ---- /* * In Win32, if you do: prog.exe "a b" "\c\d\" the system will pass ! * \c\d" as argv[2], so trim off trailing quote. */ if (p > path && *(p - 1) == '"') *(p - 1) = '/'; *************** *** 240,245 **** --- 241,267 ---- trim_trailing_separator(path); /* + * Remove duplicate adjacent separators + */ + p = path; + #ifdef WIN32 + /* Don't remove leading double-slash on Win32 */ + if (*p) + p++; + #endif + to_p = p; + for (; *p; p++, to_p++) + { + /* Handle many adjacent slashes, like "/a///b" */ + while (*p == '/' && was_sep) + p++; + if (to_p != p) + *to_p = *p; + was_sep = (*p == '/'); + } + *to_p = '\0'; + + /* * Remove any trailing uses of "." and process ".." ourselves */ for (;;) *************** *** 247,255 **** int len = strlen(path); if (len > 2 && strcmp(path + len - 2, "/.") == 0) - { trim_directory(path); - } else if (len > 3 && strcmp(path + len - 3, "/..") == 0) { trim_directory(path); --- 269,275 ----