Use an interrupt-safe close()

This commit is contained in:
Kovid Goyal
2019-07-05 14:39:07 +05:30
parent 547132131a
commit c848c3ee0d
6 changed files with 25 additions and 23 deletions

View File

@@ -91,28 +91,28 @@ spawn(PyObject *self UNUSED, PyObject *args) {
// On BSD open() does not establish the controlling terminal
if (ioctl(tfd, TIOCSCTTY, 0) == -1) exit_on_err("Failed to set controlling terminal with TIOCSCTTY");
#endif
close(tfd);
safe_close(tfd);
// Redirect stdin/stdout/stderr to the pty
if (dup2(slave, 1) == -1) exit_on_err("dup2() failed for fd number 1");
if (dup2(slave, 2) == -1) exit_on_err("dup2() failed for fd number 2");
if (stdin_read_fd > -1) {
if (dup2(stdin_read_fd, 0) == -1) exit_on_err("dup2() failed for fd number 0");
close(stdin_read_fd);
close(stdin_write_fd);
safe_close(stdin_read_fd);
safe_close(stdin_write_fd);
} else {
if (dup2(slave, 0) == -1) exit_on_err("dup2() failed for fd number 0");
}
close(slave);
close(master);
safe_close(slave);
safe_close(master);
// Wait for READY_SIGNAL which indicates kitty has setup the screen object
close(ready_write_fd);
safe_close(ready_write_fd);
wait_for_terminal_ready(ready_read_fd);
close(ready_read_fd);
safe_close(ready_read_fd);
// Close any extra fds inherited from parent
for (int c = 3; c < 201; c++) close(c);
for (int c = 3; c < 201; c++) safe_close(c);
environ = env;
// for some reason SIGPIPE is set to SIG_IGN, so reset it, needed by bash,