summaryrefslogtreecommitdiff
path: root/usr.bin/script
diff options
context:
space:
mode:
authorchristos <christos@NetBSD.org>2020-08-28 17:10:15 +0000
committerchristos <christos@NetBSD.org>2020-08-28 17:10:15 +0000
commit4a3fa20d968796516dce5a636cb91da10fe5987f (patch)
treeca8e0c56ffa21eda9ba98323e6eae7029ba7da75 /usr.bin/script
parentde5ef7e2e11a75296dc1a284cb180b76ada035ed (diff)
PR/55605: Soumendra Ganguly: Wait for child to finish when stdin is not a tty
Diffstat (limited to 'usr.bin/script')
-rw-r--r--usr.bin/script/script.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/usr.bin/script/script.c b/usr.bin/script/script.c
index d93c490db8d..74a82b1446b 100644
--- a/usr.bin/script/script.c
+++ b/usr.bin/script/script.c
@@ -1,4 +1,4 @@
-/* $NetBSD: script.c,v 1.26 2020/08/08 16:01:35 christos Exp $ */
+/* $NetBSD: script.c,v 1.27 2020/08/28 17:10:15 christos Exp $ */
/*
* Copyright (c) 1980, 1992, 1993
@@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1980, 1992, 1993\
#if 0
static char sccsid[] = "@(#)script.c 8.1 (Berkeley) 6/6/93";
#endif
-__RCSID("$NetBSD: script.c,v 1.26 2020/08/08 16:01:35 christos Exp $");
+__RCSID("$NetBSD: script.c,v 1.27 2020/08/28 17:10:15 christos Exp $");
#endif /* not lint */
#include <sys/types.h>
@@ -92,6 +92,7 @@ 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
@@ -204,12 +205,21 @@ main(int argc, char *argv[])
record(fscript, ibuf, cc, 'i');
(void)write(master, ibuf, cc);
}
- done();
+ childwait();
/* NOTREACHED */
return EXIT_SUCCESS;
}
static void
+childwait(void)
+{
+ sigset_t set;
+
+ sigemptyset(&set);
+ sigsuspend(&set);
+}
+
+static void
finish(int signo)
{
int die, pid, status;
@@ -249,7 +259,7 @@ dooutput(void)
if (scc <= 0)
break;
cc = (size_t)scc;
- (void)write(1, obuf, cc);
+ (void)write(STDOUT_FILENO, obuf, cc);
if (rawout)
record(fscript, obuf, cc, 'o');
else
@@ -258,7 +268,7 @@ dooutput(void)
if (flush)
(void)fflush(fscript);
}
- done();
+ childwait();
}
static void