pipe_command(): handle ENOSPC when writing to a pipe

When write() to a non-blocking pipe fails because the buffer is full,
POSIX says we should see EAGAIN. But our mingw_write() compat layer on
Windows actually returns ENOSPC for this case. This is probably
something we want to correct, but given that we don't plan to use
non-blocking descriptors in a lot of places, we can work around it by
just catching ENOSPC alongside EAGAIN. If we ever do fix mingw_write(),
then this patch can be reverted.

We don't actually use a non-blocking pipe yet, so this is still just
preparation.

Helped-by: René Scharfe <l.s.r@web.de>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Jeff King 2022-08-17 02:09:42 -04:00 committed by Junio C Hamano
parent 14eab817e4
commit c6d3cce6f3
1 changed files with 2 additions and 1 deletions

View File

@ -1377,7 +1377,8 @@ static int pump_io_round(struct io_pump *slots, int nr, struct pollfd *pfd)
io->u.out.len <= MAX_IO_SIZE ?
io->u.out.len : MAX_IO_SIZE);
if (len < 0) {
if (errno != EINTR && errno != EAGAIN) {
if (errno != EINTR && errno != EAGAIN &&
errno != ENOSPC) {
io->error = errno;
close(io->fd);
io->fd = -1;