summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2010-10-19 23:16:00 +0000
committerGreg Clayton <gclayton@apple.com>2010-10-19 23:16:00 +0000
commit913c4fa15b6808b38453e90ea2269807a24defd6 (patch)
tree2a44bc0199b3ef442134967fe891a91a8dfb19d3
parentc81155eef7fee7bc0efab1d41db7659117ae250a (diff)
downloadbcm5719-llvm-913c4fa15b6808b38453e90ea2269807a24defd6.tar.gz
bcm5719-llvm-913c4fa15b6808b38453e90ea2269807a24defd6.zip
Ok, last commit for the running processes in a new window. Now you can
optionally specify the tty you want to use if you want to use an existing terminal window by giving a partial or full path name: (lldb) process launch --tty=ttys002 This would find the terminal window (or tab on MacOSX) that has ttys002 in its tty path and use it. If it isn't found, it will use a new terminal window. llvm-svn: 116878
-rw-r--r--lldb/include/lldb/Host/Host.h3
-rw-r--r--lldb/source/Commands/CommandObjectProcess.cpp13
-rw-r--r--lldb/source/Host/macosx/Host.mm61
3 files changed, 62 insertions, 15 deletions
diff --git a/lldb/include/lldb/Host/Host.h b/lldb/include/lldb/Host/Host.h
index 9d0882a36e7..4238f7cb5c2 100644
--- a/lldb/include/lldb/Host/Host.h
+++ b/lldb/include/lldb/Host/Host.h
@@ -310,7 +310,8 @@ public:
LaunchApplication (const FileSpec &app_file_spec);
static lldb::pid_t
- LaunchInNewTerminal (const char **argv, // argv[0] is executable
+ LaunchInNewTerminal (const char *tty_name, // Optional partial or full tty name ("/dev/ttys000" or "ttys000")
+ const char **argv, // argv[0] is executable
const char **envp,
const ArchSpec *arch_spec,
bool stop_at_entry,
diff --git a/lldb/source/Commands/CommandObjectProcess.cpp b/lldb/source/Commands/CommandObjectProcess.cpp
index 82d664b0a16..5a54c3dc0fb 100644
--- a/lldb/source/Commands/CommandObjectProcess.cpp
+++ b/lldb/source/Commands/CommandObjectProcess.cpp
@@ -62,7 +62,11 @@ public:
case 'i': stdin_path = option_arg; break;
case 'o': stdout_path = option_arg; break;
case 'p': plugin_name = option_arg; break;
- case 't': in_new_tty = true; break;
+ case 't':
+ if (option_arg && option_arg[0])
+ tty_name.assign (option_arg);
+ in_new_tty = true;
+ break;
default:
error.SetErrorStringWithFormat("Invalid short option character '%c'.\n", short_option);
break;
@@ -77,6 +81,7 @@ public:
Options::ResetOptionValues();
stop_at_entry = false;
in_new_tty = false;
+ tty_name.clear();
stdin_path.clear();
stdout_path.clear();
stderr_path.clear();
@@ -97,6 +102,7 @@ public:
bool stop_at_entry;
bool in_new_tty;
+ std::string tty_name;
std::string stderr_path;
std::string stdin_path;
std::string stdout_path;
@@ -216,7 +222,8 @@ public:
if (m_options.in_new_tty)
{
- lldb::pid_t pid = Host::LaunchInNewTerminal (inferior_argv,
+ lldb::pid_t pid = Host::LaunchInNewTerminal (m_options.tty_name.c_str(),
+ inferior_argv,
inferior_envp,
&exe_module->GetArchitecture(),
true,
@@ -322,7 +329,7 @@ CommandObjectProcessLaunch::CommandOptions::g_option_table[] =
{ SET1 , false, "stdout", 'o', required_argument, NULL, 0, eArgTypePath, "Redirect stdout for the process to <path>."},
{ SET1 , false, "stderr", 'e', required_argument, NULL, 0, eArgTypePath, "Redirect stderr for the process to <path>."},
{ SET1 | SET2, false, "plugin", 'p', required_argument, NULL, 0, eArgTypePlugin, "Name of the process plugin you want to use."},
-{ SET2, false, "tty", 't', no_argument, NULL, 0, eArgTypeNone, "Start the process in a new terminal (tty)."},
+{ SET2, false, "tty", 't', optional_argument, NULL, 0, eArgTypePath, "Start the process in a terminal. If <path> is specified, look for a terminal whose name contains <path>, else start the process in a new terminal."},
{ 0, false, NULL, 0, 0, NULL, 0, eArgTypeNone, NULL }
};
diff --git a/lldb/source/Host/macosx/Host.mm b/lldb/source/Host/macosx/Host.mm
index e4227190a48..6f15c259d92 100644
--- a/lldb/source/Host/macosx/Host.mm
+++ b/lldb/source/Host/macosx/Host.mm
@@ -369,10 +369,35 @@ LaunchInNewTerminalWithCommandFile
return pid;
}
+const char *applscript_in_new_tty =
+"tell application \"Terminal\"\n"
+" do script \"%s\"\n"
+"end tell\n";
+
+
+const char *applscript_in_existing_tty = "\
+set the_shell_script to \"%s\"\n\
+tell application \"Terminal\"\n\
+ repeat with the_window in (get windows)\n\
+ repeat with the_tab in tabs of the_window\n\
+ set the_tty to tty in the_tab\n\
+ if the_tty contains \"%s\" then\n\
+ if the_tab is not busy then\n\
+ set selected of the_tab to true\n\
+ set frontmost of the_window to true\n\
+ do script the_shell_script in the_tab\n\
+ return\n\
+ end if\n\
+ end if\n\
+ end repeat\n\
+ end repeat\n\
+ do script the_shell_script\n\
+end tell\n";
lldb::pid_t
LaunchInNewTerminalWithAppleScript
(
+ const char *tty_name,
const char **argv,
const char **envp,
const ArchSpec *arch_spec,
@@ -392,7 +417,6 @@ LaunchInNewTerminalWithAppleScript
unix_socket_name.assign (temp_file_path);
StreamString command;
-
FileSpec darwin_debug_file_spec;
if (!Host::GetLLDBPath (ePathTypeSupportExecutableDir, darwin_debug_file_spec))
return LLDB_INVALID_PROCESS_ID;
@@ -403,19 +427,14 @@ LaunchInNewTerminalWithAppleScript
char launcher_path[PATH_MAX];
darwin_debug_file_spec.GetPath(launcher_path, sizeof(launcher_path));
- command.Printf ("tell application \"Terminal\"\n do script \"'%s'", launcher_path);
-
- command.Printf(" --unix-socket=%s", unix_socket_name.c_str());
+
+ command.Printf("'%s' --unix-socket=%s", launcher_path, unix_socket_name.c_str());
if (arch_spec && arch_spec->IsValid())
- {
command.Printf(" --arch=%s", arch_spec->AsCString());
- }
if (disable_aslr)
- {
command.PutCString(" --disable-aslr");
- }
command.PutCString(" --");
@@ -426,8 +445,26 @@ LaunchInNewTerminalWithAppleScript
command.Printf(" '%s'", argv[i]);
}
}
- command.PutCString (" ; echo Process exited with status $?\"\nend tell\n");
- const char *script_source = command.GetString().c_str();
+ command.PutCString (" ; echo Process exited with status $?");
+
+ StreamString applescript_source;
+
+ if (tty_name && tty_name[0])
+ {
+ applescript_source.Printf (applscript_in_existing_tty,
+ command.GetString().c_str(),
+ tty_name);
+ }
+ else
+ {
+ applescript_source.Printf (applscript_in_new_tty,
+ command.GetString().c_str());
+ }
+
+
+
+ const char *script_source = applescript_source.GetString().c_str();
+ //puts (script_source);
NSAppleScript* applescript = [[NSAppleScript alloc] initWithSource:[NSString stringWithCString:script_source encoding:NSUTF8StringEncoding]];
lldb::pid_t pid = LLDB_INVALID_PROCESS_ID;
@@ -461,6 +498,7 @@ LaunchInNewTerminalWithAppleScript
WaitForProcessToSIGSTOP (pid, 5);
}
}
+ ::unlink (unix_socket_name.c_str());
[applescript release];
return pid;
}
@@ -471,6 +509,7 @@ LaunchInNewTerminalWithAppleScript
lldb::pid_t
Host::LaunchInNewTerminal
(
+ const char *tty_name,
const char **argv,
const char **envp,
const ArchSpec *arch_spec,
@@ -479,7 +518,7 @@ Host::LaunchInNewTerminal
)
{
#if defined (LLDB_HOST_USE_APPLESCRIPT)
- return LaunchInNewTerminalWithAppleScript (argv, envp, arch_spec, stop_at_entry, disable_aslr);
+ return LaunchInNewTerminalWithAppleScript (tty_name, argv, envp, arch_spec, stop_at_entry, disable_aslr);
#else
return LaunchInNewTerminalWithCommandFile (argv, envp, arch_spec, stop_at_entry, disable_aslr);
#endif
OpenPOWER on IntegriCloud