================
@@ -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

Reply via email to