From 94397ba652641c12d1b33e4e15545e9f2ed2c71e Mon Sep 17 00:00:00 2001 From: Erich Hoover Date: Sat, 8 May 2010 16:13:27 -0600 Subject: server: Add mechanism for storing an interface ID with a socket. --- include/wine/server_protocol.h | 38 +++++++++++++++++++++++++++++++++++++- server/protocol.def | 17 +++++++++++++++++ server/request.h | 13 +++++++++++++ server/sock.c | 30 ++++++++++++++++++++++++++++++ server/trace.c | 24 ++++++++++++++++++++++++ 5 files changed, 121 insertions(+), 1 deletions(-) diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 24790a5..5c37e89 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -1379,6 +1379,36 @@ struct get_socket_event_reply +struct set_socket_iface_request +{ + struct request_header __header; + obj_handle_t handle; + int iface; + char __pad_20[4]; + client_ptr_t lock; +}; +struct set_socket_iface_reply +{ + struct reply_header __header; +}; + + + +struct get_socket_iface_request +{ + struct request_header __header; + obj_handle_t handle; +}; +struct get_socket_iface_reply +{ + struct reply_header __header; + int iface; + char __pad_12[4]; + client_ptr_t lock; +}; + + + struct enable_socket_event_request { struct request_header __header; @@ -4789,6 +4819,8 @@ enum request REQ_accept_socket, REQ_set_socket_event, REQ_get_socket_event, + REQ_set_socket_iface, + REQ_get_socket_iface, REQ_enable_socket_event, REQ_set_socket_deferred, REQ_alloc_console, @@ -5038,6 +5070,8 @@ union generic_request struct accept_socket_request accept_socket_request; struct set_socket_event_request set_socket_event_request; struct get_socket_event_request get_socket_event_request; + struct set_socket_iface_request set_socket_iface_request; + struct get_socket_iface_request get_socket_iface_request; struct enable_socket_event_request enable_socket_event_request; struct set_socket_deferred_request set_socket_deferred_request; struct alloc_console_request alloc_console_request; @@ -5285,6 +5319,8 @@ union generic_reply struct accept_socket_reply accept_socket_reply; struct set_socket_event_reply set_socket_event_reply; struct get_socket_event_reply get_socket_event_reply; + struct set_socket_iface_reply set_socket_iface_reply; + struct get_socket_iface_reply get_socket_iface_reply; struct enable_socket_event_reply enable_socket_event_reply; struct set_socket_deferred_reply set_socket_deferred_reply; struct alloc_console_reply alloc_console_reply; @@ -5483,6 +5519,6 @@ union generic_reply struct set_cursor_reply set_cursor_reply; }; -#define SERVER_PROTOCOL_VERSION 400 +#define SERVER_PROTOCOL_VERSION 401 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */ diff --git a/server/protocol.def b/server/protocol.def index 5015e97..a9c82c2 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -1112,6 +1112,23 @@ enum server_fd_type @END +/* Set socket interface ID */ +@REQ(set_socket_iface) + obj_handle_t handle; /* handle to the socket */ + int iface; /* interface ID */ + client_ptr_t lock; /* interface critical section */ +@END + + +/* Get socket interface ID */ +@REQ(get_socket_iface) + obj_handle_t handle; /* handle to the socket */ +@REPLY + int iface; /* interface ID */ + client_ptr_t lock; /* interface critical section */ +@END + + /* Reenable pending socket events */ @REQ(enable_socket_event) obj_handle_t handle; /* handle to the socket */ diff --git a/server/request.h b/server/request.h index 604d115..12cce60 100644 --- a/server/request.h +++ b/server/request.h @@ -157,6 +157,8 @@ DECL_HANDLER(create_socket); DECL_HANDLER(accept_socket); DECL_HANDLER(set_socket_event); DECL_HANDLER(get_socket_event); +DECL_HANDLER(set_socket_iface); +DECL_HANDLER(get_socket_iface); DECL_HANDLER(enable_socket_event); DECL_HANDLER(set_socket_deferred); DECL_HANDLER(alloc_console); @@ -405,6 +407,8 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] = (req_handler)req_accept_socket, (req_handler)req_set_socket_event, (req_handler)req_get_socket_event, + (req_handler)req_set_socket_iface, + (req_handler)req_get_socket_iface, (req_handler)req_enable_socket_event, (req_handler)req_set_socket_deferred, (req_handler)req_alloc_console, @@ -938,6 +942,15 @@ C_ASSERT( FIELD_OFFSET(struct get_socket_event_reply, mask) == 8 ); C_ASSERT( FIELD_OFFSET(struct get_socket_event_reply, pmask) == 12 ); C_ASSERT( FIELD_OFFSET(struct get_socket_event_reply, state) == 16 ); C_ASSERT( sizeof(struct get_socket_event_reply) == 24 ); +C_ASSERT( FIELD_OFFSET(struct set_socket_iface_request, handle) == 12 ); +C_ASSERT( FIELD_OFFSET(struct set_socket_iface_request, iface) == 16 ); +C_ASSERT( FIELD_OFFSET(struct set_socket_iface_request, lock) == 24 ); +C_ASSERT( sizeof(struct set_socket_iface_request) == 32 ); +C_ASSERT( FIELD_OFFSET(struct get_socket_iface_request, handle) == 12 ); +C_ASSERT( sizeof(struct get_socket_iface_request) == 16 ); +C_ASSERT( FIELD_OFFSET(struct get_socket_iface_reply, iface) == 8 ); +C_ASSERT( FIELD_OFFSET(struct get_socket_iface_reply, lock) == 16 ); +C_ASSERT( sizeof(struct get_socket_iface_reply) == 24 ); C_ASSERT( FIELD_OFFSET(struct enable_socket_event_request, handle) == 12 ); C_ASSERT( FIELD_OFFSET(struct enable_socket_event_request, mask) == 16 ); C_ASSERT( FIELD_OFFSET(struct enable_socket_event_request, sstate) == 20 ); diff --git a/server/sock.c b/server/sock.c index b460fa7..e0d2706 100644 --- a/server/sock.c +++ b/server/sock.c @@ -109,6 +109,7 @@ struct sock struct sock *deferred; /* socket that waits for a deferred accept */ struct async_queue *read_q; /* queue for asynchronous reads */ struct async_queue *write_q; /* queue for asynchronous writes */ + int iface_index; /* interface ID for interface-specific sockets */ }; static void sock_dump( struct object *obj, int verbose ); @@ -637,6 +638,7 @@ static struct object *create_socket( int family, int type, int protocol, unsigne sock->deferred = NULL; sock->read_q = NULL; sock->write_q = NULL; + sock->iface_index = 0; memset( sock->errors, 0, sizeof(sock->errors) ); if (!(sock->fd = create_anonymous_fd( &sock_fd_ops, sockfd, &sock->obj, (flags & WSA_FLAG_OVERLAPPED) ? 0 : FILE_SYNCHRONOUS_IO_NONALERT ))) @@ -708,6 +710,7 @@ static struct sock *accept_socket( obj_handle_t handle ) acceptsock->deferred = NULL; acceptsock->read_q = NULL; acceptsock->write_q = NULL; + acceptsock->iface_index = 0; memset( acceptsock->errors, 0, sizeof(acceptsock->errors) ); if (!(acceptsock->fd = create_anonymous_fd( &sock_fd_ops, acceptfd, &acceptsock->obj, get_fd_options( sock->fd ) ))) @@ -873,6 +876,33 @@ DECL_HANDLER(accept_socket) } } +/* set socket interface */ +DECL_HANDLER(set_socket_iface) +{ + struct sock *sock; + + if (!(sock = (struct sock *)get_handle_obj( current->process, req->handle, + FILE_WRITE_ATTRIBUTES, &sock_ops))) return; + sock->iface_index = req->iface; + release_object( &sock->obj ); +} + +/* get socket interface */ +DECL_HANDLER(get_socket_iface) +{ + struct sock *sock; + + sock = (struct sock *)get_handle_obj( current->process, req->handle, FILE_READ_ATTRIBUTES, &sock_ops ); + if (!sock) + { + reply->iface = 0; + set_error( WSAENOTSOCK ); + return; + } + reply->iface = sock->iface_index; + release_object( &sock->obj ); +} + /* set socket event parameters */ DECL_HANDLER(set_socket_event) { diff --git a/server/trace.c b/server/trace.c index c97bd70..fefa549 100644 --- a/server/trace.c +++ b/server/trace.c @@ -1563,6 +1563,24 @@ static void dump_get_socket_event_reply( const struct get_socket_event_reply *re dump_varargs_ints( ", errors=", cur_size ); } +static void dump_set_socket_iface_request( const struct set_socket_iface_request *req ) +{ + fprintf( stderr, " handle=%04x", req->handle ); + fprintf( stderr, ", iface=%d", req->iface ); + dump_uint64( ", lock=", &req->lock ); +} + +static void dump_get_socket_iface_request( const struct get_socket_iface_request *req ) +{ + fprintf( stderr, " handle=%04x", req->handle ); +} + +static void dump_get_socket_iface_reply( const struct get_socket_iface_reply *req ) +{ + fprintf( stderr, " iface=%d", req->iface ); + dump_uint64( ", lock=", &req->lock ); +} + static void dump_enable_socket_event_request( const struct enable_socket_event_request *req ) { fprintf( stderr, " handle=%04x", req->handle ); @@ -3873,6 +3891,8 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_accept_socket_request, (dump_func)dump_set_socket_event_request, (dump_func)dump_get_socket_event_request, + (dump_func)dump_set_socket_iface_request, + (dump_func)dump_get_socket_iface_request, (dump_func)dump_enable_socket_event_request, (dump_func)dump_set_socket_deferred_request, (dump_func)dump_alloc_console_request, @@ -4119,6 +4139,8 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = { NULL, (dump_func)dump_get_socket_event_reply, NULL, + (dump_func)dump_get_socket_iface_reply, + NULL, NULL, (dump_func)dump_alloc_console_reply, NULL, @@ -4363,6 +4385,8 @@ static const char * const req_names[REQ_NB_REQUESTS] = { "accept_socket", "set_socket_event", "get_socket_event", + "set_socket_iface", + "get_socket_iface", "enable_socket_event", "set_socket_deferred", "alloc_console", -- 1.7.0.4