On 8/16/21 11:58 PM, Alex Henrie wrote:
Windows supports none of these options on TCP. Linux supports all of them on TCP. Mac OS supports some of them on TCP, but sets EOPNOTSUPP instead of EINVAL for the ones that it doesn't support. So, Wine needs to do its own check for whether the option may be used with the socket.
Signed-off-by: Alex Henrie alexhenrie24@gmail.com
v3: No changes
dlls/ntdll/unix/socket.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+)
diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c index 1ac4365c012..4523ded1be7 100644 --- a/dlls/ntdll/unix/socket.c +++ b/dlls/ntdll/unix/socket.c @@ -1200,6 +1200,14 @@ static NTSTATUS do_setsockopt( HANDLE handle, IO_STATUS_BLOCK *io, int level, }
+static BOOL is_datagram_socket( HANDLE handle, IO_STATUS_BLOCK *io ) +{
- int sock_type = -1;
- do_getsockopt( handle, io, SOL_SOCKET, SO_TYPE, &sock_type, sizeof(sock_type) );
- return sock_type == SOCK_DGRAM;
+}
- NTSTATUS sock_ioctl( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc_user, IO_STATUS_BLOCK *io, ULONG code, void *in_buffer, ULONG in_size, void *out_buffer, ULONG out_size ) {
@@ -1767,18 +1775,23 @@ NTSTATUS sock_ioctl( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc #endif
case IOCTL_AFD_WINE_GET_IP_MULTICAST_IF:
if (!is_datagram_socket( handle, io )) return STATUS_INVALID_PARAMETER; return do_getsockopt( handle, io, IPPROTO_IP, IP_MULTICAST_IF, out_buffer, out_size );
While this will do the right thing if the socket handle is invalid, it's a bit ugly. I think it'd be better to check the return value of do_getsockopt() in is_datagram_socket(), in which case you also don't need to initialize sock_type.
I also don't think it makes sense to pass the IOSB to is_datagram_socket(); I'd probably just add a dummy IOSB to is_datagram_socket() instead.
Sorry for not mentioning this last time... this was bothering me, but I couldn't put my finger on why.