From: Michael Paquier <michael@paquier.xyz>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: pgsql-hackers@lists.postgresql.org
Subject: Re: pgsql: Allow concurrent-safe open() and fopen() in frontend code for Wi
Date: Tue, 18 Sep 2018 11:42:27 +0900
Message-ID: <20180918024227.GI31460@paquier.xyz> (raw)
In-Reply-To: <20180918001143.GG31460@paquier.xyz>
References: <23543.1536938575@sss.pgh.pa.us>
<20180914224939.GA1178@paquier.xyz>
<20180917114113.GA31460@paquier.xyz>
<17194.1537191697@sss.pgh.pa.us>
<20180917140202.GF31460@paquier.xyz>
<19655.1537195712@sss.pgh.pa.us>
<f62917d5-cc77-c6ac-847f-44f922ccdd97@2ndQuadrant.com>
<3883.1537200836@sss.pgh.pa.us>
<11148.1537227504@sss.pgh.pa.us>
<20180918001143.GG31460@paquier.xyz>
On Tue, Sep 18, 2018 at 09:11:43AM +0900, Michael Paquier wrote:
> What I think I broke is that CreateFile ignores what _fmode uses, which
> has caused the breakage, while calling directly open() or fopen() does
> the work. There are also other things assuming that binary mode is
> used, you can grep for "setmode" and see how miscinit.c or pg_basebackup
> do the job.
I have been playing with this stuff, and hacked the attached. Now, while
TAP tests of initdb and pgbench are happy (I can actually see the past
failure as well), pg_dump complains at authentication time when using
plain-text mode when using databases with all ASCII characters. That's
not something I expected first, but _get_fmode also influences
operations like pipe(), which is something that pg_dump uses, and
setmode is enforced to binary mode only when adapted.
I am getting to wonder if what's present on HEAD represents actually the
best deal we could get. Attached is the patch I used for reference.
Thoughts?
--
Michael
Attachments:
[text/x-diff] win32-open-mode-v1.patch (1.4K, ../20180918024227.GI31460@paquier.xyz/2-win32-open-mode-v1.patch)
download | inline diff:diff --git a/src/bin/initdb/initdb.c b/src/bin/initdb/initdb.cindex 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.cindex 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;
[application/pgp-signature] signature.asc (832B, ../20180918024227.GI31460@paquier.xyz/3-signature.asc)
download
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: pgsql-committers@postgresql.org
Cc: michael@paquier.xyz, tgl@sss.pgh.pa.us, pgsql-hackers@lists.postgresql.org
Subject: Re: pgsql: Allow concurrent-safe open() and fopen() in frontend code for Wi
In-Reply-To: <20180918024227.GI31460@paquier.xyz>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by DDX for PostgreSQL; see mirroring instructions
for how to clone and mirror all data and code used for this inbox