win32-open-mode-v1.patch
text/x-diff
Filename: win32-open-mode-v1.patch
Type: text/x-diff
Part: 0
Patch
Format: unified
Series: patch v1
| File | + | − |
|---|---|---|
| src/bin/initdb/initdb.c | 0 | 8 |
| src/port/open.c | 22 | 0 |
diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.c
index b53d6eb9cc..cb8c7450d9 100644
--- a/src/bin/initdb/initdb.c
+++ b/src/bin/initdb/initdb.c
@@ -491,15 +491,7 @@ readfile(const char *path)
char *buffer;
int c;
-#ifdef WIN32
- /*
- * On Windows, we have to open the file in text mode so that carriage
- * returns are stripped.
- */
- if ((infile = fopen(path, "rt")) == NULL)
-#else
if ((infile = fopen(path, "r")) == NULL)
-#endif
{
fprintf(stderr, _("%s: could not open file \"%s\" for reading: %s\n"),
progname, path, strerror(errno));
diff --git a/src/port/open.c b/src/port/open.c
index a3ad946a60..f7a296ef28 100644
--- a/src/port/open.c
+++ b/src/port/open.c
@@ -71,6 +71,28 @@ pgwin32_open(const char *fileName, int fileFlags,...)
_O_SHORT_LIVED | O_DSYNC | O_DIRECT |
(O_CREAT | O_TRUNC | O_EXCL) | (O_TEXT | O_BINARY))) == fileFlags);
+ /*
+ * If caller has set neither O_BINARY nor O_TEXT, then look for what
+ * the default mode is for this process, then enforce it.
+ */
+ if ((fileFlags & (O_BINARY | O_TEXT)) == 0)
+ {
+ int pmode = 0;
+
+ /* only MSVC newer than 2015 support _get_fmode */
+#if (_MSC_VER >= 1900)
+ if (_get_fmode(&pmode) < 0)
+ {
+ /* get_fmode sets errno */
+ return -1;
+ }
+#else
+ pmode = _fmode;
+#endif
+
+ fileFlags |= pmode;
+ }
+
sa.nLength = sizeof(sa);
sa.bInheritHandle = TRUE;
sa.lpSecurityDescriptor = NULL;