summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Henriksson <andreas@fatal.se>2014-10-14 12:07:21 +0200
committerKarel Zak <kzak@redhat.com>2014-10-24 11:10:06 +0200
commit1e3f80099317bb18df3c474090b58a75813a29eb (patch)
tree02a8ec7d1965bdaf4eba841335d423f26c0cf5e0
parent0d5bf499358959103ffab4f6bcd57a80156e0bf3 (diff)
downloadutil-linux-1e3f80099317bb18df3c474090b58a75813a29eb.tar.gz
script: may be hangs
Signed-off-by: Karel Zak <kzak@redhat.com>
-rw-r--r--term-utils/script.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/term-utils/script.c b/term-utils/script.c
index b9f87384a..b12b7fdb0 100644
--- a/term-utils/script.c
+++ b/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,7 +259,7 @@ 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 */
@@ -385,17 +386,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 +407,11 @@ finish(int dummy __attribute__ ((__unused__))) {
}
void
+sig_finish(int dummy __attribute__ ((__unused__))) {
+ finish(0);
+}
+
+void
resize(int dummy __attribute__ ((__unused__))) {
resized = 1;
}