1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-28 14:05:09 +00:00

Reimplement tcsetattr/tcgetattr as ioctls.

This commit is contained in:
Andreas Kling 2018-11-16 15:41:48 +01:00
parent c99f8af66d
commit 084287ca45
7 changed files with 55 additions and 49 deletions

View file

@ -21,7 +21,6 @@
//#define DEBUG_IO
//#define TASK_DEBUG
//#define FORK_DEBUG
#define TERMIOS_DEBUG
#define SIGNAL_DEBUG
#define MAX_PROCESS_GIDS 32
@ -1467,6 +1466,24 @@ bool Process::isValidAddressForKernel(LinearAddress laddr) const
return validate_user_read(laddr);
}
bool Process::validate_read(void* address, size_t size) const
{
if ((reinterpret_cast<dword>(address) & PAGE_MASK) != ((reinterpret_cast<dword>(address) + size) & PAGE_MASK)) {
if (!MM.validate_user_read(*this, LinearAddress((dword)address).offset(size)))
return false;
}
return MM.validate_user_read(*this, LinearAddress((dword)address));
}
bool Process::validate_write(void* address, size_t size) const
{
if ((reinterpret_cast<dword>(address) & PAGE_MASK) != ((reinterpret_cast<dword>(address) + size) & PAGE_MASK)) {
if (!MM.validate_user_write(*this, LinearAddress((dword)address).offset(size)))
return false;
}
return MM.validate_user_write(*this, LinearAddress((dword)address));
}
bool Process::validate_user_read(LinearAddress laddr) const
{
InterruptDisabler disabler;
@ -1553,39 +1570,6 @@ int Process::sys$setpgid(pid_t specified_pid, pid_t specified_pgid)
return 0;
}
int Process::sys$tcgetattr(int fd, Unix::termios* tp)
{
VALIDATE_USER_WRITE(tp, sizeof(Unix::termios));
auto* descriptor = file_descriptor(fd);
if (!descriptor)
return -EBADF;
if (!descriptor->isTTY())
return -ENOTTY;
#ifdef TERMIOS_DEBUG
dbgprintf("sys$tcgetattr(fd=%d, tp=%p)\n", fd, tp);
#endif
auto& tty = *descriptor->tty();
memcpy(tp, &tty.termios(), sizeof(Unix::termios));
return 0;
}
int Process::sys$tcsetattr(int fd, int optional_actions, const Unix::termios* tp)
{
(void) optional_actions;
VALIDATE_USER_READ(tp, sizeof(Unix::termios));
auto* descriptor = file_descriptor(fd);
if (!descriptor)
return -EBADF;
if (!descriptor->isTTY())
return -ENOTTY;
#ifdef TERMIOS_DEBUG
dbgprintf("sys$tcsetattr(fd=%d, tp=%p)\n", fd, tp);
#endif
auto& tty = *descriptor->tty();
tty.set_termios(*tp);
return 0;
}
int Process::sys$ioctl(int fd, unsigned request, unsigned arg)
{
auto* descriptor = file_descriptor(fd);