diff options
author | Andrew Dunstan <andrew@dunslane.net> | 2007-08-02 23:18:47 +0000 |
---|---|---|
committer | Andrew Dunstan <andrew@dunslane.net> | 2007-08-02 23:18:47 +0000 |
commit | 6c77d7d73b552a489fa262fbca926d6fadfa3fc8 (patch) | |
tree | d364fd1fab42e34e2c52f7afb8d7b2f86b787642 /src | |
parent | cbf8f8282478b5d53bbe36977dea3f1dcf24ca42 (diff) | |
download | postgresql-6c77d7d73b552a489fa262fbca926d6fadfa3fc8.tar.gz postgresql-6c77d7d73b552a489fa262fbca926d6fadfa3fc8.zip |
Make sure syslogPipe runs in binary mode on Windows to avoid corrupting the pipe chunking protocol. Backport to 8.0
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/postmaster/postmaster.c | 11 | ||||
-rw-r--r-- | src/backend/postmaster/syslogger.c | 25 |
2 files changed, 32 insertions, 4 deletions
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index 9bf5acbd5bc..8c54471586f 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -37,7 +37,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.475.2.8 2007/07/19 19:14:54 adunstan Exp $ + * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.475.2.9 2007/08/02 23:18:47 adunstan Exp $ * * NOTES * @@ -3205,6 +3205,15 @@ SubPostmasterMain(int argc, char *argv[]) MyProcPid = getpid(); /* reset MyProcPid */ + /* make sure stderr is in binary mode before anything can + * possibly be written to it, in case it's actually the syslogger pipe, + * so the pipe chunking protocol isn't disturbed. Non-logpipe data + * gets translated on redirection (e.g. via pg_ctl -l) anyway. + */ +#ifdef WIN32 + _setmode(fileno(stderr),_O_BINARY); +#endif + /* In EXEC_BACKEND case we will not have inherited these settings */ IsPostmasterEnvironment = true; whereToSendOutput = DestNone; diff --git a/src/backend/postmaster/syslogger.c b/src/backend/postmaster/syslogger.c index 2fb82c252f9..ccee7eca309 100644 --- a/src/backend/postmaster/syslogger.c +++ b/src/backend/postmaster/syslogger.c @@ -18,7 +18,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/postmaster/syslogger.c,v 1.20.2.3 2007/07/19 19:14:54 adunstan Exp $ + * $PostgreSQL: pgsql/src/backend/postmaster/syslogger.c,v 1.20.2.4 2007/08/02 23:18:47 adunstan Exp $ * *------------------------------------------------------------------------- */ @@ -199,6 +199,15 @@ SysLoggerMain(int argc, char *argv[]) close(fd); } + /* Syslogger's own stderr can't be the syslogPipe, so set it back to + * text mode if we didn't just close it. + * (It was set to binary in SubPostmasterMain). + */ +#ifdef WIN32 + else + _setmode(_fileno(stderr),_O_TEXT); +#endif + /* * Also close our copy of the write end of the pipe. This is needed to * ensure we can detect pipe EOF correctly. (But note that in the restart @@ -522,14 +531,20 @@ SysLogger_Start(void) #else int fd; + /* + * open the pipe in binary mode and make sure + * stderr is binary after it's been dup'ed into, to avoid + * disturbing the pipe chunking protocol. + */ fflush(stderr); fd = _open_osfhandle((long) syslogPipe[1], - _O_APPEND | _O_TEXT); + _O_APPEND | _O_BINARY); if (dup2(fd, _fileno(stderr)) < 0) ereport(FATAL, (errcode_for_file_access(), errmsg("could not redirect stderr: %m"))); close(fd); + _setmode(_fileno(stderr),_O_BINARY); /* Now we are done with the write end of the pipe. */ CloseHandle(syslogPipe[1]); syslogPipe[1] = 0; @@ -617,7 +632,7 @@ syslogger_parseArgs(int argc, char *argv[]) fd = atoi(*argv++); if (fd != 0) { - fd = _open_osfhandle(fd, _O_APPEND); + fd = _open_osfhandle(fd, _O_APPEND | _O_TEXT); if (fd > 0) { syslogFile = fdopen(fd, "a"); @@ -1022,6 +1037,10 @@ logfile_rotate(bool time_based_rotation) setvbuf(fh, NULL, LBF_MODE, 0); +#ifdef WIN32 + _setmode(_fileno(fh), _O_TEXT); /* use CRLF line endings on Windows */ +#endif + /* On Windows, need to interlock against data-transfer thread */ #ifdef WIN32 EnterCriticalSection(&sysfileSection); |