summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Hjelm <hjelmn@mac.com>2009-09-11 18:00:29 +0100
committerDaniel Drake <dsd@gentoo.org>2009-09-11 18:00:29 +0100
commitfe0d8dce1ed704915d501e7da700440c78144211 (patch)
tree4cfadb3e8712d8f6a94f98ecab1388eae340f11c
parentf46716f42040986203fa6e873bfdabe1be2900ec (diff)
downloadlibusb-fe0d8dce1ed704915d501e7da700440c78144211.tar.gz
Darwin: handle overflows
-rw-r--r--libusb/os/darwin_usb.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/libusb/os/darwin_usb.c b/libusb/os/darwin_usb.c
index 2ced118..9c64b60 100644
--- a/libusb/os/darwin_usb.c
+++ b/libusb/os/darwin_usb.c
@@ -81,6 +81,8 @@ static char *darwin_error_str (int result) {
return "transaction aborted";
case kIOReturnNotResponding:
return "device not responding";
+ case kIOReturnOverrun:
+ return "data overrun";
default:
return "unknown error";
}
@@ -1300,12 +1302,17 @@ static void darwin_bulk_callback (struct usbi_transfer *itransfer, kern_return_t
usbi_handle_transfer_cancellation(itransfer);
return;
case kIOUSBPipeStalled:
- _usbi_log (ITRANSFER_CTX (itransfer), LOG_LEVEL_WARNING, "unsupported control request");
+ _usbi_log (ITRANSFER_CTX (itransfer), LOG_LEVEL_WARNING, "bulk error. pipe is stalled");
status = LIBUSB_TRANSFER_STALL;
break;
+ case kIOReturnOverrun:
+ _usbi_log (ITRANSFER_CTX (itransfer), LOG_LEVEL_ERROR, "bulk error. data overrun", darwin_error_str (result));
+ status = LIBUSB_TRANSFER_OVERFLOW;
+
+ break;
default:
- _usbi_log (ITRANSFER_CTX (itransfer), LOG_LEVEL_ERROR, "control error = %s", darwin_error_str (result));
+ _usbi_log (ITRANSFER_CTX (itransfer), LOG_LEVEL_ERROR, "bulk error = %s (value = 0x%08x)", darwin_error_str (result), result);
status = LIBUSB_TRANSFER_ERROR;
}
@@ -1341,6 +1348,11 @@ static void darwin_isoc_callback (struct usbi_transfer *itransfer, kern_return_t
status = LIBUSB_TRANSFER_STALL;
break;
+ case kIOReturnOverrun:
+ _usbi_log (ITRANSFER_CTX (itransfer), LOG_LEVEL_ERROR, "bulk error. data overrun", darwin_error_str (result));
+ status = LIBUSB_TRANSFER_OVERFLOW;
+
+ break;
default:
_usbi_log (ITRANSFER_CTX (itransfer), LOG_LEVEL_ERROR, "control error = %s", darwin_error_str (result));
status = LIBUSB_TRANSFER_ERROR;