Adapted Winsock to Linux 2.4 TCP socket poll() behaviour
(thanks to Berend Ozceri for finding the problem).
This commit is contained in:
parent
a1ce916171
commit
7a0f96c908
|
@ -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 )
|
||||||
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 )
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue