summaryrefslogtreecommitdiff
path: root/Kernel/TTY
diff options
context:
space:
mode:
authorBen Wiederhake <BenWiederhake.GitHub@gmx.de>2020-08-08 22:04:20 +0200
committerAndreas Kling <kling@serenityos.org>2020-08-10 11:51:45 +0200
commit7bdf54c8372d6951409fae17dd4cec7eea6573a2 (patch)
treef8195545cf683926fa6cce15ba1512e8fd320f67 /Kernel/TTY
parentf5744a6f2f63ba9f881132227514b9b3f9496b63 (diff)
downloadserenity-7bdf54c8372d6951409fae17dd4cec7eea6573a2.zip
Kernel: PID/PGID typing
This compiles, and fixes two bugs: - setpgid() confusion (see previous commit) - tcsetpgrp() now allows to set a non-empty process group even if the group leader has already died. This makes Serenity slightly more POSIX-compatible.
Diffstat (limited to 'Kernel/TTY')
-rw-r--r--Kernel/TTY/TTY.cpp32
-rw-r--r--Kernel/TTY/TTY.h2
2 files changed, 16 insertions, 18 deletions
diff --git a/Kernel/TTY/TTY.cpp b/Kernel/TTY/TTY.cpp
index e3b655d24f..28e781927e 100644
--- a/Kernel/TTY/TTY.cpp
+++ b/Kernel/TTY/TTY.cpp
@@ -159,6 +159,7 @@ void TTY::emit(u8 ch)
if (auto parent = Process::from_pid(m_process->ppid()))
(void)parent->send_signal(SIGCHLD, m_process);
}
+ // TODO: Else send it to the session leader maybe?
return;
}
}
@@ -253,7 +254,7 @@ void TTY::generate_signal(int signal)
return;
if (should_flush_on_signal())
flush_input();
- dbg() << tty_name() << ": Send signal " << signal << " to everyone in pgrp " << pgid();
+ dbg() << tty_name() << ": Send signal " << signal << " to everyone in pgrp " << pgid().value();
InterruptDisabler disabler; // FIXME: Iterate over a set of process handles instead?
Process::for_each_in_pgrp(pgid(), [&](auto& process) {
dbg() << tty_name() << ": Send signal " << signal << " to " << process;
@@ -291,7 +292,6 @@ int TTY::ioctl(FileDescription&, unsigned request, FlatPtr arg)
{
REQUIRE_PROMISE(tty);
auto& current_process = *Process::current();
- pid_t pgid;
termios* user_termios;
winsize* user_winsize;
@@ -304,23 +304,21 @@ int TTY::ioctl(FileDescription&, unsigned request, FlatPtr arg)
#endif
switch (request) {
case TIOCGPGRP:
- return this->pgid();
- case TIOCSPGRP:
- pgid = static_cast<pid_t>(arg);
+ return this->pgid().value();
+ case TIOCSPGRP: {
+ ProcessGroupID pgid = static_cast<pid_t>(arg);
if (pgid <= 0)
return -EINVAL;
- {
- InterruptDisabler disabler;
- auto process = Process::from_pid(pgid);
- if (!process)
- return -EPERM;
- if (pgid != process->pgid())
- return -EPERM;
- if (current_process.sid() != process->sid())
- return -EPERM;
- m_process = process->make_weak_ptr();
- }
+ InterruptDisabler disabler;
+ auto process = Process::from_pid(pgid.value());
+ SessionID new_sid = process ? process->sid() : Process::get_sid_from_pgid(pgid);
+ if (!new_sid || new_sid != current_process.sid())
+ return -EPERM;
+ if (process && pgid != process->pgid())
+ return -EPERM;
+ m_process = process ? process->make_weak_ptr() : WeakPtr<Process>();
return 0;
+ }
case TCGETS: {
user_termios = reinterpret_cast<termios*>(arg);
if (!current_process.validate_write(user_termios, sizeof(termios)))
@@ -395,7 +393,7 @@ void TTY::hang_up()
generate_signal(SIGHUP);
}
-pid_t TTY::pgid() const
+ProcessGroupID TTY::pgid() const
{
return m_process ? m_process->pgid() : 0;
}
diff --git a/Kernel/TTY/TTY.h b/Kernel/TTY/TTY.h
index cbaf23e9e6..e8febbd079 100644
--- a/Kernel/TTY/TTY.h
+++ b/Kernel/TTY/TTY.h
@@ -50,7 +50,7 @@ public:
unsigned short rows() const { return m_rows; }
unsigned short columns() const { return m_columns; }
- pid_t pgid() const;
+ ProcessGroupID pgid() const;
void set_termios(const termios&);
bool should_generate_signals() const { return m_termios.c_lflag & ISIG; }