diff options
author | andreas <andreas@FreeBSD.org> | 2003-11-26 03:35:43 +0800 |
---|---|---|
committer | andreas <andreas@FreeBSD.org> | 2003-11-26 03:35:43 +0800 |
commit | 78fd2213c1b8d3ffd7fd6e35a4db753df7defecb (patch) | |
tree | f8d805372cc75ea2748a70cb3a922d29133a6125 /devel | |
parent | 8d02851893088fbd6325b8f856c6d36f021ad541 (diff) | |
download | freebsd-ports-gnome-78fd2213c1b8d3ffd7fd6e35a4db753df7defecb.tar.gz freebsd-ports-gnome-78fd2213c1b8d3ffd7fd6e35a4db753df7defecb.tar.zst freebsd-ports-gnome-78fd2213c1b8d3ffd7fd6e35a4db753df7defecb.zip |
- 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 <emsi@ipartners.pl>
Reviewed by: John Reynolds <johnjen@reynoldsnet.org> and some tester
Approved by: portmgr@ (Joe Marcus Clarke <marcus@marcuscom.com>)
Diffstat (limited to 'devel')
-rw-r--r-- | devel/libusb/Makefile | 1 | ||||
-rw-r--r-- | devel/libusb/files/patch-bsd.c | 62 |
2 files changed, 63 insertions, 0 deletions
diff --git a/devel/libusb/Makefile b/devel/libusb/Makefile index eb38a81e66a0..3630bc2a620b 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 000000000000..7f188bf7feb0 --- /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, |