mirror of
https://github.com/koverstreet/bcachefs-tools.git
synced 2025-02-23 00:00:02 +03:00
fix splice_fd_to_stdinout() when stdin is closed
We need to check when stdin has been closed - otherwise we'll spin because select() will return immediately. Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
b3677f3040
commit
ec2d118738
@ -60,14 +60,18 @@ static int splice_fd_to_stdinout(int fd)
|
|||||||
setnonblocking(STDIN_FILENO);
|
setnonblocking(STDIN_FILENO);
|
||||||
setnonblocking(fd);
|
setnonblocking(fd);
|
||||||
|
|
||||||
|
bool stdin_closed = false;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
fd_set fds;
|
fd_set fds;
|
||||||
|
|
||||||
FD_ZERO(&fds);
|
FD_ZERO(&fds);
|
||||||
FD_SET(STDIN_FILENO, &fds);
|
|
||||||
FD_SET(fd, &fds);
|
FD_SET(fd, &fds);
|
||||||
|
if (!stdin_closed)
|
||||||
|
FD_SET(STDIN_FILENO, &fds);
|
||||||
|
|
||||||
select(fd + 1, &fds, NULL, NULL, NULL);
|
if (select(fd + 1, &fds, NULL, NULL, NULL) < 0)
|
||||||
|
die("select error: %m");
|
||||||
|
|
||||||
int r = do_splice(fd, STDOUT_FILENO);
|
int r = do_splice(fd, STDOUT_FILENO);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
@ -78,6 +82,8 @@ static int splice_fd_to_stdinout(int fd)
|
|||||||
r = do_splice(STDIN_FILENO, fd);
|
r = do_splice(STDIN_FILENO, fd);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return r;
|
return r;
|
||||||
|
if (r)
|
||||||
|
stdin_closed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return close(fd);
|
return close(fd);
|
||||||
|
Loading…
Reference in New Issue
Block a user