*
* 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 $
*
*-------------------------------------------------------------------------
*/
{
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':
*
*
* 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 $
*
*-------------------------------------------------------------------------
*/
/*
- * 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)
/*
* 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 (;;)
{
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