diff --git a/Userland/DevTools/Inspector/RemoteProcess.cpp b/Userland/DevTools/Inspector/RemoteProcess.cpp index 93d07cd83c..bfea54d4db 100644 --- a/Userland/DevTools/Inspector/RemoteProcess.cpp +++ b/Userland/DevTools/Inspector/RemoteProcess.cpp @@ -88,6 +88,11 @@ void RemoteProcess::set_property(FlatPtr object, const StringView& name, const J m_client->async_set_object_property(m_pid, object, name, value.to_string()); } +bool RemoteProcess::is_inspectable() +{ + return m_client->is_inspectable(m_pid); +} + void RemoteProcess::update() { { diff --git a/Userland/DevTools/Inspector/RemoteProcess.h b/Userland/DevTools/Inspector/RemoteProcess.h index 5f821db693..83baad53fc 100644 --- a/Userland/DevTools/Inspector/RemoteProcess.h +++ b/Userland/DevTools/Inspector/RemoteProcess.h @@ -32,6 +32,8 @@ public: void set_property(FlatPtr object, const StringView& name, const JsonValue& value); + bool is_inspectable(); + Function on_update; private: diff --git a/Userland/DevTools/Inspector/main.cpp b/Userland/DevTools/Inspector/main.cpp index fa63527c74..5da17cec5e 100644 --- a/Userland/DevTools/Inspector/main.cpp +++ b/Userland/DevTools/Inspector/main.cpp @@ -66,11 +66,13 @@ int main(int argc, char** argv) unveil(nullptr, nullptr); + bool gui_mode = argc != 2; pid_t pid; auto app = GUI::Application::construct(argc, argv); auto app_icon = GUI::Icon::default_icon("app-inspector"); - if (argc != 2) { + if (gui_mode) { + choose_pid: auto process_chooser = GUI::ProcessChooser::construct("Inspector", "Inspect", app_icon.bitmap_for_size(16)); if (process_chooser->exec() == GUI::Dialog::ExecCancel) return 0; @@ -84,21 +86,26 @@ int main(int argc, char** argv) auto window = GUI::Window::construct(); - if (!Desktop::Launcher::add_allowed_handler_with_only_specific_urls( - "/bin/Help", - { URL::create_with_file_protocol("/usr/share/man/man1/Inspector.md") }) - || !Desktop::Launcher::seal_allowlist()) { - warnln("Failed to set up allowed launch URLs"); - return 1; - } - if (pid == getpid()) { GUI::MessageBox::show(window, "Cannot inspect Inspector itself!", "Error", GUI::MessageBox::Type::Error); return 1; } - if (access(String::formatted("/proc/{}", pid).characters(), R_OK) == -1) { - GUI::MessageBox::show(window, "Inspector doesn't have permission to access the process.", "Error", GUI::MessageBox::Type::Error); + RemoteProcess remote_process(pid); + if (!remote_process.is_inspectable()) { + GUI::MessageBox::show(window, String::formatted("Process pid={} is not inspectable", remote_process.pid()), "Error", GUI::MessageBox::Type::Error); + if (gui_mode) { + goto choose_pid; + } else { + return 1; + } + } + + if (!Desktop::Launcher::add_allowed_handler_with_only_specific_urls( + "/bin/Help", + { URL::create_with_file_protocol("/usr/share/man/man1/Inspector.md") }) + || !Desktop::Launcher::seal_allowlist()) { + warnln("Failed to set up allowed launch URLs"); return 1; } @@ -123,8 +130,6 @@ int main(int argc, char** argv) auto& splitter = widget.add(); - RemoteProcess remote_process(pid); - remote_process.on_update = [&] { if (!remote_process.process_name().is_null()) window->set_title(String::formatted("{} ({}) - Inspector", remote_process.process_name(), remote_process.pid()));