Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F137948314
D50818.id158250.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D50818.id158250.diff
View Options
diff --git a/lib/libusb/libusb.h b/lib/libusb/libusb.h
--- a/lib/libusb/libusb.h
+++ b/lib/libusb/libusb.h
@@ -258,9 +258,10 @@
enum libusb_option {
LIBUSB_OPTION_LOG_LEVEL = 0,
LIBUSB_OPTION_USE_USBDK = 1,
+#define LIBUSB_OPTION_WEAK_AUTHORITY LIBUSB_OPTION_NO_DEVICE_DISCOVERY
LIBUSB_OPTION_NO_DEVICE_DISCOVERY = 2,
- LIBUSB_OPTION_WEAK_AUTHORITY = 2,
- LIBUSB_OPTION_MAX = 3,
+ LIBUSB_OPTION_LOG_CB = 3,
+ LIBUSB_OPTION_MAX = 4,
};
/* libusb structures */
@@ -271,6 +272,11 @@
struct libusb_device_handle;
struct libusb_hotplug_callback_handle_struct;
+typedef struct libusb_context libusb_context;
+
+typedef void (*libusb_log_cb)(libusb_context *ctx, enum libusb_log_level,
+ const char *str);
+
struct libusb_pollfd {
int fd;
short events;
@@ -594,6 +600,7 @@
int libusb_free_streams(libusb_device_handle *dev, unsigned char *endpoints, int num_endpoints);
void libusb_transfer_set_stream_id(struct libusb_transfer *transfer, uint32_t stream_id);
uint32_t libusb_transfer_get_stream_id(struct libusb_transfer *transfer);
+int libusb_set_option(libusb_context *ctx, enum libusb_option option, ...);
#if 0
{ /* indent fix */
diff --git a/lib/libusb/libusb.3 b/lib/libusb/libusb.3
--- a/lib/libusb/libusb.3
+++ b/lib/libusb/libusb.3
@@ -99,6 +99,30 @@
.Fn libusb_detach_kernel_driver .
.El
.Pp
+.Ft int
+.Fn libusb_set_option "libusb_context *ctx" "enum libusb_option option" "...value"
+This function sets the
+.Fa option
+from the given
+.Fa value .
+When the
+.Fa ctx
+is NULL, the option will be used as the default option for later created
+.Fa ctx .
+The available options are:
+.Bl -tag -width LIBUSB_OPTION -offset indent
+.It Va LIBUSB_OPTION_LOG_LEVEL
+set the option level to the given
+.Fa value .
+.It Va LIBUSB_OPTION_USE_USBDK
+use USBDK as a libusb backend (Windows only)
+.It Va LIBUSB_OPTION_NO_DEVICE_DISCOVER
+disable the USB enumeration.
+.It Va LIBUSB_OPTION_LOG_CB
+customize default callback function with
+.Fa value .
+.El
+.Pp
.Ft const char *
.Fn libusb_strerror "int code"
Get the ASCII representation of the error given by the
diff --git a/lib/libusb/libusb10.h b/lib/libusb/libusb10.h
--- a/lib/libusb/libusb10.h
+++ b/lib/libusb/libusb10.h
@@ -117,6 +117,8 @@
libusb_pollfd_added_cb fd_added_cb;
libusb_pollfd_removed_cb fd_removed_cb;
void *fd_cb_user_data;
+ libusb_log_cb log_cb;
+ int no_discovery;
};
struct libusb_device {
diff --git a/lib/libusb/libusb10.c b/lib/libusb/libusb10.c
--- a/lib/libusb/libusb10.c
+++ b/lib/libusb/libusb10.c
@@ -244,6 +244,8 @@
}
libusb10_add_pollfd(ctx, &ctx->ctx_poll, NULL, ctx->event, POLLIN);
+ ctx->log_cb = NULL;
+ ctx->no_discovery = false;
pthread_mutex_lock(&default_context_lock);
if (usbi_default_context == NULL) {
@@ -1836,7 +1838,82 @@
snprintf(new_fmt, sizeof(new_fmt), "%s: %s\n", log_prefix[level], fmt);
vsnprintf(buffer, sizeof(buffer), new_fmt, args);
- fputs(buffer, stdout);
+ if (ctx->log_cb != NULL)
+ ctx->log_cb(ctx, level, buffer);
+ else
+ fputs(buffer, stdout);
+
+ va_end(args);
+}
+
+int
+libusb_set_option(libusb_context *ctx, enum libusb_option option, ...)
+{
+ int err = LIBUSB_SUCCESS;
+ enum libusb_log_level level;
+ va_list args;
+ libusb_log_cb callback;
+
+ ctx = GET_CONTEXT(ctx);
+ va_start(args, option);
+
+ switch (option) {
+ case LIBUSB_OPTION_LOG_LEVEL:
+ level = va_arg(args, enum libusb_log_level);
+ if (level < LIBUSB_LOG_LEVEL_NONE ||
+ level > LIBUSB_LOG_LEVEL_DEBUG) {
+ err = LIBUSB_ERROR_INVALID_PARAM;
+ break;
+ }
+
+ break;
+ case LIBUSB_OPTION_LOG_CB:
+ callback = va_arg(args, libusb_log_cb);
+ break;
+ }
+
+ if (option >= LIBUSB_OPTION_MAX) {
+ err = LIBUSB_ERROR_INVALID_PARAM;
+ goto end;
+ }
+
+ /*
+ * When it is default context, the context will be access by multiple
+ * instance of libusb_context that will later taken as the default value
+ * when new instance is created.
+ */
+ if (ctx == usbi_default_context)
+ CTX_LOCK(ctx);
+
+ switch (option) {
+ case LIBUSB_OPTION_LOG_LEVEL:
+ if (ctx->debug_fixed)
+ break;
+ ctx->debug = level;
+ break;
+ case LIBUSB_OPTION_LOG_CB:
+ ctx->log_cb = callback;
+ break;
+ case LIBUSB_OPTION_NO_DEVICE_DISCOVERY:
+ ctx->no_discovery = true;
+ break;
+ /*
+ * We don't handle USBDK as it is a windows
+ * backend specified SDK
+ */
+ case LIBUSB_OPTION_USE_USBDK:
+ break;
+ case LIBUSB_OPTION_MAX:
+ default:
+ err = LIBUSB_ERROR_INVALID_PARAM;
+ break;
+ }
+
+ if (ctx == usbi_default_context)
+ CTX_UNLOCK(ctx);
+
+end:
va_end(args);
+ return (err);
}
diff --git a/lib/libusb/libusb10_hotplug.c b/lib/libusb/libusb10_hotplug.c
--- a/lib/libusb/libusb10_hotplug.c
+++ b/lib/libusb/libusb10_hotplug.c
@@ -348,6 +348,9 @@
ctx = GET_CONTEXT(ctx);
+ if (ctx->no_discovery)
+ return (LIBUSB_SUCCESS);
+
if (ctx->usb_event_mode == usb_event_none) {
HOTPLUG_LOCK(ctx);
if (!netlink_init(ctx) && !devd_init(ctx))
@@ -367,7 +370,7 @@
HOTPLUG_LOCK(ctx);
if (ctx->hotplug_handler == NO_THREAD) {
- libusb_hotplug_enumerate(ctx, &ctx->hotplug_devs);
+ libusb_hotplug_enumerate(ctx, &ctx->hotplug_devs);
if (pthread_create(&ctx->hotplug_handler, NULL,
&libusb_hotplug_scan, ctx) != 0)
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Nov 28, 2:13 PM (3 h, 54 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
26285789
Default Alt Text
D50818.id158250.diff (5 KB)
Attached To
Mode
D50818: libusb: implement libusb_set_option
Attached
Detach File
Event Timeline
Log In to Comment