Tom Lane wrote:
Andrew Dunstan <[EMAIL PROTECTED]> writes:
This small patch makes the syslog pipe use binary mode on Windows
You need to think harder about where you are inserting the additions,
as these choices seem a bit random.
Is this more to your taste?
cheers
andrew
Index: src/backend/postmaster/postmaster.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v
retrieving revision 1.535
diff -c -r1.535 postmaster.c
*** src/backend/postmaster/postmaster.c 24 Jul 2007 04:54:09 -0000 1.535
--- src/backend/postmaster/postmaster.c 30 Jul 2007 15:52:57 -0000
***************
*** 3385,3390 ****
--- 3385,3399 ----
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
+
/* Lose the postmaster's on-exit routines (really a no-op) */
on_exit_reset();
***************
*** 3396,3401 ****
--- 3405,3412 ----
MemoryContextInit();
InitializeGUCOptions();
+
+
/* Read in the variables file */
memset(&port, 0, sizeof(Port));
read_backend_variables(argv[2], &port);
Index: src/backend/postmaster/syslogger.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/postmaster/syslogger.c,v
retrieving revision 1.33
diff -c -r1.33 syslogger.c
*** src/backend/postmaster/syslogger.c 19 Jul 2007 19:13:43 -0000 1.33
--- src/backend/postmaster/syslogger.c 30 Jul 2007 15:52:57 -0000
***************
*** 194,199 ****
--- 194,208 ----
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
***************
*** 531,544 ****
#else
int fd;
fflush(stderr);
fd = _open_osfhandle((long) syslogPipe[1],
! _O_APPEND | _O_TEXT);
if (dup2(fd, _fileno(stderr)) < 0)
ereport(FATAL,
(errcode_for_file_access(),
errmsg("could not redirect stderr: %m")));
close(fd);
/* Now we are done with the write end of the pipe. */
CloseHandle(syslogPipe[1]);
syslogPipe[1] = 0;
--- 540,559 ----
#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_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;
***************
*** 626,632 ****
fd = atoi(*argv++);
if (fd != 0)
{
! fd = _open_osfhandle(fd, _O_APPEND);
if (fd > 0)
{
syslogFile = fdopen(fd, "a");
--- 641,647 ----
fd = atoi(*argv++);
if (fd != 0)
{
! fd = _open_osfhandle(fd, _O_APPEND | _O_TEXT);
if (fd > 0)
{
syslogFile = fdopen(fd, "a");
***************
*** 988,993 ****
--- 1003,1012 ----
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);
---------------------------(end of broadcast)---------------------------
TIP 7: You can help support the PostgreSQL project by donating at
http://www.postgresql.org/about/donate