Canonicalize Win32 path coming in from pg_ctl -D, idea from Magnus.

This commit is contained in:
Bruce Momjian 2004-10-27 17:17:09 +00:00
parent 118bd91809
commit 3fe704209a
2 changed files with 24 additions and 15 deletions

View File

@ -4,7 +4,7 @@
* *
* Portions Copyright (c) 1996-2004, PostgreSQL Global Development Group * 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': case 'D':
{ {
int len = strlen(optarg); char *pgdata_D = xmalloc(strlen(optarg));
char *env_var; char *env_var = xmalloc(strlen(optarg) + 8);
env_var = xmalloc(len + 8); strcpy(pgdata_D, optarg);
snprintf(env_var, len + 8, "PGDATA=%s", optarg); canonicalize_path(pgdata_D);
snprintf(env_var, strlen(pgdata_D) + 8, "PGDATA=%s",
pgdata_D);
putenv(env_var); putenv(env_var);
/* /*
* Show -D for easier postmaster 'ps' * We could pass PGDATA just in an environment
* identification * variable but we do -D too for clearer
* postmaster 'ps' display
*/ */
pgdata_opt = xmalloc(len + 7); pgdata_opt = xmalloc(strlen(pgdata_D) + 7);
snprintf(pgdata_opt, len + 7, "-D \"%s\" ", optarg); snprintf(pgdata_opt, strlen(pgdata_D) + 7, "-D \"%s\" ",
pgdata_D);
break; break;
} }
case 'l': case 'l':

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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 void
canonicalize_path(char *path) canonicalize_path(char *path)
@ -145,13 +150,13 @@ canonicalize_path(char *path)
/* /*
* Removing the trailing slash on a path means we never get ugly * Removing the trailing slash on a path means we never get ugly
* double slashes. Also, Win32 can't stat() a directory with a * double trailing slashes. Also, Win32 can't stat() a directory
* trailing slash. Don't remove a leading slash, though. * with a trailing slash. Don't remove a leading slash, though.
*/ */
trim_trailing_separator(path); trim_trailing_separator(path);
/* /*
* Remove any trailing uses of "." or "..", too. * Remove any trailing uses of "." and process ".." ourselves
*/ */
for (;;) for (;;)
{ {
@ -165,7 +170,7 @@ canonicalize_path(char *path)
else if (len >= 3 && strcmp(path + len - 3, "/..") == 0) else if (len >= 3 && strcmp(path + len - 3, "/..") == 0)
{ {
trim_directory(path); trim_directory(path);
trim_directory(path); trim_directory(path); /* remove directory above */
trim_trailing_separator(path); trim_trailing_separator(path);
} }
else else