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 ----
