script: exit if reading from pseudo-tty errors out (do not loop)
function old new delta script_main 991 966 -25
This commit is contained in:
parent
dddfaff363
commit
06ebc16461
@ -99,13 +99,12 @@ int script_main(int argc ATTRIBUTE_UNUSED, char **argv)
|
||||
/* parent */
|
||||
#define buf bb_common_bufsiz1
|
||||
struct pollfd pfd[2];
|
||||
struct pollfd *ppfd = pfd;
|
||||
int outfd, count, loop;
|
||||
|
||||
outfd = xopen(fname, mode);
|
||||
pfd[0].fd = 0;
|
||||
pfd[0].fd = pty;
|
||||
pfd[0].events = POLLIN;
|
||||
pfd[1].fd = pty;
|
||||
pfd[1].fd = 0;
|
||||
pfd[1].events = POLLIN;
|
||||
ndelay_on(pty); /* this descriptor is not shared, can do this */
|
||||
/* ndelay_on(0); - NO, stdin can be shared! Pity :( */
|
||||
@ -115,29 +114,17 @@ int script_main(int argc ATTRIBUTE_UNUSED, char **argv)
|
||||
/* TODO: don't use full_write's, use proper write buffering */
|
||||
while (fd_count) {
|
||||
/* not safe_poll! we want SIGCHLD to EINTR poll */
|
||||
if (poll(ppfd, fd_count, -1) < 0 && errno != EINTR) {
|
||||
if (poll(pfd, fd_count, -1) < 0 && errno != EINTR) {
|
||||
/* If child exits too quickly, we may get EIO:
|
||||
* for example, try "script -c true" */
|
||||
break;
|
||||
}
|
||||
if (pfd[0].revents) {
|
||||
count = safe_read(0, buf, sizeof(buf));
|
||||
if (count <= 0) {
|
||||
/* err/eof: don't read anymore */
|
||||
pfd[0].revents = 0;
|
||||
ppfd++;
|
||||
fd_count--;
|
||||
} else {
|
||||
full_write(pty, buf, count);
|
||||
}
|
||||
}
|
||||
if (pfd[1].revents) {
|
||||
errno = 0;
|
||||
count = safe_read(pty, buf, sizeof(buf));
|
||||
if (count <= 0 && errno != EAGAIN) {
|
||||
/* err/eof: don't read anymore */
|
||||
pfd[1].revents = 0;
|
||||
fd_count--;
|
||||
/* err/eof from pty: exit */
|
||||
goto restore;
|
||||
}
|
||||
if (count > 0) {
|
||||
full_write(1, buf, count);
|
||||
@ -147,6 +134,16 @@ int script_main(int argc ATTRIBUTE_UNUSED, char **argv)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (pfd[1].revents) {
|
||||
count = safe_read(0, buf, sizeof(buf));
|
||||
if (count <= 0) {
|
||||
/* err/eof from stdin: don't read stdin anymore */
|
||||
pfd[1].revents = 0;
|
||||
fd_count--;
|
||||
} else {
|
||||
full_write(pty, buf, count);
|
||||
}
|
||||
}
|
||||
}
|
||||
/* If loop was exited because SIGCHLD handler set fd_count to 0,
|
||||
* there still can be some buffered output. But not loop forever:
|
||||
@ -161,7 +158,7 @@ int script_main(int argc ATTRIBUTE_UNUSED, char **argv)
|
||||
full_write(1, buf, count);
|
||||
full_write(outfd, buf, count);
|
||||
}
|
||||
|
||||
restore:
|
||||
if (attr_ok == 0)
|
||||
tcsetattr(0, TCSAFLUSH, &tt);
|
||||
if (!(opt & 8)) /* not -q */
|
||||
|
Loading…
Reference in New Issue
Block a user