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 <[email protected]>
  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));
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to