From 78fd2213c1b8d3ffd7fd6e35a4db753df7defecb Mon Sep 17 00:00:00 2001 From: andreas Date: Tue, 25 Nov 2003 19:35:43 +0000 Subject: - fix for PR 58925 solves problem of hanging usb sessions with cams using gphoto2 ptp2 driver - bumped port revision - tested by different people under -current and -stable, no ill side effects and really cures the problem. The author of bsd.c clearly states out in the sources, that he has ported codee from linux 1:1 and he "kind of hopes" that it is ok. But it wasn't. This patch fixes hang that happens after the 1st read because the USB driver tries to read more bytes than are available. 0000 10 00 00 00 01 00 02 10-00 00 00 00 01 00 00 00 ................ 1.240828 gphoto2-port(2): Reading 512=0x200 bytes from port... gp_port_read: Operation timed out 9.267455 PTP2/library.c(2): PTP: gp_port_* function returned 0xffffffde -34 9.267819 context(0): PTP I/O error PR: 58925 Submitted by: Mariusz Woloszyn Reviewed by: John Reynolds and some tester Approved by: portmgr@ (Joe Marcus Clarke ) --- devel/libusb/Makefile | 1 + devel/libusb/files/patch-bsd.c | 62 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+) create mode 100644 devel/libusb/files/patch-bsd.c (limited to 'devel/libusb') diff --git a/devel/libusb/Makefile b/devel/libusb/Makefile index eb38a81..3630bc2 100644 --- a/devel/libusb/Makefile +++ b/devel/libusb/Makefile @@ -7,6 +7,7 @@ PORTNAME= libusb PORTVERSION= 0.1.7 +PORTREVISION= 1 CATEGORIES= devel MASTER_SITES= ${MASTER_SITE_SOURCEFORGE} MASTER_SITE_SUBDIR= ${PORTNAME} diff --git a/devel/libusb/files/patch-bsd.c b/devel/libusb/files/patch-bsd.c new file mode 100644 index 0000000..7f188bf --- /dev/null +++ b/devel/libusb/files/patch-bsd.c @@ -0,0 +1,62 @@ +--- bsd.c.orig Mon Nov 11 19:04:16 2002 ++++ bsd.c Sun Nov 23 15:51:49 2003 +@@ -276,7 +276,7 @@ + int usb_bulk_write(usb_dev_handle *dev, int ep, char *bytes, int size, + int timeout) + { +- int fd, ret, sent = 0; ++ int fd, ret; + + /* Ensure the endpoint address is correct */ + ep &= ~USB_ENDPOINT_IN; +@@ -298,8 +298,7 @@ + USB_ERROR_STR(ret, "error setting timeout: %s", + strerror(errno)); + +- do { +- ret = write(fd, bytes+sent, size-sent); ++ ret = write(fd, bytes, size); + if (ret < 0) + #if __FreeBSD__ + USB_ERROR_STR(ret, "error writing to bulk endpoint %s.%d: %s", +@@ -309,16 +308,13 @@ + dev->device->filename, UE_GET_ADDR(ep), strerror(errno)); + #endif + +- sent += ret; +- } while(ret > 0 && sent < size); +- +- return sent; ++ return ret; + } + + int usb_bulk_read(usb_dev_handle *dev, int ep, char *bytes, int size, + int timeout) + { +- int fd, ret, retrieved = 0, one = 1; ++ int fd, ret, one = 1; + + /* Ensure the endpoint address is correct */ + ep |= USB_ENDPOINT_IN; +@@ -345,8 +341,7 @@ + USB_ERROR_STR(ret, "error setting short xfer: %s", + strerror(errno)); + +- do { +- ret = read(fd, bytes+retrieved, size-retrieved); ++ ret = read(fd, bytes, size); + if (ret < 0) + #if __FreeBSD__ + USB_ERROR_STR(ret, "error reading from bulk endpoint %s.%d: %s", +@@ -355,10 +350,8 @@ + USB_ERROR_STR(ret, "error reading from bulk endpoint %s.%02d: %s", + dev->device->filename, UE_GET_ADDR(ep), strerror(errno)); + #endif +- retrieved += ret; +- } while (ret > 0 && retrieved < size); + +- return retrieved; ++ return ret; + } + + int usb_control_msg(usb_dev_handle *dev, int requesttype, int request, -- cgit v1.1