@@ -1510,6 +1510,16 @@ int wolfIO_TcpConnect(SOCKET_T* sockfd, const char* ip, word16 port, int to_sec)
15101510#endif
15111511
15121512 * sockfd = (SOCKET_T )socket (addr .ss_family , SOCK_STREAM | SOCK_CLOEXEC , 0 );
1513+ #if !defined(USE_WINDOWS_API ) && defined(FD_CLOEXEC )
1514+ if (* sockfd <= SOCKET_INVALID && errno == EINVAL ) {
1515+ * sockfd = (SOCKET_T )socket (addr .ss_family , SOCK_STREAM , 0 );
1516+ if (* sockfd > SOCKET_INVALID ) {
1517+ int fdFlags = fcntl (* sockfd , F_GETFD );
1518+ if (fdFlags >= 0 )
1519+ (void )fcntl (* sockfd , F_SETFD , fdFlags | FD_CLOEXEC );
1520+ }
1521+ }
1522+ #endif
15131523#ifdef USE_WINDOWS_API
15141524 if (* sockfd == SOCKET_INVALID )
15151525#else
@@ -1588,11 +1598,31 @@ int wolfIO_TcpBind(SOCKET_T* sockfd, word16 port)
15881598 sin -> sin6_addr = in6addr_any ;
15891599 sin -> sin6_port = XHTONS (port );
15901600 * sockfd = (SOCKET_T )socket (AF_INET6 , SOCK_STREAM | SOCK_CLOEXEC , 0 );
1601+ #if defined(FD_CLOEXEC )
1602+ if (* sockfd <= SOCKET_INVALID && errno == EINVAL ) {
1603+ * sockfd = (SOCKET_T )socket (AF_INET6 , SOCK_STREAM , 0 );
1604+ if (* sockfd > SOCKET_INVALID ) {
1605+ int fdFlags = fcntl (* sockfd , F_GETFD );
1606+ if (fdFlags >= 0 )
1607+ (void )fcntl (* sockfd , F_SETFD , fdFlags | FD_CLOEXEC );
1608+ }
1609+ }
1610+ #endif
15911611#else
15921612 sin -> sin_family = AF_INET ;
15931613 sin -> sin_addr .s_addr = INADDR_ANY ;
15941614 sin -> sin_port = XHTONS (port );
15951615 * sockfd = (SOCKET_T )socket (AF_INET , SOCK_STREAM | SOCK_CLOEXEC , 0 );
1616+ #if defined(FD_CLOEXEC )
1617+ if (* sockfd <= SOCKET_INVALID && errno == EINVAL ) {
1618+ * sockfd = (SOCKET_T )socket (AF_INET , SOCK_STREAM , 0 );
1619+ if (* sockfd > SOCKET_INVALID ) {
1620+ int fdFlags = fcntl (* sockfd , F_GETFD );
1621+ if (fdFlags >= 0 )
1622+ (void )fcntl (* sockfd , F_SETFD , fdFlags | FD_CLOEXEC );
1623+ }
1624+ }
1625+ #endif
15961626#endif
15971627
15981628#ifdef USE_WINDOWS_API
@@ -1642,6 +1672,16 @@ int wolfIO_TcpAccept(SOCKET_T sockfd, SOCKADDR* peer_addr, XSOCKLENT* peer_len)
16421672#if !defined(USE_WINDOWS_API ) && !defined(WOLFSSL_ZEPHYR ) && \
16431673 (defined(__linux__ ) || defined(__ANDROID__ ))
16441674 fd = (int )accept4 (sockfd , peer_addr , peer_len , SOCK_CLOEXEC );
1675+ if (fd < 0 && (errno == ENOSYS || errno == EINVAL )) {
1676+ fd = (int )accept (sockfd , peer_addr , peer_len );
1677+ #ifdef FD_CLOEXEC
1678+ if (fd >= 0 ) {
1679+ int fdFlags = fcntl (fd , F_GETFD );
1680+ if (fdFlags >= 0 )
1681+ (void )fcntl (fd , F_SETFD , fdFlags | FD_CLOEXEC );
1682+ }
1683+ #endif
1684+ }
16451685#else
16461686 fd = (int )accept (sockfd , peer_addr , peer_len );
16471687#if defined(FD_CLOEXEC ) && !defined(USE_WINDOWS_API )
0 commit comments