From: "Erich E. Hoover" Subject: [PATCH 1/6] server: Implement socket-specific ioctl() routine. Message-Id: Date: Tue, 20 Jan 2015 14:45:54 -0700 This patchset fixes issues with Silverlight, Aeria Ignite, PlayOn, Family Tree Maker, and Sonos Desktop Controller (Bug #32328, and duplicates #36839, #37621, #34905, and #37921). These applications require the implementation of SIO_ADDRESS_LIST_CHANGE notifications on sockets. Now that unprocessed WSAIoctl() calls are forwarded to the server it makes sense to have a socket-specific ioctl() routine. The attached patch adds this routine and sets STATUS_NOT_SUPPORTED for all requests, though it specifically enumerates the SIO_ADDRESS_LIST_CHANGE request in preparation for the following patches. Note: Since AJ requested that delayed processing for blocking calls be handled on an ioctl()-specific basis this patch series has been reordered such that patch 2 and 3 are flipped compared to what was reviewed last time. From 67e01d522ff5e1ef925c249177dae8f349a4641f Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Thu, 3 Apr 2014 09:21:51 -0600 Subject: server: Implement socket-specific ioctl() routine. --- Makefile.in | 3 ++- server/sock.c | 26 ++++++++++++++++++++++---- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/Makefile.in b/Makefile.in index 5c163b8..b600cf7 100644 --- a/Makefile.in +++ b/Makefile.in @@ -52,7 +52,8 @@ __tooldeps__: libs/port libs/wine libs/wpp __builddeps__: __tooldeps__ include .PHONY: depend check test testclean crosstest __tooldeps__ __builddeps__ -loader server: libs/port libs/wine tools +loader: libs/port libs/wine tools +server: libs/port libs/wine tools include fonts: tools/sfnt2fon include: tools tools/widl libs/wine tools: libs/port diff --git a/server/sock.c b/server/sock.c index 7c0212e..6a75934 100644 --- a/server/sock.c +++ b/server/sock.c @@ -52,6 +52,8 @@ #include "windef.h" #include "winternl.h" #include "winerror.h" +#define USE_WS_PREFIX +#include "winsock2.h" #include "process.h" #include "file.h" @@ -86,9 +88,6 @@ #define FD_WINE_RAW 0x80000000 #define FD_WINE_INTERNAL 0xFFFF0000 -/* Constants for WSAIoctl() */ -#define WSA_FLAG_OVERLAPPED 0x01 - struct sock { struct object obj; /* object header */ @@ -121,6 +120,8 @@ static void sock_destroy( struct object *obj ); static int sock_get_poll_events( struct fd *fd ); static void sock_poll_event( struct fd *fd, int event ); static enum server_fd_type sock_get_fd_type( struct fd *fd ); +static obj_handle_t sock_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async, + int blocking, const void *data, data_size_t size ); static void sock_queue_async( struct fd *fd, const async_data_t *data, int type, int count ); static void sock_reselect_async( struct fd *fd, struct async_queue *queue ); static void sock_cancel_async( struct fd *fd, struct process *process, struct thread *thread, client_ptr_t iosb ); @@ -155,7 +156,7 @@ static const struct fd_ops sock_fd_ops = sock_poll_event, /* poll_event */ no_flush, /* flush */ sock_get_fd_type, /* get_fd_type */ - default_fd_ioctl, /* ioctl */ + sock_ioctl, /* ioctl */ sock_queue_async, /* queue_async */ sock_reselect_async, /* reselect_async */ sock_cancel_async /* cancel_async */ @@ -523,6 +524,23 @@ static enum server_fd_type sock_get_fd_type( struct fd *fd ) return FD_TYPE_SOCKET; } +obj_handle_t sock_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async_data, + int blocking, const void *data, data_size_t size ) +{ + struct sock *sock = get_fd_user( fd ); + + assert( sock->obj.ops == &sock_ops ); + + switch(code) + { + case WS_SIO_ADDRESS_LIST_CHANGE: + /* intentional fallthrough, not yet supported */ + default: + set_error( STATUS_NOT_SUPPORTED ); + return 0; + } +} + static void sock_queue_async( struct fd *fd, const async_data_t *data, int type, int count ) { struct sock *sock = get_fd_user( fd ); -- 1.9.1