File util-linux-script-backport.patch of Package util-linux.2662

From 032228c9af6fbda5177c47c3d410386895957555 Mon Sep 17 00:00:00 2001
From: Andreas Henriksson <andreas@fatal.se>
Date: Tue, 14 Oct 2014 12:07:21 +0200
Subject: [PATCH] script: may be hangs

Signed-off-by: Karel Zak <kzak@redhat.com>
---
 term-utils/script.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

From 0b285b84b2f14339fd86857244654ba25fac7d73 Mon Sep 17 00:00:00 2001
From: Stanislav Brabec <sbrabec@suse.cz>
Date: Fri, 6 Feb 2015 19:59:14 +0100
Subject: [PATCH] Fix "Script started" buffering race

script -c "echo Hallo World" </dev/null >script.log ; cat script.log

Before:
Hallo World
Script started, file is typescript
Script started, file is typescript
Script done, file is typescript

After:
Script started, file is typescript
Hallo World
Script done, file is typescript
---
 term-utils/script.c | 1 +
 1 file changed, 1 insertion(+)

Index: util-linux-2.25/term-utils/script.c
===================================================================
--- util-linux-2.25.orig/term-utils/script.c
+++ util-linux-2.25/term-utils/script.c
@@ -80,6 +80,7 @@
 
 #define DEFAULT_OUTPUT "typescript"
 
+void sig_finish(int);
 void finish(int);
 void done(void);
 void fail(void);
@@ -258,13 +259,14 @@ main(int argc, char **argv) {
 	/* setup SIGCHLD handler */
 	sigemptyset(&sa.sa_mask);
 	sa.sa_flags = 0;
-	sa.sa_handler = finish;
+	sa.sa_handler = sig_finish;
 	sigaction(SIGCHLD, &sa, NULL);
 
 	/* init mask for SIGCHLD */
 	sigprocmask(SIG_SETMASK, NULL, &block_mask);
 	sigaddset(&block_mask, SIGCHLD);
 
+	fflush(stdout);
 	sigprocmask(SIG_SETMASK, &block_mask, &unblock_mask);
 	child = fork();
 	sigprocmask(SIG_SETMASK, &unblock_mask, NULL);
@@ -385,17 +387,18 @@ doinput(void) {
 	}
 
 	if (!die)
-		finish(0);	/* wait for childern */
+		finish(1);	/* wait for children */
 	done();
 }
 
 void
-finish(int dummy __attribute__ ((__unused__))) {
+finish(int wait) {
 	int status;
 	pid_t pid;
 	int errsv = errno;
+	int options = wait ? 0 : WNOHANG;
 
-	while ((pid = wait3(&status, WNOHANG, 0)) > 0)
+	while ((pid = wait3(&status, options, 0)) > 0)
 		if (pid == child) {
 			childstatus = status;
 			die = 1;
@@ -405,6 +408,11 @@ finish(int dummy __attribute__ ((__unuse
 }
 
 void
+sig_finish(int dummy __attribute__ ((__unused__))) {
+	finish(0);
+}
+
+void
 resize(int dummy __attribute__ ((__unused__))) {
 	resized = 1;
 }
openSUSE Build Service is sponsored by