From: "Erich E. Hoover" Subject: [PATCH 1/5] server: Implement socket-specific ioctl() routine. Message-Id: Date: Thu, 3 Apr 2014 10:13:06 -0600 AJ requested that the interface change notification code be split up as much as possible, so I have attempted to do that as much as possible in this patch series with creating a lot of dead code. 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. From a0625ca7d07703028fdad511c37c587e213ff481 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. --- server/sock.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/server/sock.c b/server/sock.c index 5ffb1fe..3eb1bdf 100644 --- a/server/sock.c +++ b/server/sock.c @@ -49,6 +49,8 @@ #include "windef.h" #include "winternl.h" #include "winerror.h" +#define USE_WS_PREFIX +#include "winsock2.h" #include "process.h" #include "file.h" @@ -83,9 +85,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 */ @@ -117,6 +116,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 ); @@ -151,7 +152,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 */ @@ -518,6 +519,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.7.9.5