Redesign of the server communication protocol to allow arbitrary sized
data to be exchanged.
Split request and reply structures to make backwards compatibility
easier.
Moved many console functions to dlls/kernel, added code page support,
changed a few requests to behave properly with the new protocol.
diff --git a/server/sock.c b/server/sock.c
index 0781055..a18dc6e 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -59,7 +59,7 @@
static int sock_get_poll_events( struct object *obj );
static void sock_poll_event( struct object *obj, int event );
static int sock_get_fd( struct object *obj );
-static int sock_get_info( struct object *obj, struct get_file_info_request *req );
+static int sock_get_info( struct object *obj, struct get_file_info_reply *reply );
static void sock_destroy( struct object *obj );
static int sock_get_error( int err );
static void sock_set_error(void);
@@ -272,20 +272,20 @@
return sock->obj.fd;
}
-static int sock_get_info( struct object *obj, struct get_file_info_request *req )
+static int sock_get_info( struct object *obj, struct get_file_info_reply *reply )
{
- if (req)
+ if (reply)
{
- req->type = FILE_TYPE_PIPE;
- req->attr = 0;
- req->access_time = 0;
- req->write_time = 0;
- req->size_high = 0;
- req->size_low = 0;
- req->links = 0;
- req->index_high = 0;
- req->index_low = 0;
- req->serial = 0;
+ reply->type = FILE_TYPE_PIPE;
+ reply->attr = 0;
+ reply->access_time = 0;
+ reply->write_time = 0;
+ reply->size_high = 0;
+ reply->size_low = 0;
+ reply->links = 0;
+ reply->index_high = 0;
+ reply->index_low = 0;
+ reply->serial = 0;
}
return FD_TYPE_DEFAULT;
}
@@ -461,10 +461,10 @@
{
struct object *obj;
- req->handle = 0;
+ reply->handle = 0;
if ((obj = create_socket( req->family, req->type, req->protocol )) != NULL)
{
- req->handle = alloc_handle( current->process, obj, req->access, req->inherit );
+ reply->handle = alloc_handle( current->process, obj, req->access, req->inherit );
release_object( obj );
}
}
@@ -474,10 +474,10 @@
{
struct object *obj;
- req->handle = 0;
+ reply->handle = 0;
if ((obj = accept_socket( req->lhandle )) != NULL)
{
- req->handle = alloc_handle( current->process, obj, req->access, req->inherit );
+ reply->handle = alloc_handle( current->process, obj, req->access, req->inherit );
release_object( obj );
}
}
@@ -525,34 +525,31 @@
DECL_HANDLER(get_socket_event)
{
struct sock *sock;
- size_t size;
sock=(struct sock*)get_handle_obj(current->process,req->handle,GENERIC_READ|GENERIC_WRITE|SYNCHRONIZE,&sock_ops);
if (!sock)
{
- req->mask = 0;
- req->pmask = 0;
- req->state = 0;
- set_error(WSAENOTSOCK);
- return;
+ reply->mask = 0;
+ reply->pmask = 0;
+ reply->state = 0;
+ set_error( WSAENOTSOCK );
+ return;
}
- req->mask = sock->mask;
- req->pmask = sock->pmask;
- req->state = sock->state;
- size = min( get_req_data_size(req), sizeof(sock->errors) );
- memcpy( get_req_data(req), sock->errors, size );
- set_req_data_size( req, size );
+ reply->mask = sock->mask;
+ reply->pmask = sock->pmask;
+ reply->state = sock->state;
+ set_reply_data( sock->errors, min( get_reply_max_size(), sizeof(sock->errors) ));
if (req->service)
{
- if (req->s_event)
+ handle_t s_event = req->s_event;
+ if (s_event)
{
struct event *sevent = get_event_obj(current->process, req->s_event, 0);
- if (sevent == sock->event)
- req->s_event = 0;
+ if (sevent == sock->event) s_event = 0;
release_object( sevent );
}
- if (!req->s_event)
+ if (!s_event)
{
if (req->c_event)
{