tech-userlevel archive

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

[PATCH 4/6] script.c: exit with the exit code of the child



---
 script.c | 37 +++++++++++++++----------------------
 1 file changed, 15 insertions(+), 22 deletions(-)

diff --git a/script.c b/script.c
index 1b42a3b..4899d35 100644
--- a/script.c
+++ b/script.c
@@ -84,7 +84,7 @@ static const char *fname;
 static int	isterm;
 static struct	termios tt;
 
-__dead static void	done(void);
+__dead static void	done(int);
 __dead static void	dooutput(void);
 __dead static void	doshell(const char *);
 __dead static void	fail(void);
@@ -92,7 +92,6 @@ static void	finish(int);
 static void	scriptflush(int);
 static void	record(FILE *, char *, size_t, int);
 static void	consume(FILE *, off_t, char *, int);
-static void	childwait(void);
 __dead static void	playback(FILE *);
 
 int
@@ -205,31 +204,26 @@ main(int argc, char *argv[])
 			record(fscript, ibuf, cc, 'i');
 		(void)write(master, ibuf, cc);
 	}
-	childwait();
-	return EXIT_SUCCESS;
-}
-
-static void
-childwait(void)
-{
-	sigset_t set;
-
-	sigemptyset(&set);
-	sigsuspend(&set);
+	finish(-1);
 }
 
 static void
 finish(int signo)
 {
-	int die, pid, status;
+	int die, pid, status, cstat;
 
 	die = 0;
-	while ((pid = wait3(&status, WNOHANG, 0)) > 0)
-		if (pid == child)
+	while ((pid = wait(&status)) > 0)
+		if (pid == child) {
+			cstat = status;
 			die = 1;
+		}
 
 	if (die)
-		done();
+		if (WIFEXITED(cstat))
+			done(WEXITSTATUS(cstat));
+		else
+			done(128 + WTERMSIG(cstat));
 }
 
 static void
@@ -267,8 +261,7 @@ dooutput(void)
 		if (flush)
 			(void)fflush(fscript);
 	}
-	childwait();
-	exit(EXIT_SUCCESS);
+	finish(-1);
 }
 
 static void
@@ -307,11 +300,11 @@ fail(void)
 {
 
 	(void)kill(0, SIGTERM);
-	done();
+	done(EXIT_FAILURE);
 }
 
 static void
-done(void)
+done(int status)
 {
 	time_t tvec;
 
@@ -330,7 +323,7 @@ done(void)
 		if (!quiet)
 			(void)printf("Script done, output file is %s\n", fname);
 	}
-	exit(EXIT_SUCCESS);
+	exit(status);
 }
 
 static void
-- 
2.30.2

Attachment: signature.asc
Description: PGP signature



Home | Main Index | Thread Index | Old Index