The following applied patch removes duplicate slashes from the path in
canonicalize_path().  It preserve double leading slashes on Win32.

e.g.    ////a////b => /a/b

-- 
  Bruce Momjian                        |  http://candle.pha.pa.us
  [EMAIL PROTECTED]               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073
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 ----
---------------------------(end of broadcast)---------------------------
TIP 4: Don't 'kill -9' the postmaster

Reply via email to