From: Rémi Bernon rbernon@codeweavers.com
--- dlls/ntdll/unix/server.c | 45 ++++++++++++++++++++++++++++++++++++++++ include/wine/server.h | 2 ++ 2 files changed, 47 insertions(+)
diff --git a/dlls/ntdll/unix/server.c b/dlls/ntdll/unix/server.c index e8da94ebc64..56c2bad40ed 100644 --- a/dlls/ntdll/unix/server.c +++ b/dlls/ntdll/unix/server.c @@ -1495,6 +1495,51 @@ static void send_server_task_port(void) #endif /* __APPLE__ */
+/*********************************************************************** + * wine_server_call_send_unix_fd + * + * Send an fd and perform a server call. + */ +unsigned int CDECL wine_server_call_send_fd( void *req_ptr, enum fd_type type, int fd ) +{ + switch (type) + { + case FD_TYPE_NONE: break; + case FD_TYPE_UNIX: wine_server_send_fd( fd ); break; + default: assert( 0 ); break; + } + return wine_server_call( req_ptr ); +} + + +/*********************************************************************** + * wine_server_call_receive_fd + * + * Perform a server call and receive an fd. + */ +unsigned int CDECL wine_server_call_receive_fd( void *req_ptr, enum fd_type *type, int *fd, obj_handle_t *handle ) +{ + struct __server_request_info * const req = req_ptr; + unsigned int ret; + sigset_t sigset; + + server_enter_uninterrupted_section( &fd_cache_mutex, &sigset ); + + if ((ret = server_call_unlocked( req_ptr ))) *handle = *fd = -1; + else switch ((*type = req->u.reply.reply_header.fd_type)) + { + case FD_TYPE_NONE: *fd = *handle = 0; break; + case FD_TYPE_UNIX: *fd = wine_server_receive_fd( handle ); break; + default: assert( 0 ); break; + } + + server_leave_uninterrupted_section( &fd_cache_mutex, &sigset ); + + if (!ret && *fd == -1) ret = STATUS_TOO_MANY_OPENED_FILES; + return ret; +} + + /*********************************************************************** * get_unix_tid * diff --git a/include/wine/server.h b/include/wine/server.h index 458c33c27b5..5e4c58f252f 100644 --- a/include/wine/server.h +++ b/include/wine/server.h @@ -50,6 +50,8 @@ struct __server_request_info };
NTSYSAPI unsigned int CDECL wine_server_call( void *req_ptr ); +NTSYSAPI unsigned int CDECL wine_server_call_send_fd( void *req_ptr, enum fd_type type, int fd ); +NTSYSAPI unsigned int CDECL wine_server_call_receive_fd( void *req_ptr, enum fd_type *type, int *fd, obj_handle_t *handle ); NTSYSAPI NTSTATUS CDECL wine_server_fd_to_handle( int fd, unsigned int access, unsigned int attributes, HANDLE *handle ); NTSYSAPI NTSTATUS CDECL wine_server_handle_to_fd( HANDLE handle, unsigned int access, int *unix_fd, unsigned int *options );