Commit 7a0f96c9 authored by Ove Kaaven's avatar Ove Kaaven Committed by Alexandre Julliard

Adapted Winsock to Linux 2.4 TCP socket poll() behaviour

(thanks to Berend Ozceri for finding the problem).
parent a1ce9161
...@@ -83,6 +83,14 @@ static void sock_reselect( struct sock *sock ) ...@@ -83,6 +83,14 @@ static void sock_reselect( struct sock *sock )
if (debug_level) if (debug_level)
fprintf(stderr,"sock_reselect(%d): new mask %x\n", sock->obj.fd, ev); fprintf(stderr,"sock_reselect(%d): new mask %x\n", sock->obj.fd, ev);
if (sock->obj.select == -1) {
/* previously unconnected socket, is this reselect supposed to connect it? */
if (!sock->state) return;
/* ok, it is, attach it to the wineserver's main poll loop */
add_select_user( &sock->obj );
}
/* update condition mask */
set_select_events( &sock->obj, ev ); set_select_events( &sock->obj, ev );
/* check whether condition is satisfied already */ /* check whether condition is satisfied already */
...@@ -288,8 +296,9 @@ static struct object *create_socket( int family, int type, int protocol ) ...@@ -288,8 +296,9 @@ static struct object *create_socket( int family, int type, int protocol )
return NULL; return NULL;
} }
fcntl(sockfd, F_SETFL, O_NONBLOCK); /* make socket nonblocking */ fcntl(sockfd, F_SETFL, O_NONBLOCK); /* make socket nonblocking */
if (!(sock = alloc_object( &sock_ops, sockfd ))) return NULL; if (!(sock = alloc_object( &sock_ops, -1 ))) return NULL;
sock->state = (type!=SOCK_STREAM) ? WS_FD_READ|WS_FD_WRITE : 0; sock->obj.fd = sockfd;
sock->state = (type != SOCK_STREAM) ? (WS_FD_READ|WS_FD_WRITE) : 0;
sock->mask = 0; sock->mask = 0;
sock->hmask = 0; sock->hmask = 0;
sock->pmask = 0; sock->pmask = 0;
...@@ -323,12 +332,13 @@ static struct object *accept_socket( int handle ) ...@@ -323,12 +332,13 @@ static struct object *accept_socket( int handle )
release_object( sock ); release_object( sock );
return NULL; return NULL;
} }
if (!(acceptsock = alloc_object( &sock_ops, acceptfd ))) if (!(acceptsock = alloc_object( &sock_ops, -1 )))
{ {
release_object( sock ); release_object( sock );
return NULL; return NULL;
} }
acceptsock->obj.fd = acceptfd;
acceptsock->state = WS_FD_CONNECTED|WS_FD_READ|WS_FD_WRITE; acceptsock->state = WS_FD_CONNECTED|WS_FD_READ|WS_FD_WRITE;
acceptsock->mask = sock->mask; acceptsock->mask = sock->mask;
acceptsock->hmask = 0; acceptsock->hmask = 0;
......
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