diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index 054e8d78227d116020b257ac50b31413d678d9b6..cc624b07e6fe95481f176f52643f05279ce337c2 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 65fc36e674cca5dde7411bc9ad430fed67d93bf2..896a0378b2d0073c6eea3ab1badab717641aac61 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