From: Bruce Momjian Date: Wed, 27 Oct 2004 17:17:09 +0000 (+0000) Subject: Canonicalize Win32 path coming in from pg_ctl -D, idea from Magnus. X-Git-Tag: REL8_0_0BETA5~202 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3fe704209adddf2835bb3e694267acddfc49bc9e;p=postgresql Canonicalize Win32 path coming in from pg_ctl -D, idea from Magnus. --- diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index 054e8d7822..cc624b07e6 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-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': diff --git a/src/port/path.c b/src/port/path.c index 65fc36e674..896a0378b2 100644 --- a/src/port/path.c +++ b/src/port/path.c @@ -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