svn commit: r364039 - head/usr.bin/script
Mark Johnston
markj at FreeBSD.org
Fri Aug 7 18:48:57 UTC 2020
Author: markj
Date: Fri Aug 7 18:48:56 2020
New Revision: 364039
URL: https://svnweb.freebsd.org/changeset/base/364039
Log:
script: Put the terminal in raw mode when playing back a session.
Otherwise recorded sessions of some interactive programs do not play
back properly.
PR: 248377
Submitted by: Soumendra Ganguly <0.gangzta at gmail.com>
MFC after: 1 week
Modified:
head/usr.bin/script/script.c
Modified: head/usr.bin/script/script.c
==============================================================================
--- head/usr.bin/script/script.c Fri Aug 7 18:40:56 2020 (r364038)
+++ head/usr.bin/script/script.c Fri Aug 7 18:48:56 2020 (r364039)
@@ -428,6 +428,33 @@ consume(FILE *fp, off_t len, char *buf, int reg)
} while (0/*CONSTCOND*/)
static void
+termset(void)
+{
+ struct termios traw;
+
+ if (tcgetattr(STDOUT_FILENO, &tt) == -1) {
+ if (errno == EBADF)
+ err(1, "%d not valid fd", STDOUT_FILENO);
+ /* errno == ENOTTY */
+ return;
+ }
+ ttyflg = 1;
+ traw = tt;
+ cfmakeraw(&traw);
+ traw.c_lflag |= ISIG;
+ (void)tcsetattr(STDOUT_FILENO, TCSANOW, &traw);
+}
+
+static void
+termreset(void)
+{
+ if (ttyflg) {
+ tcsetattr(STDOUT_FILENO, TCSADRAIN, &tt);
+ ttyflg = 0;
+ }
+}
+
+static void
playback(FILE *fp)
{
struct timespec tsi, tso;
@@ -470,8 +497,11 @@ playback(FILE *fp)
ctime(&tclock));
tsi = tso;
(void)consume(fp, stamp.scr_len, buf, reg);
+ termset();
+ atexit(termreset);
break;
case 'e':
+ termreset();
if (!qflg)
(void)printf("\nScript done on %s",
ctime(&tclock));
More information about the svn-src-head
mailing list