aboutsummaryrefslogtreecommitdiff
path: root/src/bin/pg_dump/dumputils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/bin/pg_dump/dumputils.c')
-rw-r--r--src/bin/pg_dump/dumputils.c36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/bin/pg_dump/dumputils.c b/src/bin/pg_dump/dumputils.c
index ab0e9e6da3c..73ce34346b2 100644
--- a/src/bin/pg_dump/dumputils.c
+++ b/src/bin/pg_dump/dumputils.c
@@ -16,6 +16,8 @@
#include <ctype.h>
+#include "common/file_perm.h"
+#include "common/logging.h"
#include "dumputils.h"
#include "fe_utils/string_utils.h"
@@ -884,3 +886,37 @@ makeAlterConfigCommand(PGconn *conn, const char *configitem,
pg_free(mine);
}
+
+/*
+ * create_or_open_dir
+ *
+ * This will create a new directory with the given dirname. If there is
+ * already an empty directory with that name, then use it.
+ */
+void
+create_or_open_dir(const char *dirname)
+{
+ int ret;
+
+ switch ((ret = pg_check_dir(dirname)))
+ {
+ case -1:
+ /* opendir failed but not with ENOENT */
+ pg_fatal("could not open directory \"%s\": %m", dirname);
+ break;
+ case 0:
+ /* directory does not exist */
+ if (mkdir(dirname, pg_dir_create_mode) < 0)
+ pg_fatal("could not create directory \"%s\": %m", dirname);
+ break;
+ case 1:
+ /* exists and is empty, fix perms */
+ if (chmod(dirname, pg_dir_create_mode) != 0)
+ pg_fatal("could not change permissions of directory \"%s\": %m",
+ dirname);
+ break;
+ default:
+ /* exists and is not empty */
+ pg_fatal("directory \"%s\" is not empty", dirname);
+ }
+}