Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/ntdll/unix/socket.c | 42 ++++++++++++++++++++++++++++++++++++++++ include/wine/afd.h | 1 + 2 files changed, 43 insertions(+)
diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c index cfc5780b082..16df04b6cb1 100644 --- a/dlls/ntdll/unix/socket.c +++ b/dlls/ntdll/unix/socket.c @@ -25,6 +25,9 @@ #include "config.h" #include <errno.h> #include <unistd.h> +#ifdef HAVE_SYS_IOCTL_H +# include <sys/ioctl.h> +#endif #ifdef HAVE_SYS_SOCKET_H #include <sys/socket.h> #endif @@ -1274,6 +1277,45 @@ NTSTATUS sock_ioctl( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc status = sock_poll( handle, event, apc, apc_user, io, in_buffer, in_size, out_buffer, out_size ); break;
+ case IOCTL_AFD_WINE_FIONREAD: + { + int value, ret; + + if (out_size < sizeof(int)) + { + status = STATUS_BUFFER_TOO_SMALL; + break; + } + + if ((status = server_get_unix_fd( handle, 0, &fd, &needs_close, NULL, NULL ))) + return status; + +#ifdef linux + { + socklen_t len = sizeof(value); + + /* FIONREAD on a listening socket always fails (see tcp(7)). */ + if (!getsockopt( fd, SOL_SOCKET, SO_ACCEPTCONN, &value, &len ) && value) + { + *(int *)out_buffer = 0; + status = STATUS_SUCCESS; + complete_async( handle, event, apc, apc_user, io, status, 0 ); + break; + } + } +#endif + + if ((ret = ioctl( fd, FIONREAD, &value )) < 0) + { + status = sock_errno_to_status( errno ); + break; + } + *(int *)out_buffer = value; + status = STATUS_SUCCESS; + complete_async( handle, event, apc, apc_user, io, status, 0 ); + break; + } + default: { if ((code >> 16) == FILE_DEVICE_NETWORK) diff --git a/include/wine/afd.h b/include/wine/afd.h index 77801b1fbe3..0c19c8e0f58 100644 --- a/include/wine/afd.h +++ b/include/wine/afd.h @@ -98,6 +98,7 @@ struct afd_poll_params #define IOCTL_AFD_WINE_ADDRESS_LIST_CHANGE CTL_CODE(FILE_DEVICE_NETWORK, 208, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_AFD_WINE_FIONBIO CTL_CODE(FILE_DEVICE_NETWORK, 209, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_AFD_WINE_COMPLETE_ASYNC CTL_CODE(FILE_DEVICE_NETWORK, 210, METHOD_BUFFERED, FILE_ANY_ACCESS) +#define IOCTL_AFD_WINE_FIONREAD CTL_CODE(FILE_DEVICE_NETWORK, 211, METHOD_BUFFERED, FILE_ANY_ACCESS)
struct afd_create_params {