mirror of
https://gitlab.xiph.org/xiph/icecast-common.git
synced 2024-12-04 14:46:31 -05:00
bug+fix reported on icecast-dev (Petr Pisar, 06/07/2009). poll implementation
of sock_connected had incorrect return in failure case. svn path=/icecast/trunk/net/; revision=16209
This commit is contained in:
parent
65eb342fd8
commit
6ddf620a21
12
net/sock.c
12
net/sock.c
@ -516,17 +516,27 @@ int sock_read_line(sock_t sock, char *buff, const int len)
|
|||||||
int sock_connected (sock_t sock, int timeout)
|
int sock_connected (sock_t sock, int timeout)
|
||||||
{
|
{
|
||||||
struct pollfd check;
|
struct pollfd check;
|
||||||
|
int val = SOCK_ERROR;
|
||||||
|
socklen_t size = sizeof val;
|
||||||
|
|
||||||
check.fd = sock;
|
check.fd = sock;
|
||||||
check.events = POLLOUT;
|
check.events = POLLOUT;
|
||||||
switch (poll (&check, 1, timeout*1000))
|
switch (poll (&check, 1, timeout*1000))
|
||||||
{
|
{
|
||||||
case 0: return SOCK_TIMEOUT;
|
case 0: return SOCK_TIMEOUT;
|
||||||
|
default:
|
||||||
|
/* on windows getsockopt.val is defined as char* */
|
||||||
|
if (getsockopt(sock, SOL_SOCKET, SO_ERROR, (void*) &val, &size) == 0)
|
||||||
|
{
|
||||||
|
if (val == 0)
|
||||||
|
return 1;
|
||||||
|
sock_set_error (val);
|
||||||
|
}
|
||||||
|
/* fall through */
|
||||||
case -1:
|
case -1:
|
||||||
if (sock_recoverable (sock_error()))
|
if (sock_recoverable (sock_error()))
|
||||||
return 0;
|
return 0;
|
||||||
return SOCK_ERROR;
|
return SOCK_ERROR;
|
||||||
default: return 1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user