*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/postmaster/syslogger.c,v 1.3 2004/08/06 16:06:59 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/syslogger.c,v 1.4 2004/08/06 19:17:31 tgl Exp $
*
*-------------------------------------------------------------------------
*/
static pid_t syslogger_forkexec(void);
static void syslogger_parseArgs(int argc, char *argv[]);
#endif
+static void write_syslogger_file_binary(const char *buffer, int count);
#ifdef WIN32
static unsigned int __stdcall pipeThread(void *arg);
#endif
}
else if (bytesRead > 0)
{
- write_syslogger_file(logbuffer, bytesRead);
+ write_syslogger_file_binary(logbuffer, bytesRead);
continue;
}
else
close(syslogPipe[1]);
syslogPipe[1] = -1;
#else
+ int fd;
+
fflush(stderr);
- if (dup2(_open_osfhandle((long)syslogPipe[1],
- _O_APPEND | _O_TEXT),
- _fileno(stderr)) < 0)
+ 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;
if (fd != 0)
{
fd = _open_osfhandle(fd, _O_APPEND);
- if (fd != 0)
+ if (fd > 0)
{
syslogFile = fdopen(fd, "a");
setvbuf(syslogFile, NULL, LBF_MODE, 0);
*/
/*
- * Write to the currently open logfile
+ * Write text to the currently open logfile
*
* This is exported so that elog.c can call it when am_syslogger is true.
* This allows the syslogger process to record elog messages of its own,
*/
void
write_syslogger_file(const char *buffer, int count)
+{
+#ifdef WIN32
+ /*
+ * On Windows we need to do our own newline-to-CRLF translation.
+ */
+ char convbuf[256];
+ char *p;
+ int n;
+
+ p = convbuf;
+ n = 0;
+ while (count-- > 0)
+ {
+ if (*buffer == '\n')
+ {
+ *p++ = '\r';
+ n++;
+ }
+ *p++ = *buffer++;
+ n++;
+ if (n >= sizeof(convbuf) - 1)
+ {
+ write_syslogger_file_binary(convbuf, n);
+ p = convbuf;
+ n = 0;
+ }
+ }
+ if (n > 0)
+ write_syslogger_file_binary(convbuf, n);
+#else /* !WIN32 */
+ write_syslogger_file_binary(buffer, count);
+#endif
+}
+
+/*
+ * Write binary data to the currently open logfile
+ *
+ * On Windows the data arriving in the pipe already has CR/LF newlines,
+ * so we must send it to the file without further translation.
+ */
+static void
+write_syslogger_file_binary(const char *buffer, int count)
{
int rc;
errmsg("could not read from logger pipe: %m")));
}
else if (bytesRead > 0)
- write_syslogger_file(logbuffer, bytesRead);
+ write_syslogger_file_binary(logbuffer, bytesRead);
}
/* We exit the above loop only upon detecting pipe EOF */