ws2_32: Translate WSA_FLAG_OVERLAPPED to NT overlapped flags.
Signed-off-by: Zebediah Figura <z.figura12@gmail.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
4c86e860e6
commit
8fb897a571
|
@ -7716,7 +7716,8 @@ SOCKET WINAPI WSASocketW(int af, int type, int protocol,
|
||||||
|
|
||||||
RtlInitUnicodeString(&string, afdW);
|
RtlInitUnicodeString(&string, afdW);
|
||||||
InitializeObjectAttributes(&attr, &string, (flags & WSA_FLAG_NO_HANDLE_INHERIT) ? 0 : OBJ_INHERIT, NULL, NULL);
|
InitializeObjectAttributes(&attr, &string, (flags & WSA_FLAG_NO_HANDLE_INHERIT) ? 0 : OBJ_INHERIT, NULL, NULL);
|
||||||
if ((status = NtOpenFile(&handle, GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, &attr, &io, 0, 0)))
|
if ((status = NtOpenFile(&handle, GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE, &attr,
|
||||||
|
&io, 0, (flags & WSA_FLAG_OVERLAPPED) ? 0 : FILE_SYNCHRONOUS_IO_NONALERT)))
|
||||||
{
|
{
|
||||||
WARN("Failed to create socket, status %#x.\n", status);
|
WARN("Failed to create socket, status %#x.\n", status);
|
||||||
WSASetLastError(NtStatusToWSAError(status));
|
WSASetLastError(NtStatusToWSAError(status));
|
||||||
|
@ -7726,7 +7727,7 @@ SOCKET WINAPI WSASocketW(int af, int type, int protocol,
|
||||||
create_params.family = unixaf;
|
create_params.family = unixaf;
|
||||||
create_params.type = unixtype;
|
create_params.type = unixtype;
|
||||||
create_params.protocol = protocol;
|
create_params.protocol = protocol;
|
||||||
create_params.flags = flags & ~WSA_FLAG_NO_HANDLE_INHERIT;
|
create_params.flags = flags & ~(WSA_FLAG_NO_HANDLE_INHERIT | WSA_FLAG_OVERLAPPED);
|
||||||
if ((status = NtDeviceIoControlFile(handle, NULL, NULL, NULL, &io,
|
if ((status = NtDeviceIoControlFile(handle, NULL, NULL, NULL, &io,
|
||||||
IOCTL_AFD_CREATE, &create_params, sizeof(create_params), NULL, 0)))
|
IOCTL_AFD_CREATE, &create_params, sizeof(create_params), NULL, 0)))
|
||||||
{
|
{
|
||||||
|
|
|
@ -315,7 +315,7 @@ static inline int sock_error( struct fd *fd )
|
||||||
|
|
||||||
static int sock_dispatch_asyncs( struct sock *sock, int event, int error )
|
static int sock_dispatch_asyncs( struct sock *sock, int event, int error )
|
||||||
{
|
{
|
||||||
if ( sock->flags & WSA_FLAG_OVERLAPPED )
|
if (is_fd_overlapped( sock->fd ))
|
||||||
{
|
{
|
||||||
if (event & (POLLIN|POLLPRI) && async_waiting( &sock->read_q ))
|
if (event & (POLLIN|POLLPRI) && async_waiting( &sock->read_q ))
|
||||||
{
|
{
|
||||||
|
@ -680,6 +680,7 @@ static struct sock *create_socket(void)
|
||||||
|
|
||||||
static int init_socket( struct sock *sock, int family, int type, int protocol, unsigned int flags )
|
static int init_socket( struct sock *sock, int family, int type, int protocol, unsigned int flags )
|
||||||
{
|
{
|
||||||
|
unsigned int options = 0;
|
||||||
int sockfd;
|
int sockfd;
|
||||||
|
|
||||||
sockfd = socket( family, type, protocol );
|
sockfd = socket( family, type, protocol );
|
||||||
|
@ -696,10 +697,13 @@ static int init_socket( struct sock *sock, int family, int type, int protocol, u
|
||||||
sock->type = type;
|
sock->type = type;
|
||||||
sock->family = family;
|
sock->family = family;
|
||||||
|
|
||||||
if (sock->fd) release_object( sock->fd );
|
if (sock->fd)
|
||||||
|
{
|
||||||
|
options = get_fd_options( sock->fd );
|
||||||
|
release_object( sock->fd );
|
||||||
|
}
|
||||||
|
|
||||||
if (!(sock->fd = create_anonymous_fd( &sock_fd_ops, sockfd, &sock->obj,
|
if (!(sock->fd = create_anonymous_fd( &sock_fd_ops, sockfd, &sock->obj, options )))
|
||||||
(flags & WSA_FLAG_OVERLAPPED) ? 0 : FILE_SYNCHRONOUS_IO_NONALERT )))
|
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue