@ -625,10 +625,12 @@ set_inheritable(int fd, int inheritable, int raise, int *atomic_flag_works)
# ifdef MS_WINDOWS
HANDLE handle ;
DWORD flags ;
# elif defined(HAVE_SYS_IOCTL_H) && defined(FIOCLEX) && defined(FIONCLEX)
# else
# if defined(HAVE_SYS_IOCTL_H) && defined(FIOCLEX) && defined(FIONCLEX)
static int ioctl_works = - 1 ;
int request ;
int err ;
# elif defined(HAVE_FCNTL_H)
# endif
int flags ;
int res ;
# endif
@ -674,20 +676,38 @@ set_inheritable(int fd, int inheritable, int raise, int *atomic_flag_works)
}
return 0 ;
# elif defined(HAVE_SYS_IOCTL_H) && defined(FIOCLEX) && defined(FIONCLEX)
if ( inheritable )
request = FIONCLEX ;
else
request = FIOCLEX ;
err = ioctl ( fd , request , NULL ) ;
if ( err ) {
if ( raise )
PyErr_SetFromErrno ( PyExc_OSError ) ;
return - 1 ;
# else
# if defined(HAVE_SYS_IOCTL_H) && defined(FIOCLEX) && defined(FIONCLEX)
if ( ioctl_works ! = 0 ) {
/* fast-path: ioctl() only requires one syscall */
if ( inheritable )
request = FIONCLEX ;
else
request = FIOCLEX ;
err = ioctl ( fd , request , NULL ) ;
if ( ! err ) {
ioctl_works = 1 ;
return 0 ;
}
if ( errno ! = ENOTTY ) {
if ( raise )
PyErr_SetFromErrno ( PyExc_OSError ) ;
return - 1 ;
}
else {
/* Issue #22258: Here, ENOTTY means "Inappropriate ioctl for
device " . The ioctl is declared but not supported by the kernel.
Remember that ioctl ( ) doesn ' t work . It is the case on
Illumos - based OS for example . */
ioctl_works = 0 ;
}
/* fallback to fcntl() if ioctl() does not work */
}
return 0 ;
# endif
# else
/* slow-path: fcntl() requires two syscalls */
flags = fcntl ( fd , F_GETFD ) ;
if ( flags < 0 ) {
if ( raise )