Skip to content

Commit 6c67b5f

Browse files
committed
Use SO_LINGER_SEC if available (MacOS)
1 parent 6c89842 commit 6c67b5f

File tree

2 files changed

+12
-2
lines changed

2 files changed

+12
-2
lines changed

ext/standard/tests/network/so_linger.phpt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,17 @@ if (!$accepted) {
4747
die('Unable to accept connection');
4848
}
4949

50+
$so_linger = PHP_OS_FAMILY === 'Darwin' ? SO_LINGER_SEC : SO_LINGER;
51+
5052
// Verify server side (accepted connection)
5153
$server_sock = socket_import_stream($accepted);
52-
$server_linger = socket_get_option($server_sock, SOL_SOCKET, SO_LINGER);
54+
$server_linger = socket_get_option($server_sock, SOL_SOCKET, $so_linger);
5355
echo "Server SO_LINGER\n";
5456
var_dump($server_linger);
5557

5658
// Verify client side
5759
$client_sock = socket_import_stream($client);
58-
$client_linger = socket_get_option($client_sock, SOL_SOCKET, SO_LINGER);
60+
$client_linger = socket_get_option($client_sock, SOL_SOCKET, $so_linger);
5961
echo "Client SO_LINGER\n";
6062
var_dump($client_linger);
6163

main/network.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,11 @@ php_socket_t php_network_bind_socket_to_local_addr_ex(const char *host, unsigned
547547
.l_onoff = (sockvals->linger > 0),
548548
.l_linger = (unsigned short)sockvals->linger
549549
};
550+
#ifdef SO_LINGER_SEC
551+
setsockopt(sock, SOL_SOCKET, SO_LINGER_SEC, (char*)&linger_val, sizeof(linger_val));
552+
#else
550553
setsockopt(sock, SOL_SOCKET, SO_LINGER, (char*)&linger_val, sizeof(linger_val));
554+
#endif
551555
}
552556
#endif
553557
#if defined(TCP_KEEPIDLE)
@@ -1042,7 +1046,11 @@ php_socket_t php_network_connect_socket_to_host_ex(const char *host, unsigned sh
10421046
.l_onoff = (sockvals->linger > 0),
10431047
.l_linger = (unsigned short)sockvals->linger
10441048
};
1049+
#ifdef SO_LINGER_SEC
1050+
setsockopt(sock, SOL_SOCKET, SO_LINGER_SEC, (char*)&linger_val, sizeof(linger_val));
1051+
#else
10451052
setsockopt(sock, SOL_SOCKET, SO_LINGER, (char*)&linger_val, sizeof(linger_val));
1053+
#endif
10461054
}
10471055
#endif
10481056
#if defined(TCP_KEEPIDLE)

0 commit comments

Comments
 (0)