summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBruce Momjian2011-07-24 05:42:45 +0000
committerBruce Momjian2011-07-24 05:43:57 +0000
commit081a5518c0a7dcccfc76a12ae9d593648b68ce53 (patch)
tree924aa7eeb05c3953c23e3993823077833c660b93
parente399eb74d96270bf1d4a0bb9f4503cac3d90c1e2 (diff)
In pg_upgrade on Windows, check if the directory is writable by actually
creating and removing a file because access() doesn't work on that platform. Backpatch to 9.1 where this check was added.
-rw-r--r--contrib/pg_upgrade/exec.c41
1 files changed, 32 insertions, 9 deletions
diff --git a/contrib/pg_upgrade/exec.c b/contrib/pg_upgrade/exec.c
index a76c06e302..3493696f92 100644
--- a/contrib/pg_upgrade/exec.c
+++ b/contrib/pg_upgrade/exec.c
@@ -16,6 +16,9 @@
static void check_data_dir(const char *pg_data);
static void check_bin_dir(ClusterInfo *cluster);
static void validate_exec(const char *dir, const char *cmdName);
+#ifdef WIN32
+static int win32_check_directory_write_permissions(void);
+#endif
/*
@@ -97,17 +100,11 @@ verify_directories(void)
prep_status("Checking current, bin, and data directories");
- if (access(".", R_OK | W_OK
#ifndef WIN32
-
- /*
- * Do a directory execute check only on Unix because execute permission on
- * NTFS means "can execute scripts", which we don't care about. Also, X_OK
- * is not defined in the Windows API.
- */
- | X_OK
+ if (access(".", R_OK | W_OK | X_OK) != 0)
+#else
+ if (win32_check_directory_write_permissions() != 0)
#endif
- ) != 0)
pg_log(PG_FATAL,
"You must have read and write access in the current directory.\n");
@@ -119,6 +116,32 @@ verify_directories(void)
}
+#ifdef WIN32
+/*
+ * win32_check_directory_write_permissions()
+ *
+ * access() on WIN32 can't check directory permissions, so we have to
+ * optionally create, then delete a file to check.
+ * http://msdn.microsoft.com/en-us/library/1w06ktdy%28v=vs.80%29.aspx
+ */
+static int
+win32_check_directory_write_permissions(void)
+{
+ int fd;
+
+ /*
+ * We open a file we would normally create anyway. We do this even in
+ * 'check' mode, which isn't ideal, but this is the best we can do.
+ */
+ if ((fd = open(GLOBALS_DUMP_FILE, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR)) < 0)
+ return -1;
+ close(fd);
+
+ return unlink(GLOBALS_DUMP_FILE);
+}
+#endif
+
+
/*
* check_data_dir()
*