mirror of
https://github.com/cuberite/libevent.git
synced 2025-09-10 04:50:37 -04:00
Solaris sendfile: correctly detect amount of data sent
Original message: Solaris sendfile seems to fail when sending moderately large (<1GB) files. Not a 32/64 problem, but a buffer problem. Anyone else ever try this? It is definitely broken in http-server.c. It seems to be broken in the following way: When sendfile sends partial data (EAGAIN, would block), "res" is always -1, rather than the amount sent. Here's a patch that reads from the "offset" pointer instead to discover what was sent. This seems to work:
This commit is contained in:
parent
aff6ba15a1
commit
643922e907
16
buffer.c
16
buffer.c
@ -2267,12 +2267,18 @@ evbuffer_write_sendfile(struct evbuffer *buffer, evutil_socket_t fd,
|
|||||||
}
|
}
|
||||||
return (res);
|
return (res);
|
||||||
#elif defined(SENDFILE_IS_SOLARIS)
|
#elif defined(SENDFILE_IS_SOLARIS)
|
||||||
res = sendfile(fd, info->fd, &offset, chain->off);
|
{
|
||||||
if (res == -1 && EVUTIL_ERR_RW_RETRIABLE(errno)) {
|
const off_t offset_orig = offset;
|
||||||
/* if this is EAGAIN or EINTR return 0; otherwise, -1 */
|
res = sendfile(fd, info->fd, &offset, chain->off);
|
||||||
return (0);
|
if (res == -1 && EVUTIL_ERR_RW_RETRIABLE(errno)) {
|
||||||
|
if (offset - offset_orig)
|
||||||
|
return offset - offset_orig;
|
||||||
|
/* if this is EAGAIN or EINTR and no bytes were
|
||||||
|
* written, return 0 */
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
return (res);
|
||||||
}
|
}
|
||||||
return (res);
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user