diff --git a/Applications/Terminal/main.cpp b/Applications/Terminal/main.cpp index 2710fa24ac6..37f5605b522 100644 --- a/Applications/Terminal/main.cpp +++ b/Applications/Terminal/main.cpp @@ -24,21 +24,40 @@ static void make_shell(int ptm_fd) perror("ptsname"); exit(1); } - int rc = 0; close(ptm_fd); int pts_fd = open(tty_name, O_RDWR); - rc = ioctl(0, TIOCNOTTY); - if (rc < 0) { - perror("ioctl(TIOCNOTTY)"); + if (pts_fd < 0) { + perror("open"); exit(1); } + + // NOTE: It's okay if this fails. + (void) ioctl(0, TIOCNOTTY); + close(0); close(1); close(2); - dup2(pts_fd, 0); - dup2(pts_fd, 1); - dup2(pts_fd, 2); - close(pts_fd); + + int rc = dup2(pts_fd, 0); + if (rc < 0) { + perror("dup2"); + exit(1); + } + rc = dup2(pts_fd, 1); + if (rc < 0) { + perror("dup2"); + exit(1); + } + rc = dup2(pts_fd, 2); + if (rc < 0) { + perror("dup2"); + exit(1); + } + rc = close(pts_fd); + if (rc < 0) { + perror("close"); + exit(1); + } rc = ioctl(0, TIOCSCTTY); if (rc < 0) { perror("ioctl(TIOCSCTTY)"); diff --git a/Kernel/NullDevice.cpp b/Kernel/NullDevice.cpp index 3cc31f5e842..c1b2625655d 100644 --- a/Kernel/NullDevice.cpp +++ b/Kernel/NullDevice.cpp @@ -3,9 +3,18 @@ #include #include +static NullDevice* s_the; + +NullDevice& NullDevice::the() +{ + ASSERT(s_the); + return *s_the; +} + NullDevice::NullDevice() : CharacterDevice(1, 3) { + s_the = this; } NullDevice::~NullDevice() diff --git a/Kernel/NullDevice.h b/Kernel/NullDevice.h index 22c3637bb03..aff8d056ec2 100644 --- a/Kernel/NullDevice.h +++ b/Kernel/NullDevice.h @@ -8,6 +8,8 @@ public: NullDevice(); virtual ~NullDevice() override; + static NullDevice& the(); + private: // ^CharacterDevice virtual ssize_t read(Process&, byte* buffer, size_t bufferSize) override; diff --git a/Kernel/Process.cpp b/Kernel/Process.cpp index cf8a4e85324..07fd8e69ea7 100644 --- a/Kernel/Process.cpp +++ b/Kernel/Process.cpp @@ -6,6 +6,7 @@ #include "system.h" #include #include +#include #include "ELFLoader.h" #include "MemoryManager.h" #include "i8253.h" @@ -623,12 +624,11 @@ Process::Process(String&& name, uid_t uid, gid_t gid, pid_t ppid, RingLevel ring } } else { m_fds.resize(m_max_open_file_descriptors); - if (tty) { - int error; - m_fds[0].set(tty->open(error, O_RDONLY)); - m_fds[1].set(tty->open(error, O_WRONLY)); - m_fds[2].set(tty->open(error, O_WRONLY)); - } + auto& device_to_use_as_tty = tty ? (CharacterDevice&)*tty : NullDevice::the(); + int error; + m_fds[0].set(device_to_use_as_tty.open(error, O_RDONLY)); + m_fds[1].set(device_to_use_as_tty.open(error, O_WRONLY)); + m_fds[2].set(device_to_use_as_tty.open(error, O_WRONLY)); } if (fork_parent) diff --git a/Kernel/init.cpp b/Kernel/init.cpp index 703d2ced29d..ae7f5e8783a 100644 --- a/Kernel/init.cpp +++ b/Kernel/init.cpp @@ -43,6 +43,7 @@ VirtualConsole* tty3; Keyboard* keyboard; PS2MouseDevice* ps2mouse; GUIEventDevice* gui_event_device; +NullDevice* dev_null; VFS* vfs; #ifdef STRESS_TEST_SPAWNING @@ -72,7 +73,6 @@ static void init_stage2() auto dev_zero = make(); vfs->register_character_device(*dev_zero); - auto dev_null = make(); vfs->register_character_device(*dev_null); auto dev_full = make(); @@ -162,6 +162,7 @@ void init() keyboard = new Keyboard; ps2mouse = new PS2MouseDevice; gui_event_device = new GUIEventDevice; + dev_null = new NullDevice; VirtualConsole::initialize(); tty0 = new VirtualConsole(0, VirtualConsole::AdoptCurrentVGABuffer);