/rtmp/pg_upgrade.diff
text/x-diff
Filename: /rtmp/pg_upgrade.diff
Type: text/x-diff
Part: 0
diff --git a/contrib/pg_upgrade/exec.c b/contrib/pg_upgrade/exec.c
new file mode 100644
index a76c06e..3493696
*** a/contrib/pg_upgrade/exec.c
--- b/contrib/pg_upgrade/exec.c
***************
*** 16,21 ****
--- 16,24 ----
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
/*
*************** verify_directories(void)
*** 97,113 ****
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
#endif
- ) != 0)
pg_log(PG_FATAL,
"You must have read and write access in the current directory.\n");
--- 100,110 ----
prep_status("Checking current, bin, and data directories");
#ifndef WIN32
! if (access(".", R_OK | W_OK | X_OK) != 0)
! #else
! if (win32_check_directory_write_permissions() != 0)
#endif
pg_log(PG_FATAL,
"You must have read and write access in the current directory.\n");
*************** verify_directories(void)
*** 119,124 ****
--- 116,147 ----
}
+ #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()
*