summaryrefslogtreecommitdiffstats
path: root/lib/libusb/libusb10.c
diff options
context:
space:
mode:
authorhselasky <hselasky@FreeBSD.org>2010-10-14 20:50:33 +0000
committerhselasky <hselasky@FreeBSD.org>2010-10-14 20:50:33 +0000
commitecefb244aff61bcce93f5b8b5deb0416b6034c6b (patch)
tree83410bd0d3fa7d0db2ea2decf8b4369d322cf1dc /lib/libusb/libusb10.c
parent1c90ef127420e8aa353a34eb7fcf3d20ec303c46 (diff)
downloadFreeBSD-src-ecefb244aff61bcce93f5b8b5deb0416b6034c6b.zip
FreeBSD-src-ecefb244aff61bcce93f5b8b5deb0416b6034c6b.tar.gz
- Add missing LibUSB API functions:
* libusb_strerror() * libusb_get_driver[_np]() * libusb_detach_kernel_driver[_np]() - Factor out setting of non-blocking flag inside libusb. - Add missing NULL check after libusb_get_device() call. - Correct some wrong error codes due to copy and paste error. PR: usb/150546 Submitted by: Robert Jenssen, Alexander Leidinger Approved by: thompsa (mentor)
Diffstat (limited to 'lib/libusb/libusb10.c')
-rw-r--r--lib/libusb/libusb10.c84
1 files changed, 72 insertions, 12 deletions
diff --git a/lib/libusb/libusb10.c b/lib/libusb/libusb10.c
index 7d6c9d9..5767cb2 100644
--- a/lib/libusb/libusb10.c
+++ b/lib/libusb/libusb10.c
@@ -70,12 +70,30 @@ libusb_set_debug(libusb_context *ctx, int level)
ctx->debug = level;
}
+static void
+libusb_set_nonblocking(int f)
+{
+ int flags;
+
+ /*
+ * We ignore any failures in this function, hence the
+ * non-blocking flag is not critical to the operation of
+ * libUSB. We use F_GETFL and F_SETFL to be compatible with
+ * Linux.
+ */
+
+ flags = fcntl(f, F_GETFL, NULL);
+ if (flags == -1)
+ return;
+ flags |= O_NONBLOCK;
+ fcntl(f, F_SETFL, flags);
+}
+
int
libusb_init(libusb_context **context)
{
struct libusb_context *ctx;
char *debug;
- int flag;
int ret;
ctx = malloc(sizeof(*ctx));
@@ -106,12 +124,8 @@ libusb_init(libusb_context **context)
return (LIBUSB_ERROR_OTHER);
}
/* set non-blocking mode on the control pipe to avoid deadlock */
- flag = 1;
- ret = fcntl(ctx->ctrl_pipe[0], O_NONBLOCK, &flag);
- assert(ret != -1 && "Couldn't set O_NONBLOCK for ctx->ctrl_pipe[0]");
- flag = 1;
- ret = fcntl(ctx->ctrl_pipe[1], O_NONBLOCK, &flag);
- assert(ret != -1 && "Couldn't set O_NONBLOCK for ctx->ctrl_pipe[1]");
+ libusb_set_nonblocking(ctx->ctrl_pipe[0]);
+ libusb_set_nonblocking(ctx->ctrl_pipe[1]);
libusb10_add_pollfd(ctx, &ctx->ctx_poll, NULL, ctx->ctrl_pipe[0], POLLIN);
@@ -356,7 +370,7 @@ libusb_open(libusb_device *dev, libusb_device_handle **devh)
/* make sure our event loop detects the new device */
dummy = 0;
err = write(ctx->ctrl_pipe[1], &dummy, sizeof(dummy));
- if (err < sizeof(dummy)) {
+ if (err < (int)sizeof(dummy)) {
/* ignore error, if any */
DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_open write failed!");
}
@@ -431,7 +445,7 @@ libusb_close(struct libusb20_device *pdev)
/* make sure our event loop detects the closed device */
dummy = 0;
err = write(ctx->ctrl_pipe[1], &dummy, sizeof(dummy));
- if (err < sizeof(dummy)) {
+ if (err < (int)sizeof(dummy)) {
/* ignore error, if any */
DPRINTF(ctx, LIBUSB_DEBUG_FUNCTION, "libusb_close write failed!");
}
@@ -473,7 +487,6 @@ libusb_set_configuration(struct libusb20_device *pdev, int configuration)
uint8_t i;
dev = libusb_get_device(pdev);
-
if (dev == NULL)
return (LIBUSB_ERROR_INVALID_PARAM);
@@ -620,6 +633,8 @@ libusb_clear_halt(struct libusb20_device *pdev, uint8_t endpoint)
return (LIBUSB_ERROR_INVALID_PARAM);
dev = libusb_get_device(pdev);
+ if (dev == NULL)
+ return (LIBUSB_ERROR_INVALID_PARAM);
CTX_LOCK(dev->ctx);
err = libusb20_tr_open(xfer, 0, 0, endpoint);
@@ -647,7 +662,7 @@ libusb_reset_device(struct libusb20_device *pdev)
dev = libusb_get_device(pdev);
if (dev == NULL)
- return (LIBUSB20_ERROR_INVALID_PARAM);
+ return (LIBUSB_ERROR_INVALID_PARAM);
libusb10_cancel_all_transfer(dev);
@@ -688,6 +703,45 @@ libusb_kernel_driver_active(struct libusb20_device *pdev, int interface)
}
int
+libusb_get_driver_np(struct libusb20_device *pdev, int interface,
+ char *name, int namelen)
+{
+ return (libusb_get_driver(pdev, interface, name, namelen));
+}
+
+int
+libusb_get_driver(struct libusb20_device *pdev, int interface,
+ char *name, int namelen)
+{
+ char *ptr;
+ int err;
+
+ if (pdev == NULL)
+ return (LIBUSB_ERROR_INVALID_PARAM);
+ if (namelen < 1)
+ return (LIBUSB_ERROR_INVALID_PARAM);
+
+ err = libusb20_dev_get_iface_desc(
+ pdev, interface, name, namelen);
+
+ if (err != 0)
+ return (LIBUSB_ERROR_OTHER);
+
+ /* we only want the driver name */
+ ptr = strstr(name, ":");
+ if (ptr != NULL)
+ *ptr = 0;
+
+ return (0);
+}
+
+int
+libusb_detach_kernel_driver_np(struct libusb20_device *pdev, int interface)
+{
+ return (libusb_detach_kernel_driver(pdev, interface));
+}
+
+int
libusb_detach_kernel_driver(struct libusb20_device *pdev, int interface)
{
int err;
@@ -698,7 +752,7 @@ libusb_detach_kernel_driver(struct libusb20_device *pdev, int interface)
err = libusb20_dev_detach_kernel_driver(
pdev, interface);
- return (err ? LIBUSB20_ERROR_OTHER : 0);
+ return (err ? LIBUSB_ERROR_OTHER : 0);
}
int
@@ -1377,3 +1431,9 @@ libusb_le16_to_cpu(uint16_t x)
return (le16toh(x));
}
+const char *
+libusb_strerror(int code)
+{
+ /* TODO */
+ return ("Unknown error");
+}
OpenPOWER on IntegriCloud