NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: bin/55531: [PATCH] script(1): Check if stdin is a terminal + other error handling



--- src/usr.bin/script/script.c	2020-08-02 02:06:56.406214345 -0500
+++ script.c	2020-08-02 04:46:28.843706209 -0500
@@ -155,17 +155,28 @@
 	if (pflg)
 		playback(fscript);

-	(void)tcgetattr(STDIN_FILENO, &tt);
-	(void)ioctl(STDIN_FILENO, TIOCGWINSZ, &win);
-	if (openpty(&master, &slave, NULL, &tt, &win) == -1)
-		err(1, "openpty");
+	isterm = isatty(STDIN_FILENO);
+	if (isterm) {
+		if (tcgetattr(STDIN_FILENO, &tt) == -1)
+			err(1, "tcgetattr");
+		if (ioctl(STDIN_FILENO, TIOCGWINSZ, &win) == -1)
+			err(1, "ioctl");
+		if (openpty(&master, &slave, NULL, &tt, &win) == -1)
+			err(1, "openpty");
+	} else {
+		if (openpty(&master, &slave, NULL, NULL, NULL) == -1)
+			err(1, "openpty");		
+	}

 	if (!quiet)
 		(void)printf("Script started, output file is %s\n", fname);
-	rtt = tt;
-	cfmakeraw(&rtt);
-	rtt.c_lflag &= ~ECHO;
-	(void)tcsetattr(STDIN_FILENO, TCSAFLUSH, &rtt);
+
+	if (isterm) {
+		rtt = tt;
+		cfmakeraw(&rtt);
+		rtt.c_lflag &= ~ECHO;
+		(void)tcsetattr(STDIN_FILENO, TCSAFLUSH, &rtt);
+	}

 	(void)signal(SIGCHLD, finish);
 	child = fork();
@@ -301,7 +312,8 @@
 		(void)fclose(fscript);
 		(void)close(master);
 	} else {
-		(void)tcsetattr(STDIN_FILENO, TCSAFLUSH, &tt);
+		if (isterm)
+			(void)tcsetattr(STDIN_FILENO, TCSAFLUSH, &tt);
 		if (!quiet)
 			(void)printf("Script done, output file is %s\n", fname);
 	}
@@ -365,13 +377,13 @@
 	if (!isterm)
 		return;

-	if (tcgetattr(STDOUT_FILENO, &tt) != 0)
+	if (tcgetattr(STDOUT_FILENO, &tt) == -1)
 		err(1, "tcgetattr");

 	traw = tt;
 	cfmakeraw(&traw);
 	traw.c_lflag |= ISIG;
-	if (tcsetattr(STDOUT_FILENO, TCSANOW, &traw) != 0)
+	if (tcsetattr(STDOUT_FILENO, TCSANOW, &traw) == -1)
 		err(1, "tcsetattr");
 }

@@ -396,8 +408,10 @@
 	time_t tclock;
 	int reg;

+	isterm = 0;
+
 	if (fstat(fileno(fp), &pst) == -1)
-		err(1, "fstat failed");	
+		err(1, "fstat failed");

 	reg = S_ISREG(pst.st_mode);

@@ -431,6 +445,7 @@
 			atexit(termreset);
 			break;
 		case 'e':
+			termreset();
 			if (!quiet)
 				(void)printf("\nScript done on %s",
 				    ctime(&tclock));


On 8/2/20, Soumendra Ganguly <soumendra%tamu.edu@localhost> wrote:
> Hypothesis: reintroduction of the extra termreset() makes it necessary
> to have "isterm = 0" at the beginning of "playback()" so that if a
> malformed recording file forces case 'e' before case 's', then
> tcsetattr will not be called by termreset(). In that case, an updated
> patch follows. Also, this patch removes an extra whitespace after
> err(1, "fstat failed").
>
> On 8/2/20, Soumendra Ganguly <soumendra%tamu.edu@localhost> wrote:
>> The following reply was made to PR bin/55531; it has been noted by GNATS.
>>
>> From: Soumendra Ganguly <soumendra%tamu.edu@localhost>
>> To: gnats-bugs%netbsd.org@localhost
>> Cc:
>> Subject: Re: bin/55531: [PATCH] script(1): Check if stdin is a terminal +
>>  other error handling
>> Date: Sun, 2 Aug 2020 03:44:03 -0500
>>
>>  This follows #55529
>>
>>  On 8/2/20, gnats-admin%netbsd.org@localhost <gnats-admin%netbsd.org@localhost> wrote:
>>  > Thank you very much for your problem report.
>>  > It has the internal identification `bin/55531'.
>>  > The individual assigned to look at your
>>  > report is: bin-bug-people.
>>  >
>>  >>Category:       bin
>>  >>Responsible:    bin-bug-people
>>  >>Synopsis:       [PATCH] script(1): Check if stdin is a terminal +
>> other
>>  >> error handling
>>  >>Arrival-Date:   Sun Aug 02 08:30:00 +0000 2020
>>  >
>>  >
>>
>>
>



Home | Main Index | Thread Index | Old Index