Commit 081a5518 authored by Bruce Momjian's avatar Bruce Momjian

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.
parent e399eb74
...@@ -16,6 +16,9 @@ ...@@ -16,6 +16,9 @@
static void check_data_dir(const char *pg_data); static void check_data_dir(const char *pg_data);
static void check_bin_dir(ClusterInfo *cluster); static void check_bin_dir(ClusterInfo *cluster);
static void validate_exec(const char *dir, const char *cmdName); 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) ...@@ -97,17 +100,11 @@ verify_directories(void)
prep_status("Checking current, bin, and data directories"); prep_status("Checking current, bin, and data directories");
if (access(".", R_OK | W_OK
#ifndef WIN32 #ifndef WIN32
if (access(".", R_OK | W_OK | X_OK) != 0)
/* #else
* Do a directory execute check only on Unix because execute permission on if (win32_check_directory_write_permissions() != 0)
* NTFS means "can execute scripts", which we don't care about. Also, X_OK
* is not defined in the Windows API.
*/
| X_OK
#endif #endif
) != 0)
pg_log(PG_FATAL, pg_log(PG_FATAL,
"You must have read and write access in the current directory.\n"); "You must have read and write access in the current directory.\n");
...@@ -119,6 +116,32 @@ verify_directories(void) ...@@ -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() * check_data_dir()
* *
......
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