From: Simon Ruderich Date: Sun, 4 Nov 2018 07:26:08 +0000 (+0100) Subject: Add SIGWINCH handler to support resizes of the outer terminal X-Git-Tag: 0.1~3 X-Git-Url: https://ruderich.org/simon/gitweb/?a=commitdiff_plain;h=fe986a14ec7f8dfef0515ab029467eef3c87e33e;p=ptyas%2Fptyas.git Add SIGWINCH handler to support resizes of the outer terminal --- diff --git a/ptyas.c b/ptyas.c index d87ae34..ee5facf 100644 --- a/ptyas.c +++ b/ptyas.c @@ -286,6 +286,28 @@ static void sigchld_handler(int signal) { } } +/* + * 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 */ @@ -422,7 +444,18 @@ int main(int argc, char **argv) { } 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 = {