Closed Bug 21750 Opened 25 years ago Closed 25 years ago

The fcntl() calls on an accepted socket can be omitted on some Unix flavors.

Categories

(NSPR :: NSPR, defect, P3)

Sun
Solaris
defect

Tracking

(Not tracked)

RESOLVED FIXED

People

(Reporter: wtc, Assigned: wtc)

Details

Attachments

(1 file)

In ptio.c, pt_SetMethods, we make two fcntl() calls
to set a socket (TCP or UDP) nonblocking.  For an
accepted socket returned by an accept() call, these
two fcntl() calls can be omitted on some Unix flavors
(e.g., Solaris) because the O_NONBLOCK flag is
inherited from the listening socket.
Status: NEW → ASSIGNED
Our Sun and IBM contacts confirmed that a newly
accepted socket inherits the O_NONBLOCK flag of
the listening socket on Solaris and AIX.

Our HP contact pointed out that while a newly
accepted socket does not inherit the O_NONBLOCK
flag of the listening socket, it does inherit
the SS_NBIO socket state flag, which is set by
ioctl() FIOSNBIO (see the socket(7) man page on
HP-UX).  If we want the newly accepted socket to
inherit nonblocking mode, we need to use the
ioctl() FIOSNBIO method.  (There are three methods
for putting a socket into nonblocking mode on HP-UX:
fcntl() O_NONBLOCK, fcntl() O_NDELAY, and ioctl()
FIOSNBIO.)
I ran my test on AIX, HP-UX, IRIX, Linux, OSF1, and Solaris.
The results are:
- Inherited: AIX, HP-UX, IRIX, and Solaris.
- Not inherited: Linux and OSF1.

On the platforms where non-blocking mode is
inherited by accepted sockets, we define the
macro _PR_ACCEPT_INHERIT_NONBLOCK.

I added a new argument 'isAcceptedSocket' to
pt_SetMethods() so that we can tell if the
osfd is an accepted socket.

I checked in my fix to NSPRPUB_RELEASE_4_0_BRANCH.
/cvsroot/mozilla/nsprpub/pr/include/md/_aix.h, revision 3.7.18.1
/cvsroot/mozilla/nsprpub/pr/include/md/_hpux.h, revision 3.6.18.1
/cvsroot/mozilla/nsprpub/pr/include/md/_irix.h, revision 3.7.4.1
/cvsroot/mozilla/nsprpub/pr/include/md/_solaris.h, revision 3.10.4.1
/cvsroot/mozilla/nsprpub/pr/src/pthreads/ptio.c, revision 3.42.4.3
Status: ASSIGNED → RESOLVED
Closed: 25 years ago
Resolution: --- → FIXED
On OpenVMS, the tcpip code is NOT part of the O/S, and there are several 
different tcpip implementations that are available. Since we never know which 
tcpip code we are going to running on, we have no choice but to err on the side 
of caution. I would therefore suggest that for OpenVMS you keep doing the fcntl 
calls to be safe.

Colin.
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: