svn commit: r364224 - stable/12/usr.bin/script

Mark Johnston markj at FreeBSD.org
Fri Aug 14 00:55:24 UTC 2020


Author: markj
Date: Fri Aug 14 00:55:23 2020
New Revision: 364224
URL: https://svnweb.freebsd.org/changeset/base/364224

Log:
  MFC r364039:
  script: Put the terminal in raw mode when playing back a session.
  
  PR:	248377

Modified:
  stable/12/usr.bin/script/script.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/usr.bin/script/script.c
==============================================================================
--- stable/12/usr.bin/script/script.c	Fri Aug 14 00:18:18 2020	(r364223)
+++ stable/12/usr.bin/script/script.c	Fri Aug 14 00:55:23 2020	(r364224)
@@ -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-stable-12 mailing list