Processing (Windows): support timeout

This commit is contained in:
李通洲
2023-07-10 21:02:13 +08:00
parent 9c9ba2f1a1
commit d53b584ba2
3 changed files with 29 additions and 113 deletions
+13 -64
View File
@@ -1,9 +1,10 @@
#include "fastfetch.h"
#include "common/processing.h"
#include "common/io/io.h"
#include <Windows.h>
const char* ffProcessAppendStdOut(FFstrbuf* buffer, char* const argv[])
const char* ffProcessAppendOutput(FFstrbuf* buffer, char* const argv[], bool useStdErr)
{
SECURITY_ATTRIBUTES saAttr = {
.nLength = sizeof(SECURITY_ATTRIBUTES),
@@ -11,7 +12,8 @@ const char* ffProcessAppendStdOut(FFstrbuf* buffer, char* const argv[])
.bInheritHandle = TRUE,
};
HANDLE hChildPipeRead, hChildPipeWrite;
FF_AUTO_CLOSE_FD HANDLE hChildPipeRead = NULL;
HANDLE hChildPipeWrite = NULL;
if (!CreatePipe(&hChildPipeRead, &hChildPipeWrite, &saAttr, 0))
return "CreatePipe() failed";
@@ -22,8 +24,11 @@ const char* ffProcessAppendStdOut(FFstrbuf* buffer, char* const argv[])
STARTUPINFOA siStartInfo = {
.cb = sizeof(siStartInfo),
.dwFlags = STARTF_USESTDHANDLES,
.hStdOutput = hChildPipeWrite,
};
if (useStdErr)
siStartInfo.hStdError = hChildPipeWrite;
else
siStartInfo.hStdOutput = hChildPipeWrite;
BOOL success;
@@ -51,71 +56,16 @@ const char* ffProcessAppendStdOut(FFstrbuf* buffer, char* const argv[])
CloseHandle(hChildPipeWrite);
if(!success)
{
CloseHandle(hChildPipeRead);
return "CreateProcessA() failed";
}
char str[1024];
DWORD nRead;
while(ReadFile(hChildPipeRead, str, sizeof(str), &nRead, NULL) && nRead > 0)
ffStrbufAppendNS(buffer, nRead, str);
CloseHandle(hChildPipeRead);
return NULL;
}
const char* ffProcessAppendStdErr(FFstrbuf* buffer, char* const argv[])
{
SECURITY_ATTRIBUTES saAttr = {
.nLength = sizeof(SECURITY_ATTRIBUTES),
.lpSecurityDescriptor = NULL,
.bInheritHandle = TRUE,
};
HANDLE hChildPipeRead, hChildPipeWrite;
if (!CreatePipe(&hChildPipeRead, &hChildPipeWrite, &saAttr, 0))
return "CreatePipe() failed";
if (!SetHandleInformation(hChildPipeRead, HANDLE_FLAG_INHERIT, 0))
return "SetHandleInformation(hChildPipeRead) failed";
PROCESS_INFORMATION piProcInfo = {0};
STARTUPINFOA siStartInfo = {
.cb = sizeof(siStartInfo),
.dwFlags = STARTF_USESTDHANDLES,
.hStdError = hChildPipeWrite,
};
BOOL success;
if (FF_WAIT_TIMEOUT > 0)
{
FF_STRBUF_AUTO_DESTROY cmdline = ffStrbufCreateF("\"%s\"", argv[0]);
for(char* const* parg = &argv[1]; *parg; ++parg)
DWORD ret = WaitForSingleObjectEx(piProcInfo.hProcess, FF_WAIT_TIMEOUT, TRUE);
if (ret == WAIT_TIMEOUT)
{
ffStrbufAppendC(&cmdline, ' ');
ffStrbufAppendS(&cmdline, *parg);
TerminateProcess(piProcInfo.hProcess, 1);
return "Waiting process timeout";
}
success = CreateProcessA(
NULL, // application name
cmdline.chars, // command line
NULL, // process security attributes
NULL, // primary thread security attributes
TRUE, // handles are inherited
0, // creation flags
NULL, // use parent's environment
NULL, // use parent's current directory
&siStartInfo, // STARTUPINFO pointer
&piProcInfo // receives PROCESS_INFORMATION
);
}
CloseHandle(hChildPipeWrite);
if(!success)
{
CloseHandle(hChildPipeRead);
return "CreateProcessA() failed";
}
char str[1024];
@@ -123,6 +73,5 @@ const char* ffProcessAppendStdErr(FFstrbuf* buffer, char* const argv[])
while(ReadFile(hChildPipeRead, str, sizeof(str), &nRead, NULL) && nRead > 0)
ffStrbufAppendNS(buffer, nRead, str);
CloseHandle(hChildPipeRead);
return NULL;
}