1
0
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:
Karl Heyes 2009-07-06 14:28:16 +00:00
parent 65eb342fd8
commit 6ddf620a21

View File

@ -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;
} }
} }