void FileUtils::OSXOpenDebuggerTerminalAndGetTTY(const wxString& path, wxString& tty, long& pid) { tty.Clear(); wxString command; wxString tmpfile; wxString escapedPath = path; if(escapedPath.Contains(" ")) { escapedPath.Prepend("\"").Append("\""); } tmpfile << "/tmp/terminal.tty." << ::wxGetProcessId(); command << "osascript -e 'tell app \"Terminal\" to do script \"tty > " << tmpfile << " && clear && sleep 12345\"'"; CL_DEBUG("Executing: %s", command); long res = ::wxExecute(command); if(res == 0) { CL_WARNING("Failed to execute command:\n%s", command); return; } // Read the tty from the file, wait for it up to 10 seconds wxFileName ttyFile(tmpfile); pid = wxNOT_FOUND; for(size_t i = 0; i < 10; ++i) { if(!ttyFile.Exists()) { ::wxSleep(1); continue; } ReadFileContent(ttyFile, tty); tty.Trim().Trim(false); // Remove the file wxLogNull noLog; ::wxRemoveFile(ttyFile.GetFullPath()); // Get the parent process ID (we want the parent PID and not // the sleep command PID) wxString psCommand; psCommand << "ps -A -o ppid,command"; wxString psOutput = ProcUtils::SafeExecuteCommand(psCommand); CL_DEBUG("PS output:\n%s\n", psOutput); wxArrayString lines = ::wxStringTokenize(psOutput, "\n", wxTOKEN_STRTOK); for(size_t u = 0; u < lines.GetCount(); ++u) { wxString l = lines.Item(u); l.Trim().Trim(false); if(l.Contains("sleep") && l.Contains("12345")) { // we got a match CL_DEBUG("Got a match!"); wxString ppidString = l.BeforeFirst(' '); ppidString.ToCLong(&pid); break; } } break; } CL_DEBUG("PID is: %d\n", (int)pid); CL_DEBUG("TTY is: %s\n", tty); }
void FileUtils::OSXOpenDebuggerTerminalAndGetTTY(const wxString& path, const wxString& appname, wxString& tty, long& pid) { tty.Clear(); wxString command; wxString tmpfile; tmpfile << "/tmp/terminal.tty." << ::wxGetProcessId(); wxFileName helperScript("/tmp", "codelite-lldb-helper.sh"); wxString fileContent; fileContent << "#!/bin/bash\n"; fileContent << "tty > " << tmpfile << "\n"; fileContent << "sleep 12345"; FileUtils::WriteFileContent(helperScript, fileContent); int rc = system("chmod +x /tmp/codelite-lldb-helper.sh"); wxUnusedVar(rc); command << "/usr/bin/open -a " << appname << " /tmp/codelite-lldb-helper.sh"; clDEBUG() << "Executing: " << command; long res = ::wxExecute(command); if(res == 0) { clWARNING() << "Failed to execute command:" << command; return; } // Read the tty from the file, wait for it up to 10 seconds wxFileName ttyFile(tmpfile); pid = wxNOT_FOUND; for(size_t i = 0; i < 10; ++i) { if(!ttyFile.Exists()) { ::wxSleep(1); continue; } ReadFileContent(ttyFile, tty); tty.Trim().Trim(false); // Remove the file clRemoveFile(ttyFile.GetFullPath()); // Get the parent process ID (we want the parent PID and not // the sleep command PID) wxString psCommand; psCommand << "ps -A -o ppid,command"; wxString psOutput = ProcUtils::SafeExecuteCommand(psCommand); clDEBUG() << "ps command output:\n" << psOutput; wxArrayString lines = ::wxStringTokenize(psOutput, "\n", wxTOKEN_STRTOK); for(size_t u = 0; u < lines.GetCount(); ++u) { wxString l = lines.Item(u); l.Trim().Trim(false); if(l.Contains("sleep") && l.Contains("12345")) { // we got a match clDEBUG() << "Got a match!"; wxString ppidString = l.BeforeFirst(' '); ppidString.ToCLong(&pid); break; } } break; } clDEBUG() << "PID is:" << pid; clDEBUG() << "TTY is:" << tty; }