diff --git a/lib/tsocket/tsocket_bsd.c b/lib/tsocket/tsocket_bsd.c index 8ab2ffb0b83..72499561f2d 100644 --- a/lib/tsocket/tsocket_bsd.c +++ b/lib/tsocket/tsocket_bsd.c @@ -1744,6 +1744,7 @@ int _tdgram_unix_socket(const struct tsocket_address *local, struct tstream_bsd { int fd; + int error; void *event_ptr; struct tevent_fd *fde; @@ -1921,7 +1922,19 @@ static ssize_t tstream_bsd_pending_bytes(struct tstream_context *stream) return -1; } + if (bsds->error != 0) { + errno = bsds->error; + return -1; + } + ret = tsocket_bsd_pending(bsds->fd); + if (ret == -1) { + /* + * remember the error and don't + * allow further requests + */ + bsds->error = errno; + } return ret; } @@ -2029,9 +2042,15 @@ static void tstream_bsd_readv_handler(void *private_data) int _count; bool ok, retry; + if (bsds->error != 0) { + tevent_req_error(req, bsds->error); + return; + } + ret = readv(bsds->fd, state->vector, state->count); if (ret == 0) { /* propagate end of file */ + bsds->error = EPIPE; tevent_req_error(req, EPIPE); return; } @@ -2040,6 +2059,13 @@ static void tstream_bsd_readv_handler(void *private_data) /* retry later */ return; } + if (err != 0) { + /* + * remember the error and don't + * allow further requests + */ + bsds->error = err; + } if (tevent_req_error(req, err)) { return; } @@ -2172,9 +2198,15 @@ static void tstream_bsd_writev_handler(void *private_data) int _count; bool ok, retry; + if (bsds->error != 0) { + tevent_req_error(req, bsds->error); + return; + } + ret = writev(bsds->fd, state->vector, state->count); if (ret == 0) { /* propagate end of file */ + bsds->error = EPIPE; tevent_req_error(req, EPIPE); return; } @@ -2183,6 +2215,13 @@ static void tstream_bsd_writev_handler(void *private_data) /* retry later */ return; } + if (err != 0) { + /* + * remember the error and don't + * allow further requests + */ + bsds->error = err; + } if (tevent_req_error(req, err)) { return; }