summaryrefslogtreecommitdiffstats
path: root/usb-linux.c
diff options
context:
space:
mode:
authorGravatar Hector Martin2009-05-05 00:37:19 +0200
committerGravatar Hector Martin2009-05-05 00:37:19 +0200
commit9bf93e406de3a06cee0a1452bf1da3c6f697ee31 (patch)
tree748061dd3eef7c8f76212c6cbade2249432bd7a4 /usb-linux.c
parentbcf6842e29b6cdaf71a8043fb0a0e42c032f1ed6 (diff)
downloadusbmuxd-9bf93e406de3a06cee0a1452bf1da3c6f697ee31.tar.gz
usbmuxd-9bf93e406de3a06cee0a1452bf1da3c6f697ee31.tar.bz2
Make usb die only after several repeated failures to get device list
(libusb problem?)
Diffstat (limited to 'usb-linux.c')
-rw-r--r--usb-linux.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/usb-linux.c b/usb-linux.c
index 3a87ba6..b401cde 100644
--- a/usb-linux.c
+++ b/usb-linux.c
@@ -51,6 +51,8 @@ static struct collection device_list;
51 51
52static struct timeval next_dev_poll_time; 52static struct timeval next_dev_poll_time;
53 53
54static int devlist_failures;
55
54static void usb_disconnect(struct usb_device *dev) 56static void usb_disconnect(struct usb_device *dev)
55{ 57{
56 if(!dev->dev) { 58 if(!dev->dev) {
@@ -219,9 +221,21 @@ static int usb_discover(void)
219 221
220 cnt = libusb_get_device_list(NULL, &devs); 222 cnt = libusb_get_device_list(NULL, &devs);
221 if(cnt < 0) { 223 if(cnt < 0) {
222 usbmuxd_log(LL_FATAL, "Could not get device list: %d", cnt); 224 usbmuxd_log(LL_WARNING, "Could not get device list: %d", cnt);
223 return cnt; 225 devlist_failures++;
226 // sometimes libusb fails getting the device list if you've just removed something
227 if(devlist_failures > 5) {
228 usbmuxd_log(LL_FATAL, "Too many errors getting device list\n");
229 return cnt;
230 } else {
231 gettimeofday(&next_dev_poll_time, NULL);
232 next_dev_poll_time.tv_usec += DEVICE_POLL_TIME * 1000;
233 next_dev_poll_time.tv_sec += next_dev_poll_time.tv_usec / 1000000;
234 next_dev_poll_time.tv_usec = next_dev_poll_time.tv_usec % 1000000;
235 return 0;
236 }
224 } 237 }
238 devlist_failures = 0;
225 239
226 usbmuxd_log(LL_SPEW, "usb_discover: scanning %d devices", cnt); 240 usbmuxd_log(LL_SPEW, "usb_discover: scanning %d devices", cnt);
227 241
@@ -462,6 +476,7 @@ int usb_init(void)
462 int res; 476 int res;
463 usbmuxd_log(LL_DEBUG, "usb_init for linux / libusb 1.0"); 477 usbmuxd_log(LL_DEBUG, "usb_init for linux / libusb 1.0");
464 478
479 devlist_failures = 0;
465 res = libusb_init(NULL); 480 res = libusb_init(NULL);
466 //libusb_set_debug(NULL, 3); 481 //libusb_set_debug(NULL, 3);
467 if(res != 0) { 482 if(res != 0) {