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 054e8d78227d116020b257ac50b31413d678d9b6..cc624b07e6fe95481f176f52643f05279ce337c2 100644 (file)
@@ -4,7 +4,7 @@
  *
  * Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.42 2004/10/22 00:24:18 tgl Exp $
+ * $PostgreSQL: pgsql/src/bin/pg_ctl/pg_ctl.c,v 1.43 2004/10/27 17:17:07 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -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 65fc36e674cca5dde7411bc9ad430fed67d93bf2..896a0378b2d0073c6eea3ab1badab717641aac61 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/port/path.c,v 1.37 2004/10/24 22:08:19 tgl Exp $
+ *   $PostgreSQL: pgsql/src/port/path.c,v 1.38 2004/10/27 17:17:09 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -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