Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/ntdll/unix/socket.c | 33 +++++++++++++++++++++++++++++++++ dlls/ws2_32/socket.c | 5 +++-- include/wine/afd.h | 1 + 3 files changed, 37 insertions(+), 2 deletions(-)
diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c index 8b140ce4930..f9f701f734c 100644 --- a/dlls/ntdll/unix/socket.c +++ b/dlls/ntdll/unix/socket.c @@ -1684,6 +1684,39 @@ NTSTATUS sock_ioctl( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc case IOCTL_AFD_WINE_SET_IP_BLOCK_SOURCE: return do_setsockopt( handle, io, IPPROTO_IP, IP_BLOCK_SOURCE, in_buffer, in_size );
+ case IOCTL_AFD_WINE_GET_IP_DONTFRAGMENT: + { + socklen_t len = out_size; + int ret; + + if ((status = server_get_unix_fd( handle, 0, &fd, &needs_close, NULL, NULL ))) + return status; + +#ifdef IP_DONTFRAG + ret = getsockopt( fd, IPPROTO_IP, IP_DONTFRAG, out_buffer, &len ); +#elif defined(IP_MTU_DISCOVER) && defined(IP_PMTUDISC_DONT) + { + int value; + + len = sizeof(value); + ret = getsockopt( fd, IPPROTO_IP, IP_MTU_DISCOVER, &value, &len ); + if (!ret) *(DWORD *)out_buffer = (value != IP_PMTUDISC_DONT); + } +#else + { + static int once; + + if (!once++) + FIXME( "IP_DONTFRAGMENT is not supported on this platform\n" ); + ret = 0; /* fake success */ + } +#endif + if (needs_close) close( fd ); + if (ret) return sock_errno_to_status( errno ); + io->Information = len; + return STATUS_SUCCESS; + } + default: { if ((code >> 16) == FILE_DEVICE_NETWORK) diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index 00b83d06478..963d55ead2c 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -2433,6 +2433,9 @@ INT WINAPI WS_getsockopt(SOCKET s, INT level, case WS_IPPROTO_IP: switch(optname) { + case WS_IP_DONTFRAGMENT: + return server_getsockopt( s, IOCTL_AFD_WINE_GET_IP_DONTFRAGMENT, optval, optlen ); + #ifdef IP_HDRINCL case WS_IP_HDRINCL: #endif @@ -2458,8 +2461,6 @@ INT WINAPI WS_getsockopt(SOCKET s, INT level, } release_sock_fd( s, fd ); return ret; - case WS_IP_DONTFRAGMENT: - return get_dont_fragment(s, IPPROTO_IP, (BOOL *)optval) ? 0 : SOCKET_ERROR;
default: FIXME( "unrecognized IP option %u\n", optname ); diff --git a/include/wine/afd.h b/include/wine/afd.h index 4ed75067264..13ede0d2450 100644 --- a/include/wine/afd.h +++ b/include/wine/afd.h @@ -184,6 +184,7 @@ struct afd_get_events_params #define IOCTL_AFD_WINE_SET_IP_ADD_MEMBERSHIP WINE_AFD_IOC(239) #define IOCTL_AFD_WINE_SET_IP_ADD_SOURCE_MEMBERSHIP WINE_AFD_IOC(240) #define IOCTL_AFD_WINE_SET_IP_BLOCK_SOURCE WINE_AFD_IOC(241) +#define IOCTL_AFD_WINE_GET_IP_DONTFRAGMENT WINE_AFD_IOC(242)
struct afd_create_params {