svn commit: r452496 - in head/sysutils/nut: . files

Cy Schubert cy at FreeBSD.org
Fri Oct 20 01:09:14 UTC 2017


Author: cy
Date: Fri Oct 20 01:09:12 2017
New Revision: 452496
URL: https://svnweb.freebsd.org/changeset/ports/452496

Log:
  Nut USB drivers report a "permission error" without visible reasons
  for the error even though permissions are OK (or the driver is run
  as root).
  
  Nut uses libusb-0.1 API, assuming return cods of < 0. FreeBSD provides
  a libusb-0.1 wrapper howerver it uses libusb-1.0 error codes (which
  are negative). This set of patches "teaches" nut libusb-1.0 error codes
  as produced by FreeBSD.
  
  Network UPS Tools (networkupstools.org) has a project to use libusb-1.0.
  This commit is a stopgap fix until our upline implments lubusb-1.0
  support in nut.
  
  PR:		223117
  Submitted by:	lev

Added:
  head/sysutils/nut/files/patch-drivers_blazer__usb.c   (contents, props changed)
  head/sysutils/nut/files/patch-drivers_libshut.c   (contents, props changed)
  head/sysutils/nut/files/patch-drivers_libusb.c   (contents, props changed)
  head/sysutils/nut/files/patch-drivers_libusb.h   (contents, props changed)
  head/sysutils/nut/files/patch-drivers_nutdrv__qx.c   (contents, props changed)
  head/sysutils/nut/files/patch-drivers_riello__usb.c   (contents, props changed)
  head/sysutils/nut/files/patch-drivers_tripplite__usb.c   (contents, props changed)
  head/sysutils/nut/files/patch-drivers_usbhid-ups.c   (contents, props changed)
Modified:
  head/sysutils/nut/Makefile   (contents, props changed)

Modified: head/sysutils/nut/Makefile
==============================================================================
--- head/sysutils/nut/Makefile	Fri Oct 20 00:01:04 2017	(r452495)
+++ head/sysutils/nut/Makefile	Fri Oct 20 01:09:12 2017	(r452496)
@@ -3,7 +3,7 @@
 
 PORTNAME=	nut
 PORTVERSION=	2.7.4
-PORTREVISION=	4
+PORTREVISION=	5
 CATEGORIES=	sysutils
 MASTER_SITES=	http://www.networkupstools.org/source/${PORTVERSION:R}/
 DISTFILES=	${DISTNAME}${EXTRACT_SUFX} ${DISTNAME}${EXTRACT_SUFX}.sig

Added: head/sysutils/nut/files/patch-drivers_blazer__usb.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sysutils/nut/files/patch-drivers_blazer__usb.c	Fri Oct 20 01:09:12 2017	(r452496)
@@ -0,0 +1,79 @@
+--- drivers/blazer_usb.c.orig	2015-12-29 12:08:34 UTC
++++ drivers/blazer_usb.c
+@@ -118,9 +118,9 @@ static int phoenix_command(const char *cmd, char *buf,
+ 		 */
+ 		switch (ret)
+ 		{
+-		case -EPIPE:		/* Broken pipe */
++		case LIBUSB_ERROR_PIPE:		/* Broken pipe */
+ 			usb_clear_halt(udev, 0x81);
+-		case -ETIMEDOUT:	/* Connection timed out */
++		case LIBUSB_ERROR_TIMEOUT:	/* Connection timed out */
+ 			break;
+ 		}
+ 
+@@ -188,7 +188,7 @@ static int ippon_command(const char *cmd, char *buf, s
+ 			0x09, 0x2, 0, &tmp[i], 8, 1000);
+ 
+ 		if (ret <= 0) {
+-			upsdebugx(3, "send: %s", (ret != -ETIMEDOUT) ? usb_strerror() : "Connection timed out");
++			upsdebugx(3, "send: %s", (ret != LIBUSB_ERROR_TIMEOUT) ? usb_strerror() : "Connection timed out");
+ 			return ret;
+ 		}
+ 	}
+@@ -203,7 +203,7 @@ static int ippon_command(const char *cmd, char *buf, s
+ 	 * will happen after successfully writing a command to the UPS)
+ 	 */
+ 	if (ret <= 0) {
+-		upsdebugx(3, "read: %s", (ret != -ETIMEDOUT) ? usb_strerror() : "Connection timed out");
++		upsdebugx(3, "read: %s", (ret != LIBUSB_ERROR_TIMEOUT) ? usb_strerror() : "Connection timed out");
+ 		return ret;
+ 	}
+ 
+@@ -423,38 +423,28 @@ int blazer_command(const char *cmd, char *buf, size_t 
+ 
+ 	switch (ret)
+ 	{
+-	case -EBUSY:		/* Device or resource busy */
++	case LIBUSB_ERROR_BUSY:		/* Device or resource busy */
+ 		fatal_with_errno(EXIT_FAILURE, "Got disconnected by another driver");
+ 
+-	case -EPERM:		/* Operation not permitted */
+-		fatal_with_errno(EXIT_FAILURE, "Permissions problem");
+-
+-	case -EPIPE:		/* Broken pipe */
++	case LIBUSB_ERROR_PIPE:		/* Broken pipe */
+ 		if (usb_clear_halt(udev, 0x81) == 0) {
+ 			upsdebugx(1, "Stall condition cleared");
+ 			break;
+ 		}
+-#ifdef ETIME
+-	case -ETIME:		/* Timer expired */
+-#endif
+ 		if (usb_reset(udev) == 0) {
+ 			upsdebugx(1, "Device reset handled");
+ 		}
+-	case -ENODEV:		/* No such device */
+-	case -EACCES:		/* Permission denied */
+-	case -EIO:		/* I/O error */
+-	case -ENXIO:		/* No such device or address */
+-	case -ENOENT:		/* No such file or directory */
++	case LIBUSB_ERROR_NO_DEVICE: /* No such device */
++	case LIBUSB_ERROR_ACCESS:    /* Permission denied */
++	case LIBUSB_ERROR_IO:        /* I/O error */
++	case LIBUSB_ERROR_NOT_FOUND: /* No such file or directory */
+ 		/* Uh oh, got to reconnect! */
+ 		usb->close(udev);
+ 		udev = NULL;
+ 		break;
+ 
+-	case -ETIMEDOUT:	/* Connection timed out */
+-	case -EOVERFLOW:	/* Value too large for defined data type */
+-#ifdef EPROTO
+-	case -EPROTO:		/* Protocol error */
+-#endif
++	case LIBUSB_ERROR_TIMEOUT:  /* Connection timed out */
++	case LIBUSB_ERROR_OVERFLOW: /* Value too large for defined data type */
+ 	default:
+ 		break;
+ 	}

Added: head/sysutils/nut/files/patch-drivers_libshut.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sysutils/nut/files/patch-drivers_libshut.c	Fri Oct 20 01:09:12 2017	(r452496)
@@ -0,0 +1,15 @@
+--- drivers/libshut.c.orig	2015-12-29 12:08:34 UTC
++++ drivers/libshut.c
+@@ -809,10 +809,10 @@ int shut_get_string_simple(int upsfd, int index,
+ 		return ret;
+ 
+ 	if (tbuf[1] != USB_DT_STRING)
+-		return -EIO;
++		return LIBUSB_ERROR_IO;
+ 
+ 	if (tbuf[0] > ret)
+-		return -EFBIG;
++		return LIBUSB_ERROR_OVERFLOW;
+ 
+ 	/* skip the UTF8 zero'ed high bytes */
+ 	for (di = 0, si = 2; si < tbuf[0]; si += 2)

Added: head/sysutils/nut/files/patch-drivers_libusb.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sysutils/nut/files/patch-drivers_libusb.c	Fri Oct 20 01:09:12 2017	(r452496)
@@ -0,0 +1,65 @@
+--- drivers/libusb.c.orig	2015-12-29 12:08:34 UTC
++++ drivers/libusb.c
+@@ -428,26 +428,21 @@ static int libusb_strerror(const int ret, const char *
+ 
+ 	switch(ret)
+ 	{
+-	case -EBUSY:	/* Device or resource busy */
+-	case -EPERM:	/* Operation not permitted */
+-	case -ENODEV:	/* No such device */
+-	case -EACCES:	/* Permission denied */
+-	case -EIO:	/* I/O error */
+-	case -ENXIO:	/* No such device or address */
+-	case -ENOENT:	/* No such file or directory */
+-	case -EPIPE:	/* Broken pipe */
+-	case -ENOSYS:	/* Function not implemented */
++	case LIBUSB_ERROR_BUSY:			/* Device or resource busy */
++	case LIBUSB_ERROR_NO_DEVICE:		/* No such device */
++	case LIBUSB_ERROR_ACCESS:		/* Permission denied */
++	case LIBUSB_ERROR_IO:			/* I/O error */
++	case LIBUSB_ERROR_NOT_FOUND:		/* No such file or directory */
++	case LIBUSB_ERROR_PIPE:			/* Broken pipe */
++	case LIBUSB_ERROR_NOT_SUPPORTED:	/* Function not implemented */
+ 		upslogx(LOG_DEBUG, "%s: %s", desc, usb_strerror());
+ 		return ret;
+ 
+-	case -ETIMEDOUT:	/* Connection timed out */
++	case LIBUSB_ERROR_TIMEOUT:		/* Connection timed out */
+ 		upsdebugx(2, "%s: Connection timed out", desc);
+ 		return 0;
+ 
+-	case -EOVERFLOW:	/* Value too large for defined data type */
+-#ifdef EPROTO
+-	case -EPROTO:	/* Protocol error */
+-#endif
++	case LIBUSB_ERROR_OVERFLOW:		/* Value too large for defined data type */
+ 		upsdebugx(2, "%s: %s", desc, usb_strerror());
+ 		return 0;
+ 
+@@ -478,7 +473,7 @@ static int libusb_get_report(usb_dev_handle *udev, int
+ 		0, raw_buf, ReportSize, USB_TIMEOUT);
+ 
+ 	/* Ignore "protocol stall" (for unsupported request) on control endpoint */
+-	if (ret == -EPIPE) {
++	if (ret == LIBUSB_ERROR_PIPE) {
+ 		return 0;
+ 	}
+ 
+@@ -500,7 +495,7 @@ static int libusb_set_report(usb_dev_handle *udev, int
+ 		0, raw_buf, ReportSize, USB_TIMEOUT);
+ 
+ 	/* Ignore "protocol stall" (for unsupported request) on control endpoint */
+-	if (ret == -EPIPE) {
++	if (ret == LIBUSB_ERROR_PIPE) {
+ 		return 0;
+ 	}
+ 
+@@ -532,7 +527,7 @@ static int libusb_get_interrupt(usb_dev_handle *udev, 
+ 	ret = usb_interrupt_read(udev, 0x81, (char *)buf, bufsize, timeout);
+ 
+ 	/* Clear stall condition */
+-	if (ret == -EPIPE) {
++	if (ret == LIBUSB_ERROR_PIPE) {
+ 		ret = usb_clear_halt(udev, 0x81);
+ 	}
+ 

Added: head/sysutils/nut/files/patch-drivers_libusb.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sysutils/nut/files/patch-drivers_libusb.h	Fri Oct 20 01:09:12 2017	(r452496)
@@ -0,0 +1,27 @@
+--- drivers/libusb.h.orig	2015-12-29 12:08:34 UTC
++++ drivers/libusb.h
+@@ -36,6 +36,24 @@
+ 
+ #include <usb.h>	/* libusb header file */
+ 
++/* libusb 1.0 errors used by FreeBSD */
++enum libusb_error {
++        LIBUSB_SUCCESS = 0,
++        LIBUSB_ERROR_IO = -1,
++        LIBUSB_ERROR_INVALID_PARAM = -2,
++        LIBUSB_ERROR_ACCESS = -3,
++        LIBUSB_ERROR_NO_DEVICE = -4,
++        LIBUSB_ERROR_NOT_FOUND = -5,
++        LIBUSB_ERROR_BUSY = -6,
++        LIBUSB_ERROR_TIMEOUT = -7,
++        LIBUSB_ERROR_OVERFLOW = -8,
++        LIBUSB_ERROR_PIPE = -9,
++        LIBUSB_ERROR_INTERRUPTED = -10,
++        LIBUSB_ERROR_NO_MEM = -11,
++        LIBUSB_ERROR_NOT_SUPPORTED = -12,
++        LIBUSB_ERROR_OTHER = -99,
++};
++
+ extern upsdrv_info_t comm_upsdrv_info; 
+ 
+ /*!

Added: head/sysutils/nut/files/patch-drivers_nutdrv__qx.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sysutils/nut/files/patch-drivers_nutdrv__qx.c	Fri Oct 20 01:09:12 2017	(r452496)
@@ -0,0 +1,79 @@
+--- drivers/nutdrv_qx.c.orig	2016-03-08 12:01:11 UTC
++++ drivers/nutdrv_qx.c
+@@ -561,9 +561,9 @@ static int	phoenix_command(const char *cmd, char *buf,
+ 		 * In order to read correct replies we need to flush the output buffers of the converter until we get no more data (ie, it times out). */
+ 		switch (ret)
+ 		{
+-		case -EPIPE:		/* Broken pipe */
++		case LIBUSB_ERROR_PIPE:		/* Broken pipe */
+ 			usb_clear_halt(udev, 0x81);
+-		case -ETIMEDOUT:	/* Connection timed out */
++		case LIBUSB_ERROR_TIMEOUT:	/* Connection timed out */
+ 			break;
+ 		}
+ 
+@@ -635,7 +635,7 @@ static int	ippon_command(const char *cmd, char *buf, s
+ 		ret = usb_control_msg(udev, USB_ENDPOINT_OUT + USB_TYPE_CLASS + USB_RECIP_INTERFACE, 0x09, 0x2, 0, &tmp[i], 8, 1000);
+ 
+ 		if (ret <= 0) {
+-			upsdebugx(3, "send: %s (%d)", (ret != -ETIMEDOUT) ? usb_strerror() : "Connection timed out", ret);
++			upsdebugx(3, "send: %s (%d)", (ret != LIBUSB_ERROR_TIMEOUT) ? usb_strerror() : "Connection timed out", ret);
+ 			return ret;
+ 		}
+ 
+@@ -648,7 +648,7 @@ static int	ippon_command(const char *cmd, char *buf, s
+ 
+ 	/* Any errors here mean that we are unable to read a reply (which will happen after successfully writing a command to the UPS) */
+ 	if (ret <= 0) {
+-		upsdebugx(3, "read: %s (%d)", (ret != -ETIMEDOUT) ? usb_strerror() : "Connection timed out", ret);
++		upsdebugx(3, "read: %s (%d)", (ret != LIBUSB_ERROR_TIMEOUT) ? usb_strerror() : "Connection timed out", ret);
+ 		return ret;
+ 	}
+ 
+@@ -2124,38 +2124,28 @@ static int	qx_command(const char *cmd, char *buf, size
+ 
+ 		switch (ret)
+ 		{
+-		case -EBUSY:		/* Device or resource busy */
++		case LIBUSB_ERROR_BUSY:		/* Device or resource busy */
+ 			fatal_with_errno(EXIT_FAILURE, "Got disconnected by another driver");
+ 
+-		case -EPERM:		/* Operation not permitted */
+-			fatal_with_errno(EXIT_FAILURE, "Permissions problem");
+-
+-		case -EPIPE:		/* Broken pipe */
++		case LIBUSB_ERROR_PIPE:		/* Broken pipe */
+ 			if (usb_clear_halt(udev, 0x81) == 0) {
+ 				upsdebugx(1, "Stall condition cleared");
+ 				break;
+ 			}
+-	#ifdef ETIME
+-		case -ETIME:		/* Timer expired */
+-	#endif	/* ETIME */
+ 			if (usb_reset(udev) == 0) {
+ 				upsdebugx(1, "Device reset handled");
+ 			}
+-		case -ENODEV:		/* No such device */
+-		case -EACCES:		/* Permission denied */
+-		case -EIO:		/* I/O error */
+-		case -ENXIO:		/* No such device or address */
+-		case -ENOENT:		/* No such file or directory */
++		case LIBUSB_ERROR_NO_DEVICE: /* No such device */
++		case LIBUSB_ERROR_ACCESS:    /* Permission denied */
++		case LIBUSB_ERROR_IO:        /* I/O error */
++		case LIBUSB_ERROR_NOT_FOUND: /* No such file or directory */
+ 			/* Uh oh, got to reconnect! */
+ 			usb->close(udev);
+ 			udev = NULL;
+ 			break;
+ 
+-		case -ETIMEDOUT:	/* Connection timed out */
+-		case -EOVERFLOW:	/* Value too large for defined data type */
+-#ifdef EPROTO
+-		case -EPROTO:		/* Protocol error */
+-#endif
++		case LIBUSB_ERROR_TIMEOUT:  /* Connection timed out */
++		case LIBUSB_ERROR_OVERFLOW: /* Value too large for defined data type */
+ 		default:
+ 			break;
+ 		}

Added: head/sysutils/nut/files/patch-drivers_riello__usb.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sysutils/nut/files/patch-drivers_riello__usb.c	Fri Oct 20 01:09:12 2017	(r452496)
@@ -0,0 +1,53 @@
+--- drivers/riello_usb.c.orig	2015-12-29 12:08:34 UTC
++++ drivers/riello_usb.c
+@@ -346,42 +346,28 @@ int riello_command(uint8_t *cmd, uint8_t *buf, uint16_
+ 
+ 	switch (ret)
+ 	{
+-	case -EBUSY:		/* Device or resource busy */
++	case LIBUSB_ERROR_BUSY:		/* Device or resource busy */
+ 		fatal_with_errno(EXIT_FAILURE, "Got disconnected by another driver");
+ 
+-	case -EPERM:		/* Operation not permitted */
+-		fatal_with_errno(EXIT_FAILURE, "Permissions problem");
+-
+-	case -EPIPE:		/* Broken pipe */
++	case LIBUSB_ERROR_PIPE:		/* Broken pipe */
+ 		if (usb_clear_halt(udev, 0x81) == 0) {
+ 			upsdebugx(1, "Stall condition cleared");
+ 			break;
+ 		}
+-#ifdef ETIME
+-	case -ETIME:		/* Timer expired */
+-#endif
+ 		if (usb_reset(udev) == 0) {
+ 			upsdebugx(1, "Device reset handled");
+ 		}
+-	case -ENODEV:		/* No such device */
+-	case -EACCES:		/* Permission denied */
+-	case -EIO:		/* I/O error */
+-	case -ENXIO:		/* No such device or address */
+-	case -ENOENT:		/* No such file or directory */
++	case LIBUSB_ERROR_NO_DEVICE: /* No such device */
++	case LIBUSB_ERROR_ACCESS:    /* Permission denied */
++	case LIBUSB_ERROR_IO:        /* I/O error */
++	case LIBUSB_ERROR_NOT_FOUND: /* No such file or directory */
+ 		/* Uh oh, got to reconnect! */
+ 		usb->close(udev);
+ 		udev = NULL;
+ 		break;
+ 
+-	case -ETIMEDOUT:	/* Connection timed out */
+-		upsdebugx (3, "riello_command err: Resource temporarily unavailable");
+-
+-
+-	case -EOVERFLOW:	/* Value too large for defined data type */
+-#ifdef EPROTO
+-	case -EPROTO:		/* Protocol error */
+-#endif
+-		break;
++	case LIBUSB_ERROR_TIMEOUT:  /* Connection timed out */
++	case LIBUSB_ERROR_OVERFLOW: /* Value too large for defined data type */
+ 	default:
+ 		break;
+ 	}

Added: head/sysutils/nut/files/patch-drivers_tripplite__usb.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sysutils/nut/files/patch-drivers_tripplite__usb.c	Fri Oct 20 01:09:12 2017	(r452496)
@@ -0,0 +1,20 @@
+--- drivers/tripplite_usb.c.orig	2015-12-29 12:08:34 UTC
++++ drivers/tripplite_usb.c
+@@ -499,7 +499,7 @@ void usb_comm_fail(int res, const char *msg)
+ 	static int try = 0;
+ 
+ 	switch(res) {
+-		case -EBUSY:
++		case LIBUSB_ERROR_BUSY:
+ 			upslogx(LOG_WARNING, "%s: Device claimed by another process", msg);
+ 			fatalx(EXIT_FAILURE, "Terminating: EBUSY");
+ 			break;
+@@ -907,7 +907,7 @@ void upsdrv_initinfo(void)
+ 	if(tl_model != TRIPP_LITE_SMARTPRO ) {
+ 		ret = send_cmd(w_msg, sizeof(w_msg), w_value, sizeof(w_value)-1);
+ 		if(ret <= 0) {
+-			if(ret == -EPIPE) {
++			if(ret == LIBUSB_ERROR_PIPE) {
+ 				fatalx(EXIT_FAILURE, "Could not reset watchdog. Please check and"
+ 						"see if usbhid-ups(8) works with this UPS.");
+ 			} else {

Added: head/sysutils/nut/files/patch-drivers_usbhid-ups.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sysutils/nut/files/patch-drivers_usbhid-ups.c	Fri Oct 20 01:09:12 2017	(r452496)
@@ -0,0 +1,66 @@
+--- drivers/usbhid-ups.c.orig	2015-12-29 12:08:34 UTC
++++ drivers/usbhid-ups.c
+@@ -790,22 +790,14 @@ void upsdrv_updateinfo(void)
+ 	/* Get HID notifications on Interrupt pipe first */
+ 	if (use_interrupt_pipe == TRUE) {
+ 		evtCount = HIDGetEvents(udev, event, MAX_EVENT_NUM);
+-		switch (evtCount)
+-		{
+-		case -EBUSY:		/* Device or resource busy */
+-			upslog_with_errno(LOG_CRIT, "Got disconnected by another driver");
+-		case -EPERM:		/* Operation not permitted */
+-		case -ENODEV:		/* No such device */
+-		case -EACCES:		/* Permission denied */
+-		case -EIO:		/* I/O error */
+-		case -ENXIO:		/* No such device or address */
+-		case -ENOENT:		/* No such file or directory */
++		if (evtCount < 0) {
++			if (evtCount == LIBUSB_ERROR_BUSY) {
++				upslog_with_errno(LOG_CRIT, "Got disconnected by another driver");
++			}
+ 			/* Uh oh, got to reconnect! */
+ 			hd = NULL;
+-			return;
+-		default:
++		} else {
+ 			upsdebugx(1, "Got %i HID objects...", (evtCount >= 0) ? evtCount : 0);
+-			break;
+ 		}
+ 	} else {
+ 		evtCount = 0;
+@@ -1280,14 +1272,12 @@ static bool_t hid_ups_walk(walkmode_t mode)
+ 
+ 		switch (retcode)
+ 		{
+-		case -EBUSY:		/* Device or resource busy */
++		case LIBUSB_ERROR_BUSY:		/* Device or resource busy */
+ 			upslog_with_errno(LOG_CRIT, "Got disconnected by another driver");
+-		case -EPERM:		/* Operation not permitted */
+-		case -ENODEV:		/* No such device */
+-		case -EACCES:		/* Permission denied */
+-		case -EIO:		/* I/O error */
+-		case -ENXIO:		/* No such device or address */
+-		case -ENOENT:		/* No such file or directory */
++		case LIBUSB_ERROR_NO_DEVICE:		/* No such device */
++		case LIBUSB_ERROR_ACCESS:		/* Permission denied */
++		case LIBUSB_ERROR_IO:			/* I/O error */
++		case LIBUSB_ERROR_NOT_FOUND:		/* No such file or directory */
+ 			/* Uh oh, got to reconnect! */
+ 			hd = NULL;
+ 			return FALSE;
+@@ -1298,12 +1288,9 @@ static bool_t hid_ups_walk(walkmode_t mode)
+ 		case 0:
+ 			continue;
+ 
+-		case -ETIMEDOUT:	/* Connection timed out */
+-		case -EOVERFLOW:	/* Value too large for defined data type */
+-#ifdef EPROTO
+-		case -EPROTO:		/* Protocol error */
+-#endif
+-		case -EPIPE:		/* Broken pipe */
++		case LIBUSB_ERROR_TIMEOUT:	/* Connection timed out */
++		case LIBUSB_ERROR_OVERFLOW:	/* Value too large for defined data type */
++		case LIBUSB_ERROR_PIPE:		/* Broken pipe */
+ 		default:
+ 			/* Don't know what happened, try again later... */
+ 			continue;


More information about the svn-ports-all mailing list