diff --git a/dlls/ntdll/unix/socket.c b/dlls/ntdll/unix/socket.c index 0812ec4970f..eb278096b43 100644 --- a/dlls/ntdll/unix/socket.c +++ b/dlls/ntdll/unix/socket.c @@ -223,6 +223,7 @@ static NTSTATUS sock_recv( HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, voi req->status = status; req->total = information; req->async = server_async( handle, &async->io, event, apc, apc_user, io ); + req->oob = !!(unix_flags & MSG_OOB); status = wine_server_call( req ); wait_handle = wine_server_ptr_handle( reply->wait ); options = reply->options; diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 730bb3c151c..771a3fb7d75 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -1808,7 +1808,7 @@ struct set_socket_deferred_reply struct recv_socket_request { struct request_header __header; - char __pad_12[4]; + int oob; async_data_t async; unsigned int status; unsigned int total; @@ -6287,7 +6287,7 @@ union generic_reply /* ### protocol_version begin ### */ -#define SERVER_PROTOCOL_VERSION 706 +#define SERVER_PROTOCOL_VERSION 707 /* ### protocol_version end ### */ diff --git a/server/protocol.def b/server/protocol.def index f0a9107cfbe..88e5ad6a96b 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -1468,6 +1468,7 @@ enum server_fd_type /* Perform a recv on a socket */ @REQ(recv_socket) + int oob; /* are we receiving OOB data? */ async_data_t async; /* async I/O parameters */ unsigned int status; /* status of initial call */ unsigned int total; /* number of bytes already read */ diff --git a/server/request.h b/server/request.h index bb261958f59..b600a9660b2 100644 --- a/server/request.h +++ b/server/request.h @@ -1068,6 +1068,7 @@ C_ASSERT( sizeof(struct enable_socket_event_request) == 32 ); C_ASSERT( FIELD_OFFSET(struct set_socket_deferred_request, handle) == 12 ); C_ASSERT( FIELD_OFFSET(struct set_socket_deferred_request, deferred) == 16 ); C_ASSERT( sizeof(struct set_socket_deferred_request) == 24 ); +C_ASSERT( FIELD_OFFSET(struct recv_socket_request, oob) == 12 ); C_ASSERT( FIELD_OFFSET(struct recv_socket_request, async) == 16 ); C_ASSERT( FIELD_OFFSET(struct recv_socket_request, status) == 56 ); C_ASSERT( FIELD_OFFSET(struct recv_socket_request, total) == 60 ); diff --git a/server/sock.c b/server/sock.c index 549cde17296..04e27328d80 100644 --- a/server/sock.c +++ b/server/sock.c @@ -2452,8 +2452,8 @@ DECL_HANDLER(recv_socket) /* are we shut down? */ if (status == STATUS_PENDING && !(sock->state & FD_READ)) status = STATUS_PIPE_DISCONNECTED; - sock->pending_events &= ~FD_READ; - sock->reported_events &= ~FD_READ; + sock->pending_events &= ~(req->oob ? FD_OOB : FD_READ); + sock->reported_events &= ~(req->oob ? FD_OOB : FD_READ); if ((async = create_request_async( fd, get_fd_comp_flags( fd ), &req->async ))) { diff --git a/server/trace.c b/server/trace.c index 1420f1e799f..efa263eadec 100644 --- a/server/trace.c +++ b/server/trace.c @@ -2124,7 +2124,8 @@ static void dump_set_socket_deferred_request( const struct set_socket_deferred_r static void dump_recv_socket_request( const struct recv_socket_request *req ) { - dump_async_data( " async=", &req->async ); + fprintf( stderr, " oob=%d", req->oob ); + dump_async_data( ", async=", &req->async ); fprintf( stderr, ", status=%08x", req->status ); fprintf( stderr, ", total=%08x", req->total ); }