mirror of
https://github.com/postgres/postgres.git
synced 2025-08-19 23:22:23 +03:00
Clean up some code, comments and docs referring to Windows 2000 and older
This fixes and updates a couple of comments related to outdated Windows versions. Particularly, src/common/exec.c had a fallback implementation to read a file's line from a pipe because stdin/stdout/stderr does not exist in Windows 2000 that is removed to simplify src/common/ as there are unlikely versions of Postgres running on such platforms. Author: Michael Paquier Reviewed-by: Kyotaro Horiguchi, Juan José Santamaría Flecha Discussion: https://postgr.es/m/20191219021526.GC4202@paquier.xyz
This commit is contained in:
@@ -354,17 +354,11 @@ find_other_exec(const char *argv0, const char *target,
|
||||
|
||||
|
||||
/*
|
||||
* The runtime library's popen() on win32 does not work when being
|
||||
* called from a service when running on windows <= 2000, because
|
||||
* there is no stdin/stdout/stderr.
|
||||
*
|
||||
* Executing a command in a pipe and reading the first line from it
|
||||
* is all we need.
|
||||
* Execute a command in a pipe and read the first line from it.
|
||||
*/
|
||||
static char *
|
||||
pipe_read_line(char *cmd, char *line, int maxsize)
|
||||
{
|
||||
#ifndef WIN32
|
||||
FILE *pgver;
|
||||
|
||||
/* flush output buffers in case popen does not... */
|
||||
@@ -393,130 +387,6 @@ pipe_read_line(char *cmd, char *line, int maxsize)
|
||||
return NULL;
|
||||
|
||||
return line;
|
||||
#else /* WIN32 */
|
||||
|
||||
SECURITY_ATTRIBUTES sattr;
|
||||
HANDLE childstdoutrd,
|
||||
childstdoutwr,
|
||||
childstdoutrddup;
|
||||
PROCESS_INFORMATION pi;
|
||||
STARTUPINFO si;
|
||||
char *retval = NULL;
|
||||
|
||||
sattr.nLength = sizeof(SECURITY_ATTRIBUTES);
|
||||
sattr.bInheritHandle = TRUE;
|
||||
sattr.lpSecurityDescriptor = NULL;
|
||||
|
||||
if (!CreatePipe(&childstdoutrd, &childstdoutwr, &sattr, 0))
|
||||
return NULL;
|
||||
|
||||
if (!DuplicateHandle(GetCurrentProcess(),
|
||||
childstdoutrd,
|
||||
GetCurrentProcess(),
|
||||
&childstdoutrddup,
|
||||
0,
|
||||
FALSE,
|
||||
DUPLICATE_SAME_ACCESS))
|
||||
{
|
||||
CloseHandle(childstdoutrd);
|
||||
CloseHandle(childstdoutwr);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
CloseHandle(childstdoutrd);
|
||||
|
||||
ZeroMemory(&pi, sizeof(pi));
|
||||
ZeroMemory(&si, sizeof(si));
|
||||
si.cb = sizeof(si);
|
||||
si.dwFlags = STARTF_USESTDHANDLES;
|
||||
si.hStdError = childstdoutwr;
|
||||
si.hStdOutput = childstdoutwr;
|
||||
si.hStdInput = INVALID_HANDLE_VALUE;
|
||||
|
||||
if (CreateProcess(NULL,
|
||||
cmd,
|
||||
NULL,
|
||||
NULL,
|
||||
TRUE,
|
||||
0,
|
||||
NULL,
|
||||
NULL,
|
||||
&si,
|
||||
&pi))
|
||||
{
|
||||
/* Successfully started the process */
|
||||
char *lineptr;
|
||||
|
||||
ZeroMemory(line, maxsize);
|
||||
|
||||
/* Try to read at least one line from the pipe */
|
||||
/* This may require more than one wait/read attempt */
|
||||
for (lineptr = line; lineptr < line + maxsize - 1;)
|
||||
{
|
||||
DWORD bytesread = 0;
|
||||
|
||||
/* Let's see if we can read */
|
||||
if (WaitForSingleObject(childstdoutrddup, 10000) != WAIT_OBJECT_0)
|
||||
break; /* Timeout, but perhaps we got a line already */
|
||||
|
||||
if (!ReadFile(childstdoutrddup, lineptr, maxsize - (lineptr - line),
|
||||
&bytesread, NULL))
|
||||
break; /* Error, but perhaps we got a line already */
|
||||
|
||||
lineptr += strlen(lineptr);
|
||||
|
||||
if (!bytesread)
|
||||
break; /* EOF */
|
||||
|
||||
if (strchr(line, '\n'))
|
||||
break; /* One or more lines read */
|
||||
}
|
||||
|
||||
if (lineptr != line)
|
||||
{
|
||||
/* OK, we read some data */
|
||||
int len;
|
||||
|
||||
/* If we got more than one line, cut off after the first \n */
|
||||
lineptr = strchr(line, '\n');
|
||||
if (lineptr)
|
||||
*(lineptr + 1) = '\0';
|
||||
|
||||
len = strlen(line);
|
||||
|
||||
/*
|
||||
* If EOL is \r\n, convert to just \n. Because stdout is a
|
||||
* text-mode stream, the \n output by the child process is
|
||||
* received as \r\n, so we convert it to \n. The server main.c
|
||||
* sets setvbuf(stdout, NULL, _IONBF, 0) which has the effect of
|
||||
* disabling \n to \r\n expansion for stdout.
|
||||
*/
|
||||
if (len >= 2 && line[len - 2] == '\r' && line[len - 1] == '\n')
|
||||
{
|
||||
line[len - 2] = '\n';
|
||||
line[len - 1] = '\0';
|
||||
len--;
|
||||
}
|
||||
|
||||
/*
|
||||
* We emulate fgets() behaviour. So if there is no newline at the
|
||||
* end, we add one...
|
||||
*/
|
||||
if (len == 0 || line[len - 1] != '\n')
|
||||
strcat(line, "\n");
|
||||
|
||||
retval = line;
|
||||
}
|
||||
|
||||
CloseHandle(pi.hProcess);
|
||||
CloseHandle(pi.hThread);
|
||||
}
|
||||
|
||||
CloseHandle(childstdoutwr);
|
||||
CloseHandle(childstdoutrddup);
|
||||
|
||||
return retval;
|
||||
#endif /* WIN32 */
|
||||
}
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user