Canonicalize Win32 path coming in from pg_ctl -D, idea from Magnus.
authorBruce Momjian <bruce@momjian.us>
Wed, 27 Oct 2004 17:17:09 +0000 (17:17 +0000)
committerBruce Momjian <bruce@momjian.us>
Wed, 27 Oct 2004 17:17:09 +0000 (17:17 +0000)
src/bin/pg_ctl/pg_ctl.c
src/port/path.c

index 0ce13b6235fe70aedb03aa8886e5bf76d3af03e4..4bc56bc91df7082876101678a92c3c54d85ab511 100644 (file)
@@ -1279,19 +1279,23 @@ main(int argc, char **argv)
                        {
                                case 'D':
                                        {
-                                               int                     len = strlen(optarg);
-                                               char       *env_var;
+                                               char       *pgdata_D = xmalloc(strlen(optarg));
+                                               char       *env_var = xmalloc(strlen(optarg) + 8);
 
-                                               env_var = xmalloc(len + 8);
-                                               snprintf(env_var, len + 8, "PGDATA=%s", optarg);
+                                               strcpy(pgdata_D, optarg);
+                                               canonicalize_path(pgdata_D);
+                                               snprintf(env_var, strlen(pgdata_D) + 8, "PGDATA=%s",
+                                                                pgdata_D);
                                                putenv(env_var);
 
                                                /*
-                                                * Show -D for easier postmaster 'ps'
-                                                * identification
+                                                *      We could pass PGDATA just in an environment
+                                                *      variable but we do -D too for clearer
+                                                *      postmaster 'ps' display
                                                 */
-                                               pgdata_opt = xmalloc(len + 7);
-                                               snprintf(pgdata_opt, len + 7, "-D \"%s\" ", optarg);
+                                               pgdata_opt = xmalloc(strlen(pgdata_D) + 7);
+                                               snprintf(pgdata_opt, strlen(pgdata_D) + 7, "-D \"%s\" ",
+                                                                pgdata_D);
                                                break;
                                        }
                                case 'l':
index 76a27997777d841d3bce3bcab138f6cef7912ac5..f999436f6948286b014228c4257bcb84fd0920c1 100644 (file)
@@ -115,7 +115,12 @@ make_native_path(char *filename)
 
 
 /*
- * Make all paths look like Unix
+ *     Clean up path by:
+ *             o  make Win32 path use Unix slashes
+ *             o  remove trailling quote on Win32
+ *             o  remove trailling slash
+ *             o  remove trailing '.'
+ *             o  process trailing '..' ourselves
  */
 void
 canonicalize_path(char *path)
@@ -145,13 +150,13 @@ canonicalize_path(char *path)
 
        /*
         * Removing the trailing slash on a path means we never get ugly
-        * double slashes.      Also, Win32 can't stat() a directory with a
-        * trailing slash. Don't remove a leading slash, though.
+        * double trailing slashes.     Also, Win32 can't stat() a directory
+        * with a trailing slash. Don't remove a leading slash, though.
         */
        trim_trailing_separator(path);
 
        /*
-        * Remove any trailing uses of "." or "..", too.
+        * Remove any trailing uses of "." and process ".." ourselves
         */
        for (;;)
        {
@@ -165,7 +170,7 @@ canonicalize_path(char *path)
                else if (len >= 3 && strcmp(path + len - 3, "/..") == 0)
                {
                        trim_directory(path);
-                       trim_directory(path);
+                       trim_directory(path);   /* remove directory above */
                        trim_trailing_separator(path);
                }
                else