diff options
Diffstat (limited to 'Userland')
-rw-r--r-- | Userland/Applications/Terminal/main.cpp | 6 | ||||
-rw-r--r-- | Userland/Libraries/LibC/pty.cpp | 30 | ||||
-rw-r--r-- | Userland/Libraries/LibC/pty.h | 2 |
3 files changed, 22 insertions, 16 deletions
diff --git a/Userland/Applications/Terminal/main.cpp b/Userland/Applications/Terminal/main.cpp index 0292207769..191a0ada89 100644 --- a/Userland/Applications/Terminal/main.cpp +++ b/Userland/Applications/Terminal/main.cpp @@ -261,8 +261,8 @@ int main(int argc, char** argv) RefPtr<Core::ConfigFile> config = Core::ConfigFile::get_for_app("Terminal"); Core::File::ensure_parent_directories(config->filename()); - int ptm_fd, pts_fd; - pid_t shell_pid = forkpty(&ptm_fd, &pts_fd, nullptr, nullptr, nullptr); + int ptm_fd; + pid_t shell_pid = forkpty(&ptm_fd, nullptr, nullptr, nullptr); if (shell_pid < 0) { perror("forkpty"); return 1; @@ -276,8 +276,6 @@ int main(int argc, char** argv) VERIFY_NOT_REACHED(); } - close(pts_fd); - auto* pts_name = ptsname(ptm_fd); utmp_update(pts_name, shell_pid, true); diff --git a/Userland/Libraries/LibC/pty.cpp b/Userland/Libraries/LibC/pty.cpp index 0b13b2c8b1..0c72a31ef2 100644 --- a/Userland/Libraries/LibC/pty.cpp +++ b/Userland/Libraries/LibC/pty.cpp @@ -1,6 +1,7 @@ /* * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> * Copyright (c) 2021, Gunnar Beutner <gbeutner@serenityos.org> + * Copyright (c) 2021, Linus Groh <linusg@serenityos.org> * * SPDX-License-Identifier: BSD-2-Clause */ @@ -66,20 +67,27 @@ int openpty(int* amaster, int* aslave, char* name, const struct termios* termp, return 0; } -pid_t forkpty(int* amaster, int* aslave, char* name, const struct termios* termp, const struct winsize* winp) +pid_t forkpty(int* amaster, char* name, const struct termios* termp, const struct winsize* winp) { - int rc = openpty(amaster, aslave, name, termp, winp); - if (rc < 0) - return rc; - rc = fork(); - if (rc < 0) { - close(*amaster); - close(*aslave); + int master; + int slave; + if (openpty(&master, &slave, name, termp, winp) < 0) return -1; + pid_t pid = fork(); + if (pid < 0) { + close(master); + close(slave); + return -1; + } + if (pid == 0) { + close(master); + if (login_tty(slave) < 0) + _exit(1); + return 0; } - if (rc == 0) - rc = login_tty(*aslave); - return rc; + *amaster = master; + close(slave); + return pid; } int login_tty(int fd) diff --git a/Userland/Libraries/LibC/pty.h b/Userland/Libraries/LibC/pty.h index 45681620bf..e2068f1105 100644 --- a/Userland/Libraries/LibC/pty.h +++ b/Userland/Libraries/LibC/pty.h @@ -12,7 +12,7 @@ __BEGIN_DECLS int openpty(int* amaster, int* aslave, char* name, const struct termios* termp, const struct winsize* winp); -pid_t forkpty(int* amaster, int* aslave, char* name, const struct termios* termp, const struct winsize* winp); +pid_t forkpty(int* amaster, char* name, const struct termios* termp, const struct winsize* winp); int login_tty(int fd); __END_DECLS |