diff --git a/term-utils/scriptreplay.c b/term-utils/scriptreplay.c index bca1d21b4..19a7d568b 100644 --- a/term-utils/scriptreplay.c +++ b/term-utils/scriptreplay.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "c.h" #include "xalloc.h" @@ -120,12 +121,30 @@ static void appendchr(char *buf, size_t bufsz, int c) buf[sz] = c; } +static int termraw(struct termios *backup) +{ + struct termios tattr; + + if (tcgetattr(STDOUT_FILENO, backup) != 0) + return -1; + + tattr = *backup; + cfmakeraw(&tattr); + if (tcsetattr(STDOUT_FILENO, TCSANOW, &tattr) != 0) + return -1; + + return 0; +} + int main(int argc, char *argv[]) { static const struct timeval mindelay = { .tv_sec = 0, .tv_usec = 100 }; struct timeval maxdelay; + char isterm; + struct termios saved; + struct replay_setup *setup = NULL; struct replay_step *step = NULL; char streams[6] = {0}; /* IOSI - in, out, signal,info */ @@ -286,6 +305,10 @@ main(int argc, char *argv[]) replay_set_delay_max(setup, &maxdelay); replay_set_delay_min(setup, &mindelay); + isterm = isatty(STDOUT_FILENO); + if (isterm && termraw(&saved) != 0) + err(EXIT_FAILURE, _("failed to set terminal to raw mode")); + do { rc = replay_get_next_step(setup, streams, &step); if (rc) @@ -300,6 +323,9 @@ main(int argc, char *argv[]) rc = replay_emit_step_data(setup, step, STDOUT_FILENO); } while (rc == 0); + if (isterm) + tcsetattr(STDOUT_FILENO, TCSADRAIN, &saved); + if (step && rc < 0) err(EXIT_FAILURE, _("%s: log file error"), replay_step_get_filename(step)); else if (rc < 0)