From a4c71af2c01c4a3def06905356f47b99f2a753d1 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Mon, 12 Jul 2004 19:15:14 +0000
Subject: [PATCH] Put back canonicalization of PGDATA environment variable.

---
 src/backend/postmaster/postmaster.c |  7 +++++--
 src/bin/pg_ctl/pg_ctl.c             |  7 +++++--
 src/port/path.c                     | 26 ++++++++++++++++++--------
 3 files changed, 28 insertions(+), 12 deletions(-)

diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 208175c2c6b..7edd43ce6b9 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.410 2004/07/12 18:17:13 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.411 2004/07/12 19:14:56 momjian Exp $
  *
  * NOTES
  *
@@ -526,7 +526,10 @@ PostmasterMain(int argc, char *argv[])
 	}
 
 	if (userPGDATA)
-		canonicalize_path(userPGDATA = strdup(userPGDATA));
+	{
+		userPGDATA = strdup(userPGDATA);
+		canonicalize_path(userPGDATA);
+	}
 
 	if (onlyConfigSpecified(userPGDATA))
 	{
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
index 6cd562345c9..13f0561b3a4 100644
--- a/src/bin/pg_ctl/pg_ctl.c
+++ b/src/bin/pg_ctl/pg_ctl.c
@@ -4,7 +4,7 @@
  *
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.19 2004/07/12 18:17:13 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.20 2004/07/12 19:15:07 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -1308,7 +1308,10 @@ main(int argc, char **argv)
 	/* Note we put any -D switch into the env var above */
 	pg_data = getenv("PGDATA");
 	if (pg_data)
-		canonicalize_path(pg_data = xstrdup(pg_data));
+	{
+		/* XXX modifies environment var in-place ... ugly ... */
+		canonicalize_path(pg_data);
+	}
 
 	if (pg_data == NULL &&
 		ctl_command != KILL_COMMAND && ctl_command != UNREGISTER_COMMAND)
diff --git a/src/port/path.c b/src/port/path.c
index 9a796af4dad..b9958acb746 100644
--- a/src/port/path.c
+++ b/src/port/path.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/port/path.c,v 1.23 2004/07/11 21:34:04 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/port/path.c,v 1.24 2004/07/12 19:15:14 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -88,18 +88,17 @@ last_dir_separator(const char *filename)
 
 
 /*
- * make all paths look like unix, with forward slashes
- * also strip any trailing slash.
- *
- * The Windows command processor will accept suitably quoted paths
- * with forward slashes, but barfs badly with mixed forward and back
- * slashes. Removing the trailing slash on a path means we never get
- * ugly double slashes.  Don't remove a leading slash, though.
+ * Make all paths look like Unix
  */
 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++)
@@ -107,8 +106,19 @@ canonicalize_path(char *path)
 		if (*p == '\\')
 			*p = '/';
 	}
+	/*	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) = '/';
 #endif
 
+	/*
+	 *	Removing the trailing slash on a path means we never get
+	 *	ugly double slashes.  Don't remove a leading slash, though.
+	 *	Also, Win32 can't stat() a directory with a trailing slash.
+	 */
 	trim_trailing_separator(path);
 }
 
-- 
GitLab