Commit 5f195f8c authored by Alexandre Julliard's avatar Alexandre Julliard

Small server protocol cleanups.

parent cf354d8c
......@@ -27,7 +27,7 @@
struct request_header
{
IN int req; /* request code */
IN unsigned short fixed_size; /* size of the fixed part of the request */
IN unsigned short var_offset; /* offset of the variable part of the request */
IN unsigned short var_size; /* size of the variable part of the request */
OUT unsigned int error; /* error result */
};
......@@ -864,7 +864,6 @@ struct get_mapping_info_request
OUT void* base; /* default base addr (for VPROT_IMAGE mapping) */
OUT handle_t shared_file; /* shared mapping file handle */
OUT int shared_size; /* shared mapping size */
OUT int anonymous; /* anonymous mapping? */
};
......@@ -1594,7 +1593,7 @@ union generic_request
struct async_result_request async_result;
};
#define SERVER_PROTOCOL_VERSION 37
#define SERVER_PROTOCOL_VERSION 38
/* ### make_requests end ### */
/* Everything above this line is generated automatically by tools/make_requests */
......@@ -1622,6 +1621,7 @@ struct server_buffer_info
extern unsigned int wine_server_call( enum request req );
extern unsigned int server_call_fd( enum request req, int fd_out );
extern void server_protocol_error( const char *err, ... ) WINE_NORETURN;
extern void server_protocol_perror( const char *err ) WINE_NORETURN;
extern void *wine_server_alloc_req( size_t fixed_size, size_t var_size );
extern int wine_server_recv_fd( int handle, int cache );
extern const char *get_config_dir(void);
......
......@@ -1494,7 +1494,7 @@ LPVOID WINAPI MapViewOfFileEx(
UINT ptr = (UINT)-1, size = 0;
int flags = MAP_PRIVATE;
int unix_handle = -1;
int prot, anonymous, res;
int prot, res;
void *base;
DWORD size_low, size_high, header_size, shared_size;
HANDLE shared_file;
......@@ -1520,15 +1520,11 @@ LPVOID WINAPI MapViewOfFileEx(
header_size = req->header_size;
shared_file = req->shared_file;
shared_size = req->shared_size;
anonymous = req->anonymous;
}
SERVER_END_REQ;
if (res) goto error;
if (!anonymous)
{
if ((unix_handle = FILE_GetUnixHandle( handle, 0 )) == -1) goto error;
}
if ((unix_handle = FILE_GetUnixHandle( handle, 0 )) == -1) goto error;
if (prot & VPROT_IMAGE)
return map_image( handle, unix_handle, base, size_low, header_size,
......
......@@ -102,9 +102,9 @@ void server_protocol_error( const char *err, ... )
/***********************************************************************
* server_perror
* server_protocol_perror
*/
static void server_perror( const char *err )
void server_protocol_perror( const char *err )
{
fprintf( stderr, "Client protocol error:%p: ", NtCurrentTeb()->tid );
perror( err );
......@@ -141,7 +141,7 @@ void *wine_server_alloc_req( size_t fixed_size, size_t var_size )
server_protocol_error( "buffer overflow %d bytes\n",
(char *)req + size - (char *)NtCurrentTeb()->buffer_info );
NtCurrentTeb()->buffer_info->cur_pos = pos + size;
req->header.fixed_size = fixed_size;
req->header.var_offset = pos + sizeof(*req);
req->header.var_size = var_size;
return req;
}
......@@ -152,15 +152,15 @@ void *wine_server_alloc_req( size_t fixed_size, size_t var_size )
*
* Send a request to the server.
*/
static void send_request( enum request req, struct request_header *header )
static void send_request( enum request req, union generic_request *request )
{
header->req = req;
NtCurrentTeb()->buffer_info->cur_req = (char *)header - (char *)NtCurrentTeb()->buffer;
request->header.req = req;
NtCurrentTeb()->buffer_info->cur_req = (char *)request - (char *)NtCurrentTeb()->buffer;
/* write a single byte; the value is ignored anyway */
if (write( NtCurrentTeb()->request_fd, header, 1 ) == -1)
if (write( NtCurrentTeb()->request_fd, request, 1 ) == -1)
{
if (errno == EPIPE) SYSDEPS_ExitThread(0);
server_perror( "sendmsg" );
server_protocol_perror( "sendmsg" );
}
}
......@@ -169,7 +169,7 @@ static void send_request( enum request req, struct request_header *header )
*
* Send a request to the server, passing a file descriptor.
*/
static void send_request_fd( enum request req, struct request_header *header, int fd )
static void send_request_fd( enum request req, union generic_request *request, int fd )
{
#ifndef HAVE_MSGHDR_ACCRIGHTS
struct cmsg_fd cmsg;
......@@ -178,7 +178,7 @@ static void send_request_fd( enum request req, struct request_header *header, in
struct iovec vec;
/* write a single byte; the value is ignored anyway */
vec.iov_base = (void *)header;
vec.iov_base = (void *)request;
vec.iov_len = 1;
msghdr.msg_name = NULL;
......@@ -199,12 +199,12 @@ static void send_request_fd( enum request req, struct request_header *header, in
msghdr.msg_flags = 0;
#endif /* HAVE_MSGHDR_ACCRIGHTS */
header->req = req;
request->header.req = req;
if (sendmsg( NtCurrentTeb()->socket, &msghdr, 0 ) == -1)
{
if (errno == EPIPE) SYSDEPS_ExitThread(0);
server_perror( "sendmsg" );
server_protocol_perror( "sendmsg" );
}
}
......@@ -224,7 +224,7 @@ static void wait_reply(void)
if (!ret) break;
if (errno == EINTR) continue;
if (errno == EPIPE) break;
server_perror("read");
server_protocol_perror("read");
}
/* the server closed the connection; time to die... */
SYSDEPS_ExitThread(0);
......@@ -238,10 +238,10 @@ static void wait_reply(void)
*/
unsigned int wine_server_call( enum request req )
{
void *req_ptr = NtCurrentTeb()->buffer;
union generic_request *req_ptr = NtCurrentTeb()->buffer;
send_request( req, req_ptr );
wait_reply();
return ((struct request_header *)req_ptr)->error;
return req_ptr->header.error;
}
......@@ -253,13 +253,12 @@ unsigned int wine_server_call( enum request req )
unsigned int server_call_fd( enum request req, int fd_out )
{
unsigned int res;
void *req_ptr = NtCurrentTeb()->buffer;
union generic_request *req_ptr = NtCurrentTeb()->buffer;
send_request_fd( req, req_ptr, fd_out );
wait_reply();
if ((res = ((struct request_header *)req_ptr)->error))
SetLastError( RtlNtStatusToDosError(res) );
if ((res = req_ptr->header.error)) SetLastError( RtlNtStatusToDosError(res) );
return res; /* error code */
}
......@@ -356,7 +355,7 @@ int wine_server_recv_fd( int handle, int cache )
if (!ret) break;
if (errno == EINTR) continue;
if (errno == EPIPE) break;
server_perror("recvmsg");
server_protocol_perror("recvmsg");
}
/* the server closed the connection; time to die... */
SYSDEPS_ExitThread(0);
......@@ -613,10 +612,10 @@ int CLIENT_InitThread(void)
fd = wine_server_recv_fd( 0, 0 );
if (fd == -1) server_protocol_error( "no fd received for thread buffer\n" );
if ((size = lseek( fd, 0, SEEK_END )) == -1) server_perror( "lseek" );
if ((size = lseek( fd, 0, SEEK_END )) == -1) server_protocol_perror( "lseek" );
teb->buffer = mmap( 0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0 );
close( fd );
if (teb->buffer == (void*)-1) server_perror( "mmap" );
if (teb->buffer == (void*)-1) server_protocol_perror( "mmap" );
teb->buffer_info = (struct server_buffer_info *)((char *)teb->buffer + size) - 1;
wait_reply();
......
......@@ -338,7 +338,6 @@ DECL_HANDLER(get_mapping_info)
req->base = mapping->base;
req->shared_file = 0;
req->shared_size = mapping->shared_size;
req->anonymous = !mapping->file;
if (mapping->shared_file)
req->shared_file = alloc_handle( current->process, mapping->shared_file,
GENERIC_READ|GENERIC_WRITE, 0 );
......
......@@ -52,7 +52,7 @@ static inline void *get_req_ptr( struct thread *thread )
/* get the request vararg data */
inline static void *get_req_data( const void *req )
{
return ((union generic_request *)req + 1);
return (char *)current->buffer + ((struct request_header *)req)->var_offset;
}
/* get the request vararg size */
......
......@@ -985,8 +985,7 @@ static void dump_get_mapping_info_reply( const struct get_mapping_info_request *
fprintf( stderr, " header_size=%d,", req->header_size );
fprintf( stderr, " base=%p,", req->base );
fprintf( stderr, " shared_file=%d,", req->shared_file );
fprintf( stderr, " shared_size=%d,", req->shared_size );
fprintf( stderr, " anonymous=%d", req->anonymous );
fprintf( stderr, " shared_size=%d", req->shared_size );
}
static void dump_create_device_request( const struct create_device_request *req )
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment