Retry the discovery a few times when no devices are found.
This commit is contained in:
parent
5cb754b01b
commit
39f3a5b757
31
src/irda.c
31
src/irda.c
@ -252,21 +252,36 @@ irda_socket_discover (irda *device, irda_callback_t callback, void *userdata)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
unsigned int n = 0;
|
unsigned int nretries = 0;
|
||||||
while ((rc = getsockopt (device->fd, SOL_IRLMP, IRLMP_ENUMDEVICES, (char*) data, &size)) != 0) {
|
while ((rc = getsockopt (device->fd, SOL_IRLMP, IRLMP_ENUMDEVICES, (char*) data, &size)) != 0 ||
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
if (WSAGetLastError() != WSAEWOULDBLOCK) {
|
list->numDevice == 0)
|
||||||
#else
|
#else
|
||||||
if (errno != EAGAIN) {
|
list->len == 0)
|
||||||
#endif
|
#endif
|
||||||
TRACE ("getsockopt");
|
{
|
||||||
return -1; // Error during getsockopt call.
|
// Automatically retry the discovery when no devices were found.
|
||||||
|
// On Linux, getsockopt fails with EAGAIN when no devices are
|
||||||
|
// discovered, while on Windows it succeeds and sets the number
|
||||||
|
// of devices to zero. Both situations are handled the same here.
|
||||||
|
if (rc != 0) {
|
||||||
|
#ifdef _WIN32
|
||||||
|
if (WSAGetLastError() != WSAEWOULDBLOCK) {
|
||||||
|
#else
|
||||||
|
if (errno != EAGAIN) {
|
||||||
|
#endif
|
||||||
|
TRACE ("getsockopt");
|
||||||
|
return -1; // Error during getsockopt call.
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n >= DISCOVER_MAX_RETRIES)
|
// Abort if the maximum number of retries is reached.
|
||||||
|
if (nretries++ >= DISCOVER_MAX_RETRIES)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
n++;
|
// Restore the size parameter in case it was
|
||||||
|
// modified by the previous getsockopt call.
|
||||||
|
size = sizeof (data);
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
Sleep (1000);
|
Sleep (1000);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user