Added support for socket flags.
This commit is contained in:
parent
88cd32b2d1
commit
aa47705809
|
@ -874,6 +874,7 @@ struct create_socket_request
|
||||||
int family;
|
int family;
|
||||||
int type;
|
int type;
|
||||||
int protocol;
|
int protocol;
|
||||||
|
unsigned int flags;
|
||||||
};
|
};
|
||||||
struct create_socket_reply
|
struct create_socket_reply
|
||||||
{
|
{
|
||||||
|
@ -3042,6 +3043,6 @@ union generic_reply
|
||||||
struct get_window_properties_reply get_window_properties_reply;
|
struct get_window_properties_reply get_window_properties_reply;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SERVER_PROTOCOL_VERSION 69
|
#define SERVER_PROTOCOL_VERSION 70
|
||||||
|
|
||||||
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */
|
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */
|
||||||
|
|
|
@ -640,6 +640,7 @@ enum fd_type
|
||||||
int family; /* family, see socket manpage */
|
int family; /* family, see socket manpage */
|
||||||
int type; /* type, see socket manpage */
|
int type; /* type, see socket manpage */
|
||||||
int protocol; /* protocol, see socket manpage */
|
int protocol; /* protocol, see socket manpage */
|
||||||
|
unsigned int flags; /* socket flags */
|
||||||
@REPLY
|
@REPLY
|
||||||
handle_t handle; /* handle to the new socket */
|
handle_t handle; /* handle to the new socket */
|
||||||
@END
|
@END
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include "handle.h"
|
#include "handle.h"
|
||||||
#include "thread.h"
|
#include "thread.h"
|
||||||
#include "request.h"
|
#include "request.h"
|
||||||
|
#include "async.h"
|
||||||
|
|
||||||
/* To avoid conflicts with the Unix socket headers. Plus we only need a few
|
/* To avoid conflicts with the Unix socket headers. Plus we only need a few
|
||||||
* macros anyway.
|
* macros anyway.
|
||||||
|
@ -50,8 +51,11 @@ struct sock
|
||||||
unsigned int mask; /* event mask */
|
unsigned int mask; /* event mask */
|
||||||
unsigned int hmask; /* held (blocked) events */
|
unsigned int hmask; /* held (blocked) events */
|
||||||
unsigned int pmask; /* pending events */
|
unsigned int pmask; /* pending events */
|
||||||
|
unsigned int flags; /* socket flags */
|
||||||
struct event *event; /* event object */
|
struct event *event; /* event object */
|
||||||
int errors[FD_MAX_EVENTS]; /* event errors */
|
int errors[FD_MAX_EVENTS]; /* event errors */
|
||||||
|
struct async_queue read_q; /* Queue for asynchronous reads */
|
||||||
|
struct async_queue write_q; /* Queue for asynchronous writes */
|
||||||
};
|
};
|
||||||
|
|
||||||
static void sock_dump( struct object *obj, int verbose );
|
static void sock_dump( struct object *obj, int verbose );
|
||||||
|
@ -275,6 +279,9 @@ static int sock_get_fd( struct object *obj )
|
||||||
|
|
||||||
static int sock_get_info( struct object *obj, struct get_file_info_reply *reply, int *flags )
|
static int sock_get_info( struct object *obj, struct get_file_info_reply *reply, int *flags )
|
||||||
{
|
{
|
||||||
|
struct sock *sock = (struct sock*) obj;
|
||||||
|
assert ( obj->ops == &sock_ops );
|
||||||
|
|
||||||
if (reply)
|
if (reply)
|
||||||
{
|
{
|
||||||
reply->type = FILE_TYPE_PIPE;
|
reply->type = FILE_TYPE_PIPE;
|
||||||
|
@ -289,6 +296,7 @@ static int sock_get_info( struct object *obj, struct get_file_info_reply *reply,
|
||||||
reply->serial = 0;
|
reply->serial = 0;
|
||||||
}
|
}
|
||||||
*flags = 0;
|
*flags = 0;
|
||||||
|
if (sock->flags & WSA_FLAG_OVERLAPPED) *flags |= FD_FLAG_OVERLAPPED;
|
||||||
return FD_TYPE_DEFAULT;
|
return FD_TYPE_DEFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -298,6 +306,13 @@ static void sock_destroy( struct object *obj )
|
||||||
assert( obj->ops == &sock_ops );
|
assert( obj->ops == &sock_ops );
|
||||||
|
|
||||||
/* FIXME: special socket shutdown stuff? */
|
/* FIXME: special socket shutdown stuff? */
|
||||||
|
|
||||||
|
if ( sock->flags & WSA_FLAG_OVERLAPPED )
|
||||||
|
{
|
||||||
|
destroy_async_queue ( &sock->read_q );
|
||||||
|
destroy_async_queue ( &sock->write_q );
|
||||||
|
}
|
||||||
|
|
||||||
if (sock->event)
|
if (sock->event)
|
||||||
{
|
{
|
||||||
/* if the service thread was waiting for the event object,
|
/* if the service thread was waiting for the event object,
|
||||||
|
@ -311,7 +326,7 @@ static void sock_destroy( struct object *obj )
|
||||||
}
|
}
|
||||||
|
|
||||||
/* create a new and unconnected socket */
|
/* create a new and unconnected socket */
|
||||||
static struct object *create_socket( int family, int type, int protocol )
|
static struct object *create_socket( int family, int type, int protocol, unsigned int flags )
|
||||||
{
|
{
|
||||||
struct sock *sock;
|
struct sock *sock;
|
||||||
int sockfd;
|
int sockfd;
|
||||||
|
@ -330,9 +345,15 @@ static struct object *create_socket( int family, int type, int protocol )
|
||||||
sock->mask = 0;
|
sock->mask = 0;
|
||||||
sock->hmask = 0;
|
sock->hmask = 0;
|
||||||
sock->pmask = 0;
|
sock->pmask = 0;
|
||||||
|
sock->flags = flags;
|
||||||
sock->event = NULL;
|
sock->event = NULL;
|
||||||
sock_reselect( sock );
|
sock_reselect( sock );
|
||||||
clear_error();
|
clear_error();
|
||||||
|
if (sock->flags & WSA_FLAG_OVERLAPPED)
|
||||||
|
{
|
||||||
|
init_async_queue (&sock->read_q);
|
||||||
|
init_async_queue (&sock->write_q);
|
||||||
|
}
|
||||||
return &sock->obj;
|
return &sock->obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -378,6 +399,12 @@ static struct object *accept_socket( handle_t handle )
|
||||||
acceptsock->event = NULL;
|
acceptsock->event = NULL;
|
||||||
if (sock->event && !(sock->mask & FD_WINE_SERVEVENT))
|
if (sock->event && !(sock->mask & FD_WINE_SERVEVENT))
|
||||||
acceptsock->event = (struct event *)grab_object( sock->event );
|
acceptsock->event = (struct event *)grab_object( sock->event );
|
||||||
|
acceptsock->flags = sock->flags;
|
||||||
|
if ( acceptsock->flags & WSA_FLAG_OVERLAPPED )
|
||||||
|
{
|
||||||
|
init_async_queue ( &acceptsock->read_q );
|
||||||
|
init_async_queue ( &acceptsock->write_q );
|
||||||
|
}
|
||||||
|
|
||||||
sock_reselect( acceptsock );
|
sock_reselect( acceptsock );
|
||||||
clear_error();
|
clear_error();
|
||||||
|
@ -464,7 +491,7 @@ DECL_HANDLER(create_socket)
|
||||||
struct object *obj;
|
struct object *obj;
|
||||||
|
|
||||||
reply->handle = 0;
|
reply->handle = 0;
|
||||||
if ((obj = create_socket( req->family, req->type, req->protocol )) != NULL)
|
if ((obj = create_socket( req->family, req->type, req->protocol, req->flags )) != NULL)
|
||||||
{
|
{
|
||||||
reply->handle = alloc_handle( current->process, obj, req->access, req->inherit );
|
reply->handle = alloc_handle( current->process, obj, req->access, req->inherit );
|
||||||
release_object( obj );
|
release_object( obj );
|
||||||
|
|
|
@ -811,7 +811,8 @@ static void dump_create_socket_request( const struct create_socket_request *req
|
||||||
fprintf( stderr, " inherit=%d,", req->inherit );
|
fprintf( stderr, " inherit=%d,", req->inherit );
|
||||||
fprintf( stderr, " family=%d,", req->family );
|
fprintf( stderr, " family=%d,", req->family );
|
||||||
fprintf( stderr, " type=%d,", req->type );
|
fprintf( stderr, " type=%d,", req->type );
|
||||||
fprintf( stderr, " protocol=%d", req->protocol );
|
fprintf( stderr, " protocol=%d,", req->protocol );
|
||||||
|
fprintf( stderr, " flags=%08x", req->flags );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void dump_create_socket_reply( const struct create_socket_reply *req )
|
static void dump_create_socket_reply( const struct create_socket_reply *req )
|
||||||
|
|
Loading…
Reference in New Issue