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

LibC: Remove 'int* aslave' parameter from forkpty()

Only keep track of that (and eventually close() it) internally instead.
This argument is not present on other systems, so we were running into
compatibility issues with ports.
Also bring the implementation closer to Linux and OpenBSD by making sure
to close the slave pty fd in the fork()'d child as well as _exit()'ing
on login_tty() failure - it's non-POSIX, so those are our references
here. :^)
This commit is contained in:
Linus Groh 2021-05-06 13:52:46 +01:00
parent e76342e242
commit 5391836468
3 changed files with 22 additions and 16 deletions

View file

@ -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);

View file

@ -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 (rc == 0)
rc = login_tty(*aslave);
return rc;
if (pid == 0) {
close(master);
if (login_tty(slave) < 0)
_exit(1);
return 0;
}
*amaster = master;
close(slave);
return pid;
}
int login_tty(int fd)

View file

@ -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