---
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