Cleanups and hopefully now it works on all windows platforms
This commit is contained in:
parent
6672c295c7
commit
a7692d84f0
|
@ -61,25 +61,6 @@ bool cmWin32ProcessExecution::Wait(int timeout)
|
||||||
return this->PrivateClose(timeout);
|
return this->PrivateClose(timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
#define PERROR(str) //::ErrorMessage(__LINE__, str)
|
|
||||||
static void ErrorMessage(int line, char *str) //display detailed error info
|
|
||||||
{
|
|
||||||
DWORD lastmsg = GetLastError();
|
|
||||||
LPVOID msg;
|
|
||||||
FormatMessage(
|
|
||||||
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
|
|
||||||
NULL,
|
|
||||||
lastmsg,
|
|
||||||
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
|
|
||||||
(LPTSTR) &msg,
|
|
||||||
0,
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
printf("%d - %s: %s (%d)\n",line,str,msg, lastmsg);
|
|
||||||
LocalFree(msg);
|
|
||||||
::SetLastError(ERROR_SUCCESS);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Internal dictionary mapping popen* file pointers to process handles,
|
* Internal dictionary mapping popen* file pointers to process handles,
|
||||||
* for use when retrieving the process exit code. See _PyPclose() below
|
* for use when retrieving the process exit code. See _PyPclose() below
|
||||||
|
@ -95,25 +76,18 @@ static BOOL RealPopenCreateProcess(const char *cmdstring,
|
||||||
HANDLE hStderr,
|
HANDLE hStderr,
|
||||||
HANDLE *hProcess)
|
HANDLE *hProcess)
|
||||||
{
|
{
|
||||||
PERROR("Start");
|
|
||||||
//std::cout << "Run: " << cmdstring << std::endl;
|
|
||||||
PERROR("Start");
|
|
||||||
PROCESS_INFORMATION piProcInfo;
|
PROCESS_INFORMATION piProcInfo;
|
||||||
PERROR("PROCESS_INFORMATION");
|
|
||||||
STARTUPINFO siStartInfo;
|
STARTUPINFO siStartInfo;
|
||||||
PERROR("STARTUPINFO");
|
|
||||||
char *s1,*s2, *s3 = " /c ";
|
char *s1,*s2, *s3 = " /c ";
|
||||||
int i;
|
int i;
|
||||||
int x;
|
int x;
|
||||||
if (i = GetEnvironmentVariable("COMSPEC",NULL,0))
|
if (i = GetEnvironmentVariable("COMSPEC",NULL,0))
|
||||||
{
|
{
|
||||||
PERROR("GetEnvironmentVariable");
|
|
||||||
char *comshell;
|
char *comshell;
|
||||||
|
|
||||||
s1 = (char *)_alloca(i);
|
s1 = (char *)_alloca(i);
|
||||||
if (!(x = GetEnvironmentVariable("COMSPEC", s1, i)))
|
if (!(x = GetEnvironmentVariable("COMSPEC", s1, i)))
|
||||||
{
|
{
|
||||||
PERROR("GetEnvironmentVariable");
|
|
||||||
return x;
|
return x;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,8 +107,6 @@ static BOOL RealPopenCreateProcess(const char *cmdstring,
|
||||||
s2 = (char *)_alloca(x);
|
s2 = (char *)_alloca(x);
|
||||||
ZeroMemory(s2, x);
|
ZeroMemory(s2, x);
|
||||||
sprintf(s2, "%s%s%s", s1, s3, cmdstring);
|
sprintf(s2, "%s%s%s", s1, s3, cmdstring);
|
||||||
//std::cout << "s1: " << s1 << " s2: " << s2 << " s3: " << s3
|
|
||||||
// << std::endl;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -156,9 +128,9 @@ static BOOL RealPopenCreateProcess(const char *cmdstring,
|
||||||
-strlen(modulepath));
|
-strlen(modulepath));
|
||||||
if (stat(modulepath, &statinfo) != 0)
|
if (stat(modulepath, &statinfo) != 0)
|
||||||
{
|
{
|
||||||
/* Eeek - file-not-found - possibly an embedding
|
/* Eeek - file-not-found - possibly an embedding
|
||||||
situation - see if we can locate it in sys.prefix
|
situation - see if we can locate it in sys.prefix
|
||||||
*/
|
*/
|
||||||
strncpy(modulepath,
|
strncpy(modulepath,
|
||||||
".",
|
".",
|
||||||
sizeof(modulepath)/sizeof(modulepath[0]));
|
sizeof(modulepath)/sizeof(modulepath[0]));
|
||||||
|
@ -177,7 +149,7 @@ static BOOL RealPopenCreateProcess(const char *cmdstring,
|
||||||
if (stat(modulepath, &statinfo) != 0)
|
if (stat(modulepath, &statinfo) != 0)
|
||||||
{
|
{
|
||||||
std::cout
|
std::cout
|
||||||
<< "Can not locate '" << szConsoleSpawn
|
<< "Can not locate '" << modulepath
|
||||||
<< "' which is needed "
|
<< "' which is needed "
|
||||||
"for popen to work with your shell "
|
"for popen to work with your shell "
|
||||||
"or platform." << std::endl;
|
"or platform." << std::endl;
|
||||||
|
@ -197,6 +169,11 @@ static BOOL RealPopenCreateProcess(const char *cmdstring,
|
||||||
s1,
|
s1,
|
||||||
s3,
|
s3,
|
||||||
cmdstring);
|
cmdstring);
|
||||||
|
sprintf(
|
||||||
|
s2,
|
||||||
|
"%s \"%s\"",
|
||||||
|
modulepath,
|
||||||
|
cmdstring);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -228,10 +205,8 @@ static BOOL RealPopenCreateProcess(const char *cmdstring,
|
||||||
&siStartInfo,
|
&siStartInfo,
|
||||||
&piProcInfo) )
|
&piProcInfo) )
|
||||||
{
|
{
|
||||||
PERROR("CreateProcess");
|
|
||||||
/* Close the handles now so anyone waiting is woken. */
|
/* Close the handles now so anyone waiting is woken. */
|
||||||
CloseHandle(piProcInfo.hThread);
|
CloseHandle(piProcInfo.hThread);
|
||||||
PERROR("Close Handle");
|
|
||||||
/* Return process handle */
|
/* Return process handle */
|
||||||
*hProcess = piProcInfo.hProcess;
|
*hProcess = piProcInfo.hProcess;
|
||||||
//std::cout << "Process created..." << std::endl;
|
//std::cout << "Process created..." << std::endl;
|
||||||
|
@ -265,7 +240,6 @@ bool cmWin32ProcessExecution::PrivateOpen(const char *cmdstring,
|
||||||
{
|
{
|
||||||
return win32_error("CreatePipe", NULL);
|
return win32_error("CreatePipe", NULL);
|
||||||
}
|
}
|
||||||
PERROR("CreatePipe");
|
|
||||||
|
|
||||||
/* Create new output read handle and the input write handle. Set
|
/* Create new output read handle and the input write handle. Set
|
||||||
* the inheritance properties to FALSE. Otherwise, the child inherits
|
* the inheritance properties to FALSE. Otherwise, the child inherits
|
||||||
|
@ -277,13 +251,11 @@ bool cmWin32ProcessExecution::PrivateOpen(const char *cmdstring,
|
||||||
DUPLICATE_SAME_ACCESS);
|
DUPLICATE_SAME_ACCESS);
|
||||||
if (!fSuccess)
|
if (!fSuccess)
|
||||||
return win32_error("DuplicateHandle", NULL);
|
return win32_error("DuplicateHandle", NULL);
|
||||||
PERROR("DuplicateHandle");
|
|
||||||
|
|
||||||
|
|
||||||
/* Close the inheritable version of ChildStdin
|
/* Close the inheritable version of ChildStdin
|
||||||
that we're using. */
|
that we're using. */
|
||||||
CloseHandle(hChildStdinWr);
|
CloseHandle(hChildStdinWr);
|
||||||
PERROR("CloseHandle");
|
|
||||||
|
|
||||||
if (!CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0))
|
if (!CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0))
|
||||||
return win32_error("CreatePipe", NULL);
|
return win32_error("CreatePipe", NULL);
|
||||||
|
@ -293,18 +265,15 @@ bool cmWin32ProcessExecution::PrivateOpen(const char *cmdstring,
|
||||||
FALSE, DUPLICATE_SAME_ACCESS);
|
FALSE, DUPLICATE_SAME_ACCESS);
|
||||||
if (!fSuccess)
|
if (!fSuccess)
|
||||||
return win32_error("DuplicateHandle", NULL);
|
return win32_error("DuplicateHandle", NULL);
|
||||||
PERROR("DuplicateHandle");
|
|
||||||
|
|
||||||
/* Close the inheritable version of ChildStdout
|
/* Close the inheritable version of ChildStdout
|
||||||
that we're using. */
|
that we're using. */
|
||||||
CloseHandle(hChildStdoutRd);
|
CloseHandle(hChildStdoutRd);
|
||||||
PERROR("CloseHandle");
|
|
||||||
|
|
||||||
if (n != POPEN_4)
|
if (n != POPEN_4)
|
||||||
{
|
{
|
||||||
if (!CreatePipe(&hChildStderrRd, &hChildStderrWr, &saAttr, 0))
|
if (!CreatePipe(&hChildStderrRd, &hChildStderrWr, &saAttr, 0))
|
||||||
return win32_error("CreatePipe", NULL);
|
return win32_error("CreatePipe", NULL);
|
||||||
PERROR("CreatePipe");
|
|
||||||
fSuccess = DuplicateHandle(GetCurrentProcess(),
|
fSuccess = DuplicateHandle(GetCurrentProcess(),
|
||||||
hChildStderrRd,
|
hChildStderrRd,
|
||||||
GetCurrentProcess(),
|
GetCurrentProcess(),
|
||||||
|
@ -312,10 +281,9 @@ bool cmWin32ProcessExecution::PrivateOpen(const char *cmdstring,
|
||||||
FALSE, DUPLICATE_SAME_ACCESS);
|
FALSE, DUPLICATE_SAME_ACCESS);
|
||||||
if (!fSuccess)
|
if (!fSuccess)
|
||||||
return win32_error("DuplicateHandle", NULL);
|
return win32_error("DuplicateHandle", NULL);
|
||||||
PERROR("DuplicateHandle");
|
|
||||||
/* Close the inheritable version of ChildStdErr that we're using. */
|
/* Close the inheritable version of ChildStdErr that we're using. */
|
||||||
CloseHandle(hChildStderrRd);
|
CloseHandle(hChildStderrRd);
|
||||||
PERROR("CloseHandle");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (n)
|
switch (n)
|
||||||
|
@ -331,7 +299,6 @@ bool cmWin32ProcessExecution::PrivateOpen(const char *cmdstring,
|
||||||
so close them. */
|
so close them. */
|
||||||
CloseHandle(hChildStdoutRdDup);
|
CloseHandle(hChildStdoutRdDup);
|
||||||
CloseHandle(hChildStderrRdDup);
|
CloseHandle(hChildStderrRdDup);
|
||||||
PERROR("CloseHandle");
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case _O_RDONLY | _O_TEXT:
|
case _O_RDONLY | _O_TEXT:
|
||||||
|
@ -342,7 +309,6 @@ bool cmWin32ProcessExecution::PrivateOpen(const char *cmdstring,
|
||||||
so close them. */
|
so close them. */
|
||||||
CloseHandle(hChildStdinWrDup);
|
CloseHandle(hChildStdinWrDup);
|
||||||
CloseHandle(hChildStderrRdDup);
|
CloseHandle(hChildStderrRdDup);
|
||||||
PERROR("CloseHandle");
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case _O_RDONLY | _O_BINARY:
|
case _O_RDONLY | _O_BINARY:
|
||||||
|
@ -354,7 +320,6 @@ bool cmWin32ProcessExecution::PrivateOpen(const char *cmdstring,
|
||||||
so close them. */
|
so close them. */
|
||||||
CloseHandle(hChildStdinWrDup);
|
CloseHandle(hChildStdinWrDup);
|
||||||
CloseHandle(hChildStderrRdDup);
|
CloseHandle(hChildStderrRdDup);
|
||||||
PERROR("CloseHandle");
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case _O_WRONLY | _O_BINARY:
|
case _O_WRONLY | _O_BINARY:
|
||||||
|
@ -365,7 +330,6 @@ bool cmWin32ProcessExecution::PrivateOpen(const char *cmdstring,
|
||||||
so close them. */
|
so close them. */
|
||||||
CloseHandle(hChildStdoutRdDup);
|
CloseHandle(hChildStdoutRdDup);
|
||||||
CloseHandle(hChildStderrRdDup);
|
CloseHandle(hChildStderrRdDup);
|
||||||
PERROR("CloseHandle");
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -393,12 +357,10 @@ bool cmWin32ProcessExecution::PrivateOpen(const char *cmdstring,
|
||||||
//f1 = _fdopen(fd1, m2);
|
//f1 = _fdopen(fd1, m2);
|
||||||
fd2 = _open_osfhandle(TO_INTPTR(hChildStdoutRdDup), mode);
|
fd2 = _open_osfhandle(TO_INTPTR(hChildStdoutRdDup), mode);
|
||||||
//f2 = _fdopen(fd2, m1);
|
//f2 = _fdopen(fd2, m1);
|
||||||
PERROR("_open_osfhandle");
|
|
||||||
|
|
||||||
if (n != 4)
|
if (n != 4)
|
||||||
{
|
{
|
||||||
CloseHandle(hChildStderrRdDup);
|
CloseHandle(hChildStderrRdDup);
|
||||||
PERROR("CloseHandle");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -429,7 +391,6 @@ bool cmWin32ProcessExecution::PrivateOpen(const char *cmdstring,
|
||||||
//f2 = _fdopen(fd2, m1);
|
//f2 = _fdopen(fd2, m1);
|
||||||
fd3 = _open_osfhandle(TO_INTPTR(hChildStderrRdDup), mode);
|
fd3 = _open_osfhandle(TO_INTPTR(hChildStderrRdDup), mode);
|
||||||
//f3 = _fdopen(fd3, m1);
|
//f3 = _fdopen(fd3, m1);
|
||||||
PERROR("_open_osfhandle");
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -478,15 +439,12 @@ bool cmWin32ProcessExecution::PrivateOpen(const char *cmdstring,
|
||||||
|
|
||||||
if (!CloseHandle(hChildStdinRd))
|
if (!CloseHandle(hChildStdinRd))
|
||||||
return win32_error("CloseHandle", NULL);
|
return win32_error("CloseHandle", NULL);
|
||||||
PERROR("CloseHandle");
|
|
||||||
|
|
||||||
if (!CloseHandle(hChildStdoutWr))
|
if (!CloseHandle(hChildStdoutWr))
|
||||||
return win32_error("CloseHandle", NULL);
|
return win32_error("CloseHandle", NULL);
|
||||||
PERROR("CloseHandle");
|
|
||||||
|
|
||||||
if ((n != 4) && (!CloseHandle(hChildStderrWr)))
|
if ((n != 4) && (!CloseHandle(hChildStderrWr)))
|
||||||
return win32_error("CloseHandle", NULL);
|
return win32_error("CloseHandle", NULL);
|
||||||
PERROR("CloseHandle");
|
|
||||||
|
|
||||||
this->m_ProcessHandle = hProcess;
|
this->m_ProcessHandle = hProcess;
|
||||||
if ( fd1 >= 0 )
|
if ( fd1 >= 0 )
|
||||||
|
@ -504,8 +462,6 @@ bool cmWin32ProcessExecution::PrivateOpen(const char *cmdstring,
|
||||||
// this->m_StdErr = f3;
|
// this->m_StdErr = f3;
|
||||||
this->m_pStdErr = fd3;
|
this->m_pStdErr = fd3;
|
||||||
}
|
}
|
||||||
//std::cout << "Process created for real..." << std::endl;
|
|
||||||
//std::cout << fd1 << " " << fd2 << " " << fd3 << std::endl;
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -570,7 +526,6 @@ bool cmWin32ProcessExecution::PrivateClose(int timeout)
|
||||||
}
|
}
|
||||||
if (fserr.st_size > 0)
|
if (fserr.st_size > 0)
|
||||||
{
|
{
|
||||||
//std::cout << "Some error" << std::endl;
|
|
||||||
char buffer[1023];
|
char buffer[1023];
|
||||||
int len = read(this->m_pStdErr, buffer, 1023);
|
int len = read(this->m_pStdErr, buffer, 1023);
|
||||||
buffer[len] = 0;
|
buffer[len] = 0;
|
||||||
|
@ -583,7 +538,6 @@ bool cmWin32ProcessExecution::PrivateClose(int timeout)
|
||||||
}
|
}
|
||||||
if (fsout.st_size > 0)
|
if (fsout.st_size > 0)
|
||||||
{
|
{
|
||||||
//std::cout << "Some output" << std::endl;
|
|
||||||
char buffer[1023];
|
char buffer[1023];
|
||||||
int len = read(this->m_pStdOut, buffer, 1023);
|
int len = read(this->m_pStdOut, buffer, 1023);
|
||||||
buffer[len] = 0;
|
buffer[len] = 0;
|
||||||
|
@ -600,14 +554,11 @@ bool cmWin32ProcessExecution::PrivateClose(int timeout)
|
||||||
GetExitCodeProcess(hProcess,&exitCode);
|
GetExitCodeProcess(hProcess,&exitCode);
|
||||||
if (exitCode != STILL_ACTIVE)
|
if (exitCode != STILL_ACTIVE)
|
||||||
{
|
{
|
||||||
//std::cout << "STILL_ACTIVE = " << STILL_ACTIVE << std::endl;
|
|
||||||
//std::cout << "Process is not active any more: " << exitCode << std::endl;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//std::cout << "Waiting for process to close" << std::endl;
|
|
||||||
|
|
||||||
if (WaitForSingleObject(hProcess, INFINITE) != WAIT_FAILED &&
|
if (WaitForSingleObject(hProcess, INFINITE) != WAIT_FAILED &&
|
||||||
GetExitCodeProcess(hProcess, &exit_code))
|
GetExitCodeProcess(hProcess, &exit_code))
|
||||||
|
@ -632,8 +583,6 @@ bool cmWin32ProcessExecution::PrivateClose(int timeout)
|
||||||
result = -1;
|
result = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
//std::cout << "Process closed with error code: " << result << std::endl;
|
|
||||||
|
|
||||||
/* Free up the native handle at this point */
|
/* Free up the native handle at this point */
|
||||||
CloseHandle(hProcess);
|
CloseHandle(hProcess);
|
||||||
this->m_ExitValue = result;
|
this->m_ExitValue = result;
|
||||||
|
@ -666,11 +615,13 @@ int cmWin32ProcessExecution::Windows9xHack(const char* command)
|
||||||
si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
|
si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
|
si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
|
||||||
|
|
||||||
|
|
||||||
|
char * app = 0;
|
||||||
char* cmd = new char[ strlen(command) + 1 ];
|
char* cmd = new char[ strlen(command) + 1 ];
|
||||||
strcpy(cmd, command);
|
strcpy(cmd, command);
|
||||||
|
|
||||||
bRet = CreateProcess(
|
bRet = CreateProcess(
|
||||||
NULL, cmd,
|
app, cmd,
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
TRUE, 0,
|
TRUE, 0,
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
|
|
Loading…
Reference in New Issue