summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
Diffstat (limited to 'Userland')
-rw-r--r--Userland/Applications/Terminal/main.cpp6
-rw-r--r--Userland/Libraries/LibC/pty.cpp30
-rw-r--r--Userland/Libraries/LibC/pty.h2
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