}
}
+/*
+ * SIGWINCH handler to handle resizes of the outer terminal.
+ *
+ * Errors are ignored without message because printing in signal handlers is
+ * problematic (no FILE * usable due to locks) and there's not much we can do
+ * at this point.
+ */
+static int sigwinch_ctty = -1;
+static int sigwinch_slave = -1;
+
+static void sigwinch_handler(int signal) {
+ (void)signal;
+
+ struct winsize size;
+ if (ioctl(sigwinch_ctty, TIOCGWINSZ, &size) == -1) {
+ return;
+ }
+ if (ioctl(sigwinch_slave, TIOCSWINSZ, &size) == -1) {
+ return;
+ }
+}
+
int main(int argc, char **argv) {
char *exec_argv_shell[] = { NULL, NULL }; /* filled below */
}
quit_with_matching_code(status);
}
- close_or_die(pty_slave);
+ /* Don't close pty_slave here as it's used in sigwinch_handler(). */
+
+ sigwinch_ctty = ctty;
+ sigwinch_slave = pty_slave;
+
+ struct sigaction action_sigwinch = {
+ .sa_handler = sigwinch_handler,
+ };
+ sigemptyset(&action_sigwinch.sa_mask);
+ if (sigaction(SIGWINCH, &action_sigwinch, NULL) != 0) {
+ die("sigaction SIGWINCH");
+ }
pid_to_wait_for = pid;
struct sigaction action_sigchld = {