mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 22:58:11 +00:00
Terminal: Use utmpupdate to update /var/run/utmp
We now put entries for interactive terminal sessions in the utmp file. They are removed when you exit the terminal.
This commit is contained in:
parent
171bfcff36
commit
3c49a82ae9
1 changed files with 36 additions and 5 deletions
|
@ -56,13 +56,29 @@
|
|||
#include <sys/select.h>
|
||||
#include <unistd.h>
|
||||
|
||||
static void run_command(int ptm_fd, String command)
|
||||
static void utmp_update(const char* tty, pid_t pid, bool create)
|
||||
{
|
||||
if (!tty)
|
||||
return;
|
||||
int utmpupdate_pid = fork();
|
||||
if (utmpupdate_pid < 0) {
|
||||
perror("fork");
|
||||
return;
|
||||
}
|
||||
if (utmpupdate_pid)
|
||||
return;
|
||||
char shell_pid_string[64];
|
||||
snprintf(shell_pid_string, sizeof(shell_pid_string), "%d", pid);
|
||||
execl("/bin/utmpupdate", "/bin/utmpupdate", "-f", "Terminal", "-p", shell_pid_string, (create ? "-c" : "-d"), tty, nullptr);
|
||||
}
|
||||
|
||||
static pid_t run_command(int ptm_fd, String command)
|
||||
{
|
||||
pid_t pid = fork();
|
||||
if (pid < 0) {
|
||||
perror("fork");
|
||||
dbg() << "run_command: could not fork to run '" << command << "'";
|
||||
return;
|
||||
return pid;
|
||||
}
|
||||
|
||||
if (pid == 0) {
|
||||
|
@ -132,6 +148,8 @@ static void run_command(int ptm_fd, String command)
|
|||
}
|
||||
ASSERT_NOT_REACHED();
|
||||
}
|
||||
|
||||
return pid;
|
||||
}
|
||||
|
||||
static RefPtr<GUI::Window> create_settings_window(TerminalWidget& terminal)
|
||||
|
@ -239,10 +257,15 @@ int main(int argc, char** argv)
|
|||
|
||||
RefPtr<Core::ConfigFile> config = Core::ConfigFile::get_for_app("Terminal");
|
||||
|
||||
pid_t shell_pid = 0;
|
||||
|
||||
if (command_to_execute)
|
||||
run_command(ptm_fd, command_to_execute);
|
||||
shell_pid = run_command(ptm_fd, command_to_execute);
|
||||
else
|
||||
run_command(ptm_fd, config->read_entry("Startup", "Command", ""));
|
||||
shell_pid = run_command(ptm_fd, config->read_entry("Startup", "Command", ""));
|
||||
|
||||
auto* pts_name = ptsname(ptm_fd);
|
||||
utmp_update(pts_name, shell_pid, true);
|
||||
|
||||
auto window = GUI::Window::construct();
|
||||
window->set_title("Terminal");
|
||||
|
@ -340,6 +363,11 @@ int main(int argc, char** argv)
|
|||
return 1;
|
||||
}
|
||||
|
||||
if (unveil("/bin/utmpupdate", "x") < 0) {
|
||||
perror("unveil");
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (unveil("/tmp/portal/launch", "rw") < 0) {
|
||||
perror("unveil");
|
||||
return 1;
|
||||
|
@ -353,5 +381,8 @@ int main(int argc, char** argv)
|
|||
unveil(nullptr, nullptr);
|
||||
|
||||
config->sync();
|
||||
return app->exec();
|
||||
int result = app->exec();
|
||||
dbg() << "Exiting terminal, updating utmp";
|
||||
utmp_update(pts_name, 0, false);
|
||||
return result;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue