cvs commit: src/sys/kern uipc_socket.c
John Baldwin
jhb at freebsd.org
Tue Oct 7 22:40:19 UTC 2008
On Tuesday 07 October 2008 04:57:55 pm Robert Watson wrote:
> rwatson 2008-10-07 20:57:55 UTC
>
> FreeBSD src repository
>
> Modified files:
> sys/kern uipc_socket.c
> Log:
> SVN rev 183675 on 2008-10-07 20:57:55Z by rwatson
>
> In soreceive_dgram, when a 0-length buffer is passed into recv(2) and
> no data is ready, return 0 rather than blocking or returning EAGAIN.
> This is consistent with the behavior of soreceive_generic (soreceive)
> in earlier versions of FreeBSD, and restores this behavior for UDP.
>
> Discussed with: jhb, sam
> MFC after: 3 days
I do find this behavior odd though. I would expect
recv(fd, NULL, 0)
to discard the next packet from the socket if one is available rather than
returning success and not doing anything (and it seems that this is what it
does both before and now). Similarly, I would expect recv(fd, NULL, 0) to
block on a blocking socket if there isn't a packet available. It would be
orthogonal then to return EAGAIN in this case (no packet available,
zero-length user buffer) on a non-blocking socket.
It seems that Solaris dropped this behavior (return 0) from their recv()
system call sometime after SunOS 4.0 from comments in the OpenSolaris source.
From reading __skb_recv_datagram(), it seems that Linux 2.6 returns EAGAIN.
NetBSD and OS X both have the odd behavior. OpenBSD has the odd behavior,
but with a caveat of sorts having to do with control messages. OpenBSD
cvsweb annotate is down though, so I haven't found the reason for their
change.
--
John Baldwin
More information about the cvs-src
mailing list