aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/misc.c
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2020-07-09 16:02:23 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2020-07-09 16:02:23 -0400
commit183926da3162b1807904710e46882c004beff5fb (patch)
tree0cd05e8f60ebe400b95d30f800e826b07ff9edcf /src/backend/utils/adt/misc.c
parentffb4cee43bdccb54f0cf072a51dedc74e343b6f1 (diff)
downloadpostgresql-183926da3162b1807904710e46882c004beff5fb.tar.gz
postgresql-183926da3162b1807904710e46882c004beff5fb.zip
Fix pg_current_logfile() to not emit a carriage return on Windows.
Due to not having our signals straight about CRLF vs. LF line termination, the output of pg_current_logfile() included a trailing \r on Windows. To fix, force the file descriptor it uses into text mode. While here, move a couple of local variable declarations to make the function's logic clearer. In v12 and v13, also back-patch the test added by 1c4e88e2f so that this function has some test coverage. However, the 004_logrotate.pl test script doesn't exist before v12, and it didn't seem worth adding to older branches just for this. Per report from Thomas Kellerer. Back-patch to v10 where this function was added. Discussion: https://postgr.es/m/412ae8da-76bb-640f-039a-f3513499e53d@gmx.net
Diffstat (limited to 'src/backend/utils/adt/misc.c')
-rw-r--r--src/backend/utils/adt/misc.c19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/backend/utils/adt/misc.c b/src/backend/utils/adt/misc.c
index ee340fb0f02..37c23c9155a 100644
--- a/src/backend/utils/adt/misc.c
+++ b/src/backend/utils/adt/misc.c
@@ -16,6 +16,7 @@
#include <sys/file.h>
#include <dirent.h>
+#include <fcntl.h>
#include <math.h>
#include <unistd.h>
@@ -738,9 +739,6 @@ pg_current_logfile(PG_FUNCTION_ARGS)
FILE *fd;
char lbuffer[MAXPGPATH];
char *logfmt;
- char *log_filepath;
- char *log_format = lbuffer;
- char *nlpos;
/* The log format parameter is optional */
if (PG_NARGS() == 0 || PG_ARGISNULL(0))
@@ -767,16 +765,23 @@ pg_current_logfile(PG_FUNCTION_ARGS)
PG_RETURN_NULL();
}
+#ifdef WIN32
+ /* syslogger.c writes CRLF line endings on Windows */
+ _setmode(_fileno(fd), _O_TEXT);
+#endif
+
/*
* Read the file to gather current log filename(s) registered by the
* syslogger.
*/
while (fgets(lbuffer, sizeof(lbuffer), fd) != NULL)
{
- /*
- * Extract log format and log file path from the line; lbuffer ==
- * log_format, they share storage.
- */
+ char *log_format;
+ char *log_filepath;
+ char *nlpos;
+
+ /* Extract log format and log file path from the line. */
+ log_format = lbuffer;
log_filepath = strchr(lbuffer, ' ');
if (log_filepath == NULL)
{