diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2016-01-07 18:20:57 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2016-01-07 18:20:57 -0500 |
commit | aa062597c5192fdd758900eb3740a5bd935feda9 (patch) | |
tree | 8a4f4ecb7d9c669f54f35351d8006403ec380fb4 | |
parent | 33b051293a40b138c1ac02cdd1425977977dcd1d (diff) | |
download | postgresql-aa062597c5192fdd758900eb3740a5bd935feda9.tar.gz |
Fix unobvious interaction between -X switch and subdirectory creation.
Turns out the only reason initdb -X worked is that pg_mkdir_p won't
whine if you point it at something that's a symlink to a directory.
Otherwise, the attempt to create pg_xlog/ just like all the other
subdirectories would have failed. Let's be a little more explicit
about what's happening. Oversight in my patch for bug #13853
(mea culpa for not testing -X ...)
-rw-r--r-- | src/bin/initdb/initdb.c | 37 |
1 files changed, 24 insertions, 13 deletions
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c index bd96103c8d..034d54cabb 100644 --- a/src/bin/initdb/initdb.c +++ b/src/bin/initdb/initdb.c @@ -191,7 +191,6 @@ char *restrict_env; #endif static const char *subdirs[] = { "global", - "pg_xlog", "pg_xlog/archive_status", "pg_clog", "pg_dynshmem", @@ -278,7 +277,7 @@ void setup_locale_encoding(void); void setup_signals(void); void setup_text_search(void); void create_data_directory(void); -void create_xlog_symlink(void); +void create_xlog_or_symlink(void); void warn_on_mount_point(int error); void initialize_data_directory(void); @@ -3329,13 +3328,17 @@ create_data_directory(void) } +/* Create transaction log directory, and symlink if required */ void -create_xlog_symlink(void) +create_xlog_or_symlink(void) { - /* Create transaction log symlink, if required */ + char *subdirloc; + + /* form name of the place for the subdirectory or symlink */ + subdirloc = psprintf("%s/pg_xlog", pg_data); + if (strcmp(xlog_dir, "") != 0) { - char *linkloc; int ret; /* clean up xlog directory name, check it's absolute */ @@ -3408,22 +3411,30 @@ create_xlog_symlink(void) exit_nicely(); } - /* form name of the place where the symlink must go */ - linkloc = psprintf("%s/pg_xlog", pg_data); - #ifdef HAVE_SYMLINK - if (symlink(xlog_dir, linkloc) != 0) + if (symlink(xlog_dir, subdirloc) != 0) { fprintf(stderr, _("%s: could not create symbolic link \"%s\": %s\n"), - progname, linkloc, strerror(errno)); + progname, subdirloc, strerror(errno)); exit_nicely(); } #else fprintf(stderr, _("%s: symlinks are not supported on this platform")); exit_nicely(); #endif - free(linkloc); } + else + { + /* Without -X option, just make the subdirectory normally */ + if (mkdir(subdirloc, S_IRWXU) < 0) + { + fprintf(stderr, _("%s: could not create directory \"%s\": %s\n"), + progname, subdirloc, strerror(errno)); + exit_nicely(); + } + } + + free(subdirloc); } @@ -3454,9 +3465,9 @@ initialize_data_directory(void) create_data_directory(); - create_xlog_symlink(); + create_xlog_or_symlink(); - /* Create required subdirectories */ + /* Create required subdirectories (other than pg_xlog) */ printf(_("creating subdirectories ... ")); fflush(stdout); |