On Tue, Sep 28, 2021 at 12:41:40PM +0900, Michael Paquier wrote: > Am I missing something obvious? One thing that we could do here is > to do the parsing with pg_lltoa() while printing the argument with > INT64_FORMAT, no?
I wrote that a bit too quickly. After looking at it, what we could use to parse the handle pointer is scanint8() instead, even if that's a bit ugly. I also found the code a bit confused regarding "fd", that could be manipulated as an int or intptr_t, so something like the attached should improve the situation. Opinions welcome. -- Michael
diff --git a/src/backend/postmaster/syslogger.c b/src/backend/postmaster/syslogger.c index bca3883572..9e897e5b17 100644 --- a/src/backend/postmaster/syslogger.c +++ b/src/backend/postmaster/syslogger.c @@ -50,6 +50,7 @@ #include "storage/pg_shmem.h" #include "tcop/tcopprot.h" #include "utils/guc.h" +#include "utils/int8.h" #include "utils/ps_status.h" #include "utils/timestamp.h" @@ -759,8 +760,8 @@ syslogger_forkexec(void) strcpy(filenobuf, "-1"); #else /* WIN32 */ if (syslogFile != NULL) - snprintf(filenobuf, sizeof(filenobuf), "%ld", - (long) _get_osfhandle(_fileno(syslogFile))); + snprintf(filenobuf, sizeof(filenobuf), INT64_FORMAT, + (int64) _get_osfhandle(_fileno(syslogFile))); else strcpy(filenobuf, "0"); #endif /* WIN32 */ @@ -774,8 +775,8 @@ syslogger_forkexec(void) strcpy(csvfilenobuf, "-1"); #else /* WIN32 */ if (csvlogFile != NULL) - snprintf(csvfilenobuf, sizeof(csvfilenobuf), "%ld", - (long) _get_osfhandle(_fileno(csvlogFile))); + snprintf(csvfilenobuf, sizeof(csvfilenobuf), INT64_FORMAT, + (int64) _get_osfhandle(_fileno(csvlogFile))); else strcpy(csvfilenobuf, "0"); #endif /* WIN32 */ @@ -795,7 +796,11 @@ syslogger_forkexec(void) static void syslogger_parseArgs(int argc, char *argv[]) { +#ifndef WIN32 int fd; +#else + intptr_t handle; +#endif Assert(argc == 5); argv += 3; @@ -821,20 +826,24 @@ syslogger_parseArgs(int argc, char *argv[]) setvbuf(csvlogFile, NULL, PG_IOLBF, 0); } #else /* WIN32 */ - fd = atoi(*argv++); - if (fd != 0) + (void) scanint8(*argv++, false, (int64 *) &handle); + if (handle != 0) { - fd = _open_osfhandle(fd, _O_APPEND | _O_TEXT); + int fd; + + fd = _open_osfhandle(handle, _O_APPEND | _O_TEXT); if (fd > 0) { syslogFile = fdopen(fd, "a"); setvbuf(syslogFile, NULL, PG_IOLBF, 0); } } - fd = atoi(*argv++); - if (fd != 0) + (void) scanint8(*argv++, false, (int64 *) &handle); + if (handle != 0) { - fd = _open_osfhandle(fd, _O_APPEND | _O_TEXT); + int fd; + + fd = _open_osfhandle(handle, _O_APPEND | _O_TEXT); if (fd > 0) { csvlogFile = fdopen(fd, "a");
signature.asc
Description: PGP signature