Compare commits

..

4 Commits

Author SHA1 Message Date
6f683c48f0
terminal: Send signals on ^C and ^\
All checks were successful
continuous-integration/drone/pr Build is passing
2023-09-18 07:21:06 +02:00
f8879015ee
wind: Translate Ctrl-key presses correctly 2023-09-18 07:20:07 +02:00
08583d5ad4
kernel: Allow sending signals to process groups from userspace 2023-09-18 07:19:53 +02:00
4d6c8aa8bf
kernel: Fix sending signals to threads that are in a long syscall 2023-09-18 07:19:29 +02:00
4 changed files with 68 additions and 29 deletions

View File

@ -54,17 +54,66 @@ Result<u64> sys_kill(Registers*, SyscallArgs args)
pid_t pid = (pid_t)args[0]; pid_t pid = (pid_t)args[0];
int signo = (int)args[1]; int signo = (int)args[1];
// FIXME: Support this case. auto send_signal = [&](Thread* target) -> Result<void> {
if (pid <= 0) return err(ENOTSUP); if (current->auth.euid != 0 && current->auth.euid != target->auth.euid &&
current->auth.egid != target->auth.egid)
auto* target = TRY(Result<Thread*>::from_option(Scheduler::find_by_pid(pid), ESRCH));
if (current->auth.euid != 0 && current->auth.euid != target->auth.euid && current->auth.egid != target->auth.egid)
return err(EPERM); return err(EPERM);
if (target->is_kernel) return 0; if (target->is_kernel) return {};
if (signo == 0) return 0; if (signo == 0) return {};
target->send_signal(signo); target->send_signal(signo);
return {};
};
if (pid > 0)
{
auto* target = TRY(Result<Thread*>::from_option(Scheduler::find_by_pid(pid), ESRCH));
TRY(send_signal(target));
}
else if (pid == 0)
{
int errno = -1;
bool pgid_exists = false;
Scheduler::for_each_in_process_group(current->pgid, [&](Thread* target) {
pgid_exists = true;
auto rc = send_signal(target);
if (rc.has_error())
{
errno = rc.error();
return false;
}
return true;
});
if (errno > 0) return err(errno);
if (!pgid_exists) return err(ESRCH);
}
else if (pid == -1)
{
for (auto* thread : g_threads)
{
// We ignore permission errors here.
if (thread != current && thread->id != 1) send_signal(thread);
}
}
else if (pid < -1)
{
int errno = -1;
bool pgid_exists = false;
Scheduler::for_each_in_process_group(-pid, [&](Thread* target) {
pgid_exists = true;
auto rc = send_signal(target);
if (rc.has_error())
{
errno = rc.error();
return false;
}
return true;
});
if (errno > 0) return err(errno);
if (!pgid_exists) return err(ESRCH);
}
return 0; return 0;
} }

View File

@ -211,7 +211,7 @@ void Thread::send_signal(int signo)
check(signo > 0 && signo <= NSIG); check(signo > 0 && signo <= NSIG);
pending_signals.set(signo - 1, true); pending_signals.set(signo - 1, true);
if (state == ThreadState::Waiting || state == ThreadState::Sleeping) if (state == ThreadState::Waiting || state == ThreadState::Sleeping || is_in_kernel(&regs))
{ {
interrupted = true; interrupted = true;
wake_up(); wake_up();

View File

@ -135,14 +135,9 @@ Result<ui::EventResult> TerminalWidget::handle_key_event(const ui::KeyEventReque
{ {
if (!(m_settings.c_lflag & NOFLSH)) m_line_buffer.clear(); if (!(m_settings.c_lflag & NOFLSH)) m_line_buffer.clear();
// FIXME: Send SIGINT. pid_t group = tcgetpgrp(m_pty);
/*if (m_foreground_process_group.has_value()) TRY(os::Process::kill(-group, SIGINT));
{
Scheduler::for_each_in_process_group(m_foreground_process_group.value(), [](Thread* thread) {
thread->send_signal(SIGINT);
return true;
});
}*/
is_special_character = true; is_special_character = true;
} }
@ -150,14 +145,9 @@ Result<ui::EventResult> TerminalWidget::handle_key_event(const ui::KeyEventReque
{ {
if (!(m_settings.c_lflag & NOFLSH)) m_line_buffer.clear(); if (!(m_settings.c_lflag & NOFLSH)) m_line_buffer.clear();
// FIXME: Send SIGINT. pid_t group = tcgetpgrp(m_pty);
/*if (m_foreground_process_group.has_value()) TRY(os::Process::kill(-group, SIGQUIT));
{
Scheduler::for_each_in_process_group(m_foreground_process_group.value(), [](Thread* thread) {
thread->send_signal(SIGQUIT);
return true;
});
}*/
is_special_character = true; is_special_character = true;
} }
} }
@ -598,5 +588,5 @@ void TerminalWidget::put_code_point(wchar_t c)
void TerminalWidget::quit() void TerminalWidget::quit()
{ {
kill(m_child_pid, SIGHUP); kill(-tcgetpgrp(m_pty), SIGHUP);
} }

View File

@ -288,9 +288,9 @@ namespace wind::Keyboard
else else
letter = table[code]; letter = table[code];
if (_islower(letter)) letter = (char)_toupper(letter); if (_islower(letter)) letter = (char)_toupper(letter);
if (_isupper(letter)) letter = 0x40; if (_isupper(letter)) letter = letter - 0x40;
if (letter == '@') letter = 0x40; if (letter == '@') letter = letter - 0x40;
if (letter > 'Z' && letter < '`') letter = 0x40; if (letter > 'Z' && letter < '`') letter = letter - 0x40;
if (letter == '?') letter = 0x7f; if (letter == '?') letter = 0x7f;
request.letter = letter; request.letter = letter;
return request; return request;