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