aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/bin/initdb/initdb.c49
1 files changed, 22 insertions, 27 deletions
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index feeff9e864f..862751e5e59 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -199,6 +199,7 @@ static const char *subdirs[] = {
"pg_snapshots",
"pg_subtrans",
"pg_twophase",
+ "pg_multixact",
"pg_multixact/members",
"pg_multixact/offsets",
"base",
@@ -236,7 +237,6 @@ static FILE *popen_check(const char *command, const char *mode);
static void exit_nicely(void);
static char *get_id(void);
static char *get_encoding_id(char *encoding_name);
-static bool mkdatadir(const char *subdir);
static void set_input(char **dest, char *filename);
static void check_input(char *path);
static void write_version_file(char *extrapath);
@@ -925,29 +925,6 @@ find_matching_ts_config(const char *lc_type)
/*
- * make the data directory (or one of its subdirectories if subdir is not NULL)
- */
-static bool
-mkdatadir(const char *subdir)
-{
- char *path;
-
- if (subdir)
- path = psprintf("%s/%s", pg_data, subdir);
- else
- path = pg_strdup(pg_data);
-
- if (pg_mkdir_p(path, S_IRWXU) == 0)
- return true;
-
- fprintf(stderr, _("%s: could not create directory \"%s\": %s\n"),
- progname, path, strerror(errno));
-
- return false;
-}
-
-
-/*
* set name of given input file variable under data directory
*/
static void
@@ -3134,8 +3111,12 @@ create_data_directory(void)
pg_data);
fflush(stdout);
- if (!mkdatadir(NULL))
+ if (pg_mkdir_p(pg_data, S_IRWXU) != 0)
+ {
+ fprintf(stderr, _("%s: could not create directory \"%s\": %s\n"),
+ progname, pg_data, strerror(errno));
exit_nicely();
+ }
else
check_ok();
@@ -3317,10 +3298,24 @@ initialize_data_directory(void)
printf(_("creating subdirectories ... "));
fflush(stdout);
- for (i = 0; i < (sizeof(subdirs) / sizeof(char *)); i++)
+ for (i = 0; i < lengthof(subdirs); i++)
{
- if (!mkdatadir(subdirs[i]))
+ char *path;
+
+ path = psprintf("%s/%s", pg_data, subdirs[i]);
+
+ /*
+ * The parent directory already exists, so we only need mkdir() not
+ * pg_mkdir_p() here, which avoids some failure modes; cf bug #13853.
+ */
+ if (mkdir(path, S_IRWXU) < 0)
+ {
+ fprintf(stderr, _("%s: could not create directory \"%s\": %s\n"),
+ progname, path, strerror(errno));
exit_nicely();
+ }
+
+ free(path);
}
check_ok();