Commit eaa70a38 authored by Tom Lane's avatar Tom Lane

Fix initdb to reject a relative path for -X (--xlogdir) argument. This

doesn't work, and the real reason why not is it's unclear where the path
is relative to (initdb's CWD, or the data directory?).  We could make an
arbitrary decision, but it seems best to make the user be unambiguous.
Per gripe from Devrim.
parent c4fdebd9
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* Portions taken from FreeBSD. * Portions taken from FreeBSD.
* *
* $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.155 2008/02/29 23:31:20 adunstan Exp $ * $PostgreSQL: pgsql/src/bin/initdb/initdb.c,v 1.156 2008/06/02 03:48:00 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -3002,8 +3002,13 @@ main(int argc, char *argv[]) ...@@ -3002,8 +3002,13 @@ main(int argc, char *argv[])
{ {
char *linkloc; char *linkloc;
linkloc = (char *) pg_malloc(strlen(pg_data) + 8 + 2); /* clean up xlog directory name, check it's absolute */
sprintf(linkloc, "%s/pg_xlog", pg_data); canonicalize_path(xlog_dir);
if (!is_absolute_path(xlog_dir))
{
fprintf(stderr, _("%s: xlog directory location must be an absolute path\n"), progname);
exit_nicely();
}
/* check if the specified xlog directory is empty */ /* check if the specified xlog directory is empty */
switch (check_data_dir(xlog_dir)) switch (check_data_dir(xlog_dir))
...@@ -3021,9 +3026,7 @@ main(int argc, char *argv[]) ...@@ -3021,9 +3026,7 @@ main(int argc, char *argv[])
exit_nicely(); exit_nicely();
} }
else else
{
check_ok(); check_ok();
}
made_new_xlogdir = true; made_new_xlogdir = true;
break; break;
...@@ -3053,7 +3056,7 @@ main(int argc, char *argv[]) ...@@ -3053,7 +3056,7 @@ main(int argc, char *argv[])
_("If you want to store the transaction log there, either\n" _("If you want to store the transaction log there, either\n"
"remove or empty the directory \"%s\".\n"), "remove or empty the directory \"%s\".\n"),
xlog_dir); xlog_dir);
exit(1); /* no further message needed */ exit_nicely();
default: default:
/* Trouble accessing directory */ /* Trouble accessing directory */
...@@ -3062,6 +3065,10 @@ main(int argc, char *argv[]) ...@@ -3062,6 +3065,10 @@ main(int argc, char *argv[])
exit_nicely(); exit_nicely();
} }
/* form name of the place where the symlink must go */
linkloc = (char *) pg_malloc(strlen(pg_data) + 8 + 1);
sprintf(linkloc, "%s/pg_xlog", pg_data);
#ifdef HAVE_SYMLINK #ifdef HAVE_SYMLINK
if (symlink(xlog_dir, linkloc) != 0) if (symlink(xlog_dir, linkloc) != 0)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment