script: fix inconsistent -q, use poll() rather then O_NONBLOCK
- don't suppress "Script done" message in typescript file by -q (note that -q has no effect to "Script started" message) - simplify the code by poll() Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
parent
38374be4c8
commit
968e632cdb
|
@ -404,9 +404,9 @@ dooutput(FILE *timingfd) {
|
|||
char obuf[BUFSIZ];
|
||||
struct timeval tv;
|
||||
double oldtime=time(NULL), newtime;
|
||||
int flgs = 0;
|
||||
ssize_t wrt;
|
||||
ssize_t fwrt;
|
||||
int errsv = 0;
|
||||
|
||||
close(STDIN_FILENO);
|
||||
#ifdef HAVE_LIBUTIL
|
||||
|
@ -417,12 +417,9 @@ dooutput(FILE *timingfd) {
|
|||
fprintf(fscript, _("Script started on %s"), obuf);
|
||||
|
||||
do {
|
||||
if (die && flgs == 0) {
|
||||
/* ..child is dead, but it doesn't mean that there is
|
||||
* nothing in buffers.
|
||||
*/
|
||||
flgs = fcntl(master, F_GETFL, 0);
|
||||
if (fcntl(master, F_SETFL, (flgs | O_NONBLOCK)) == -1)
|
||||
if (die || errsv == EINTR) {
|
||||
struct pollfd fds[] = {{ .fd = master, .events = POLLIN }};
|
||||
if (poll(fds, 1, 50) <= 0)
|
||||
break;
|
||||
}
|
||||
if (tflg)
|
||||
|
@ -430,12 +427,10 @@ dooutput(FILE *timingfd) {
|
|||
|
||||
errno = 0;
|
||||
cc = read(master, obuf, sizeof (obuf));
|
||||
errsv = errno;
|
||||
|
||||
if (die && errno == EINTR && cc <= 0)
|
||||
/* read() has been interrupted by SIGCHLD, try it again
|
||||
* with O_NONBLOCK
|
||||
*/
|
||||
continue;
|
||||
if (errsv == EINTR && cc <= 0)
|
||||
continue; /* try it again */
|
||||
if (cc <= 0)
|
||||
break;
|
||||
if (tflg) {
|
||||
|
@ -443,11 +438,6 @@ dooutput(FILE *timingfd) {
|
|||
fprintf(timingfd, "%f %zd\n", newtime - oldtime, cc);
|
||||
oldtime = newtime;
|
||||
}
|
||||
wrt = write(STDOUT_FILENO, obuf, cc);
|
||||
if (wrt < 0) {
|
||||
warn (_("write failed"));
|
||||
fail();
|
||||
}
|
||||
fwrt = fwrite(obuf, 1, cc, fscript);
|
||||
if (fwrt < cc) {
|
||||
warn (_("cannot write script file"));
|
||||
|
@ -455,10 +445,13 @@ dooutput(FILE *timingfd) {
|
|||
}
|
||||
if (fflg)
|
||||
fflush(fscript);
|
||||
wrt = write(STDOUT_FILENO, obuf, cc);
|
||||
if (wrt < 0) {
|
||||
warn (_("write failed"));
|
||||
fail();
|
||||
}
|
||||
} while(1);
|
||||
|
||||
if (flgs)
|
||||
fcntl(master, F_SETFL, flgs);
|
||||
if (close_stream(timingfd) != 0)
|
||||
errx(EXIT_FAILURE, _("write error"));
|
||||
done();
|
||||
|
@ -536,12 +529,11 @@ done(void) {
|
|||
|
||||
if (subchild) {
|
||||
/* output process */
|
||||
if (!qflg) {
|
||||
char buf[BUFSIZ];
|
||||
tvec = time((time_t *)NULL);
|
||||
my_strftime(buf, sizeof buf, "%c\n", localtime(&tvec));
|
||||
fprintf(fscript, _("\nScript done on %s"), buf);
|
||||
}
|
||||
|
||||
if (close_stream(fscript) != 0)
|
||||
errx(EXIT_FAILURE, _("write error"));
|
||||
close(master);
|
||||
|
|
Loading…
Reference in New Issue