From 362953810d61d5b987c48ca711a90c801667b113 Mon Sep 17 00:00:00 2001 From: jNullj <15849761+jNullj@users.noreply.github.com> Date: Tue, 7 May 2024 00:10:36 +0300 Subject: [PATCH] Set stdin to nonblock Provision for retrival of playback interactive controls using fgetwc without blocking. --- term-utils/scriptreplay.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/term-utils/scriptreplay.c b/term-utils/scriptreplay.c index 98501a83c9..197e3e7e91 100644 --- a/term-utils/scriptreplay.c +++ b/term-utils/scriptreplay.c @@ -29,6 +29,7 @@ #include #include #include +#include #include "c.h" #include "xalloc.h" @@ -122,10 +123,15 @@ appendchr(char *buf, size_t bufsz, int c) } static int -setterm(struct termios *backup) +setterm(struct termios *backup, int *saved_flag) { struct termios tattr; + *saved_flag = fcntl(STDIN_FILENO, F_GETFL); + if (*saved_flag == -1) + err(EXIT_FAILURE, _("unexpected fcntl failure")); + fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK); + if (tcgetattr(STDOUT_FILENO, backup) != 0) { if (errno != ENOTTY) /* For debugger. */ err(EXIT_FAILURE, _("unexpected tcgetattr failure")); @@ -146,6 +152,7 @@ main(int argc, char *argv[]) struct timeval maxdelay; int isterm; + int saved_flag; struct termios saved; struct replay_setup *setup = NULL; @@ -308,7 +315,7 @@ main(int argc, char *argv[]) replay_set_delay_max(setup, &maxdelay); replay_set_delay_min(setup, &mindelay); - isterm = setterm(&saved); + isterm = setterm(&saved, &saved_flag); do { rc = replay_get_next_step(setup, streams, &step); @@ -325,7 +332,10 @@ main(int argc, char *argv[]) } while (rc == 0); if (isterm) + { + fcntl(STDIN_FILENO, F_SETFL, &saved_flag); tcsetattr(STDOUT_FILENO, TCSADRAIN, &saved); + } if (step && rc < 0) err(EXIT_FAILURE, _("%s: log file error"), replay_step_get_filename(step)); -- 2.47.2