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

Reply via email to