Skip to content

Commit

Permalink
LibC: Remove 'int* aslave' parameter from forkpty()
Browse files Browse the repository at this point in the history
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. :^)
  • Loading branch information
linusg committed May 6, 2021
1 parent e76342e commit 5391836
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 16 deletions.
6 changes: 2 additions & 4 deletions Userland/Applications/Terminal/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);

Expand Down
30 changes: 19 additions & 11 deletions Userland/Libraries/LibC/pty.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
/*
* Copyright (c) 2018-2020, Andreas Kling <[email protected]>
* Copyright (c) 2021, Gunnar Beutner <[email protected]>
* Copyright (c) 2021, Linus Groh <[email protected]>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
Expand Down Expand Up @@ -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)
Expand Down
2 changes: 1 addition & 1 deletion Userland/Libraries/LibC/pty.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 5391836

Please sign in to comment.