diff options
author | David Engraf <david.engraf@netcom.eu> | 2008-05-19 15:16:32 +0100 |
---|---|---|
committer | Daniel Drake <dsd@gentoo.org> | 2008-05-19 15:16:32 +0100 |
commit | a345bacb6f07ebb2122402041a9e8092d4a20a4d (patch) | |
tree | 6fd3ed16eaff5a1f9c8943aaa15e7c822159a1bf | |
parent | e44396a458ecea9e5edd9a7577e617571c76860d (diff) | |
download | libusb-a345bacb6f07ebb2122402041a9e8092d4a20a4d.tar.gz |
Linux: fix handling of ioctl failure
The return value of some ioctl commands in linux_usbfs.c are not
handeled correct. The ioctl function returns != 0 and errno is set with
the error code.
-rw-r--r-- | libusb/os/linux_usbfs.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/libusb/os/linux_usbfs.c b/libusb/os/linux_usbfs.c index 82f1ac8..7dc6b6c 100644 --- a/libusb/os/linux_usbfs.c +++ b/libusb/os/linux_usbfs.c @@ -1186,7 +1186,7 @@ static int submit_bulk_transfer(struct usbi_transfer *itransfer, int tmp = ioctl(dpriv->fd, IOCTL_USBFS_DISCARDURB, &urbs[j]); if (tmp == 0) tpriv->awaiting_discard++; - else if (tmp == -EINVAL) + else if (errno == EINVAL) tpriv->awaiting_reap++; else usbi_warn("unrecognised discard return %d", tmp); @@ -1340,7 +1340,7 @@ static int submit_iso_transfer(struct usbi_transfer *itransfer) int tmp = ioctl(dpriv->fd, IOCTL_USBFS_DISCARDURB, urbs[j]); if (tmp == 0) tpriv->awaiting_discard++; - else if (tmp == -EINVAL) + else if (errno == EINVAL) tpriv->awaiting_reap++; else usbi_warn("unrecognised discard return %d", tmp); @@ -1425,12 +1425,14 @@ static int cancel_control_transfer(struct usbi_transfer *itransfer) tpriv->reap_action = CANCELLED; r = ioctl(dpriv->fd, IOCTL_USBFS_DISCARDURB, tpriv->urbs); - if (r == -EINVAL) { - usbi_dbg("URB not found --> assuming ready to be reaped"); - return 0; - } else if (r) { - usbi_err("unrecognised DISCARD code %d", r); - return LIBUSB_ERROR_OTHER; + if(r) { + if (errno == EINVAL) { + usbi_dbg("URB not found --> assuming ready to be reaped"); + return 0; + } else { + usbi_err("unrecognised DISCARD code %d", errno); + return LIBUSB_ERROR_OTHER; + } } return 0; @@ -1450,10 +1452,10 @@ static void cancel_bulk_transfer(struct usbi_transfer *itransfer) int tmp = ioctl(dpriv->fd, IOCTL_USBFS_DISCARDURB, &tpriv->urbs[i]); if (tmp == 0) tpriv->awaiting_discard++; - else if (tmp == -EINVAL) + else if (errno == EINVAL) tpriv->awaiting_reap++; else - usbi_warn("unrecognised discard return %d", tmp); + usbi_warn("unrecognised discard return %d", errno); } } @@ -1471,10 +1473,10 @@ static void cancel_iso_transfer(struct usbi_transfer *itransfer) int tmp = ioctl(dpriv->fd, IOCTL_USBFS_DISCARDURB, tpriv->iso_urbs[i]); if (tmp == 0) tpriv->awaiting_discard++; - else if (tmp == -EINVAL) + else if (errno == EINVAL) tpriv->awaiting_reap++; else - usbi_warn("unrecognised discard return %d", tmp); + usbi_warn("unrecognised discard return %d", errno); } } @@ -1603,10 +1605,10 @@ static int handle_bulk_completion(struct usbi_transfer *itransfer, int r = ioctl(dpriv->fd, IOCTL_USBFS_DISCARDURB, &tpriv->urbs[i]); if (r == 0) tpriv->awaiting_discard++; - else if (r == -EINVAL) + else if (errno == EINVAL) tpriv->awaiting_reap++; else - usbi_warn("unrecognised discard return %d", r); + usbi_warn("unrecognised discard return %d", errno); } return 0; } else { |