Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 7 Oct 2008 17:36:50 -0400
From:      John Baldwin <jhb@freebsd.org>
To:        Robert Watson <rwatson@freebsd.org>
Cc:        cvs-src@freebsd.org, src-committers@freebsd.org, cvs-all@freebsd.org
Subject:   Re: cvs commit: src/sys/kern uipc_socket.c
Message-ID:  <200810071736.50999.jhb@freebsd.org>
In-Reply-To: <200810072058.m97Kw3q0073534@repoman.freebsd.org>
References:  <200810072058.m97Kw3q0073534@repoman.freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tuesday 07 October 2008 04:57:55 pm Robert Watson wrote:
> rwatson     2008-10-07 20:57:55 UTC
>=20
>   FreeBSD src repository
>=20
>   Modified files:
>     sys/kern             uipc_socket.c=20
>   Log:
>   SVN rev 183675 on 2008-10-07 20:57:55Z by rwatson
>  =20
>   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.
>  =20
>   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=
=20
returning success and not doing anything (and it seems that this is what it=
=20
does both before and now).  Similarly, I would expect recv(fd, NULL, 0) to=
=20
block on a blocking socket if there isn't a packet available.  It would be=
=20
orthogonal then to return EAGAIN in this case (no packet available,=20
zero-length user buffer) on a non-blocking socket.

It seems that Solaris dropped this behavior (return 0) from their recv()=20
system call sometime after SunOS 4.0 from comments in the OpenSolaris sourc=
e. =20
=46rom reading __skb_recv_datagram(), it seems that Linux 2.6 returns EAGAI=
N. =20
NetBSD and OS X both have the odd behavior.  OpenBSD has the odd behavior,=
=20
but with a caveat of sorts having to do with control messages.  OpenBSD=20
cvsweb annotate is down though, so I haven't found the reason for their=20
change.

=2D-=20
John Baldwin



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200810071736.50999.jhb>