================
@@ -133,3 +140,62 @@ void PseudoConsole::Close() {
m_conpty_input = INVALID_HANDLE_VALUE;
m_conpty_output = INVALID_HANDLE_VALUE;
}
+
+llvm::Error PseudoConsole::DrainInitSequences() {
+ STARTUPINFOEXW startupinfoex = {};
+ startupinfoex.StartupInfo.cb = sizeof(STARTUPINFOEXW);
+ startupinfoex.StartupInfo.dwFlags |= STARTF_USESTDHANDLES;
+
+ auto attributelist_or_err = ProcThreadAttributeList::Create(startupinfoex);
+ if (!attributelist_or_err)
+ return llvm::errorCodeToError(attributelist_or_err.getError());
+ ProcThreadAttributeList attributelist = std::move(*attributelist_or_err);
+ if (auto error = attributelist.SetupPseudoConsole(m_conpty_handle))
+ return error;
+
+ PROCESS_INFORMATION pi = {};
+
+ wchar_t comspec[MAX_PATH];
+ DWORD comspecLen = GetEnvironmentVariableW(L"COMSPEC", comspec, MAX_PATH);
+ if (comspecLen == 0 || comspecLen >= MAX_PATH)
+ return llvm::createStringError(
+ std::error_code(GetLastError(), std::system_category()),
+ "Failed to get the 'COMSPEC' environment variable");
+
+ std::wstring cmdline_str = std::wstring(comspec) + L" /c 'echo foo && exit'";
+ std::vector<wchar_t> cmdline(cmdline_str.begin(), cmdline_str.end());
+ cmdline.push_back(L'\0');
+
+ if (!CreateProcessW(/*lpApplicationName=*/comspec, cmdline.data(),
+ /*lpProcessAttributes=*/NULL,
/*lpThreadAttributes=*/NULL,
+ /*bInheritHandles=*/TRUE,
+ /*dwCreationFlags=*/EXTENDED_STARTUPINFO_PRESENT |
+ CREATE_UNICODE_ENVIRONMENT,
+ /*lpEnvironment=*/NULL, /*lpCurrentDirectory=*/NULL,
+ /*lpStartupInfo=*/
+ reinterpret_cast<STARTUPINFOW *>(&startupinfoex),
+ /*lpProcessInformation=*/&pi))
+ return llvm::errorCodeToError(
+ std::error_code(GetLastError(), std::system_category()));
+
+ char buf[4096];
+ OVERLAPPED ov = {};
+ ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
+
+ DWORD read;
+ ReadFile(m_conpty_output, buf, sizeof(buf), &read, &ov);
+
+ WaitForSingleObject(pi.hProcess, INFINITE);
+
+ if (GetOverlappedResult(m_conpty_output, &ov, &read, FALSE) && read > 0) {
+ ResetEvent(ov.hEvent);
+ ReadFile(m_conpty_output, buf, sizeof(buf), &read, &ov);
+ }
+
+ CancelIo(m_conpty_output);
+ CloseHandle(ov.hEvent);
+ CloseHandle(pi.hProcess);
+ CloseHandle(pi.hThread);
+
+ return llvm::Error::success();
+}
----------------
Nerixyz wrote:
```suggestion
}
```
Add a newline at the end of the file.
https://github.com/llvm/llvm-project/pull/180578
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits