[PATCH] sendfile erroniously returns ENOTCONN.
David G. Lawrence
dg at dglawrence.com
Fri Jan 2 21:41:11 PST 2004
> sendfile(2) returns ENOTCONN when the remote side has disconnected instead
> of EPIPE. Can this fix be applied? Is there a reason for it being the
> way it is? I know EPIPE can cause SIGPIPE which can cause problems, but
> the error here is incorrect, and considering that the manpage mentions
> EPIPE as a possible error... is this perhaps due to a change in the
> socket flags API? I know the problem is on 4.x and 5.x.
>
> Index: uipc_syscalls.c
> ===================================================================
> RCS file: /home/ncvs/src/sys/kern/uipc_syscalls.c,v
> retrieving revision 1.162
> diff -u -r1.162 uipc_syscalls.c
> --- uipc_syscalls.c 28 Dec 2003 08:57:08 -0000 1.162
> +++ uipc_syscalls.c 2 Jan 2004 21:56:10 -0000
> @@ -1697,10 +1697,6 @@
> error = EINVAL;
> goto done;
> }
> - if ((so->so_state & SS_ISCONNECTED) == 0) {
> - error = ENOTCONN;
> - goto done;
> - }
> if (uap->offset < 0) {
> error = EINVAL;
> goto done;
sendfile(8) tries to maintain compatibility with sosend as much as is
reasonable. ENOTCONN is the appropriate error to return if the socket
isn't connected. sosend checks SS_CANTSENDMORE prior to the check for
SS_ISCONNECTED, however, and returns EPIPE in that case. Perhaps sendfile
should be changed to do the same (just a though - I'm not proposing
that this be done).
Removing the check entirely seems clearly wrong, however.
-DG
David G. Lawrence
President
Download Technologies, Inc. - http://www.downloadtech.com - (866) 399 8500
TeraSolutions, Inc. - http://www.terasolutions.com - (888) 346 7175
The FreeBSD Project - http://www.freebsd.org
Pave the road of life with opportunities.
More information about the freebsd-hackers
mailing list