]> granicus.if.org Git - postgresql/commitdiff
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