git: bf2c6d23ad09 - main - Revert "libusb: change callback register handler to int"

From: ShengYi Hung <aokblast_at_FreeBSD.org>
Date: Tue, 05 May 2026 16:49:04 UTC
The branch main has been updated by aokblast:

URL: https://cgit.FreeBSD.org/src/commit/?id=bf2c6d23ad0988a8b5dccebccdbc6fda9482c6a2

commit bf2c6d23ad0988a8b5dccebccdbc6fda9482c6a2
Author:     ShengYi Hung <aokblast@FreeBSD.org>
AuthorDate: 2026-05-05 16:46:07 +0000
Commit:     ShengYi Hung <aokblast@FreeBSD.org>
CommitDate: 2026-05-05 16:48:46 +0000

    Revert "libusb: change callback register handler to int"
    
    This reverts commit ce9ced951a0b9d004a3b007d4ac6e9087a1301a2.
    
    We should handle backward compatibility before introducing this patch as
    people may rely on old ABI.
---
 lib/libusb/libusb.h           |  5 +++--
 lib/libusb/libusb10.c         |  1 -
 lib/libusb/libusb10.h         |  2 --
 lib/libusb/libusb10_hotplug.c | 50 ++++++++++++++++---------------------------
 4 files changed, 21 insertions(+), 37 deletions(-)

diff --git a/lib/libusb/libusb.h b/lib/libusb/libusb.h
index ec60ce336e5a..46a2ed5eb8a6 100644
--- a/lib/libusb/libusb.h
+++ b/lib/libusb/libusb.h
@@ -293,6 +293,7 @@ struct libusb_context;
 struct libusb_device;
 struct libusb_transfer;
 struct libusb_device_handle;
+struct libusb_hotplug_callback_handle_struct;
 
 struct libusb_pollfd {
 	int	fd;
@@ -321,7 +322,7 @@ typedef struct libusb_device_handle libusb_device_handle;
 typedef struct libusb_pollfd libusb_pollfd;
 typedef void (*libusb_pollfd_added_cb) (int fd, short events, void *user_data);
 typedef void (*libusb_pollfd_removed_cb) (int fd, void *user_data);
-typedef int libusb_hotplug_callback_handle;
+typedef struct libusb_hotplug_callback_handle_struct *libusb_hotplug_callback_handle;
 
 typedef struct libusb_device_descriptor {
 	uint8_t	bLength;
@@ -631,7 +632,7 @@ typedef int (*libusb_hotplug_callback_fn)(libusb_context *ctx,
     libusb_device *device, libusb_hotplug_event event, void *user_data);
 
 int	libusb_hotplug_register_callback(libusb_context *ctx, libusb_hotplug_event events, libusb_hotplug_flag flags, int vendor_id, int product_id, int dev_class, libusb_hotplug_callback_fn cb_fn, void *user_data, libusb_hotplug_callback_handle *handle);
-void	libusb_hotplug_deregister_callback(libusb_context *ctx, libusb_hotplug_callback_handle callback_handle);
+void	libusb_hotplug_deregister_callback(libusb_context *ctx, libusb_hotplug_callback_handle handle);
 void   *libusb_hotplug_get_user_data(struct libusb_context *ctx,
     libusb_hotplug_callback_handle callback_handle);
 
diff --git a/lib/libusb/libusb10.c b/lib/libusb/libusb10.c
index 517630900f34..56c9caedab16 100644
--- a/lib/libusb/libusb10.c
+++ b/lib/libusb/libusb10.c
@@ -205,7 +205,6 @@ libusb_init_context(libusb_context **context,
 
 	memset(ctx, 0, sizeof(*ctx));
 	ctx->devd_pipe = -1;
-	ctx->next_callback_id = 1;
 
 	debug = getenv("LIBUSB_DEBUG");
 	if (debug != NULL) {
diff --git a/lib/libusb/libusb10.h b/lib/libusb/libusb10.h
index 354ff003de3e..eced364ef857 100644
--- a/lib/libusb/libusb10.h
+++ b/lib/libusb/libusb10.h
@@ -80,7 +80,6 @@ struct libusb_hotplug_callback_handle_struct {
 	int devclass;
 	libusb_hotplug_callback_fn fn;
 	void *user_data;
-	int id;
 };
 
 TAILQ_HEAD(libusb_device_head, libusb_device);
@@ -119,7 +118,6 @@ struct libusb_context {
 	libusb_pollfd_added_cb fd_added_cb;
 	libusb_pollfd_removed_cb fd_removed_cb;
 	void   *fd_cb_user_data;
-	int next_callback_id;
 };
 
 struct libusb_device {
diff --git a/lib/libusb/libusb10_hotplug.c b/lib/libusb/libusb10_hotplug.c
index fd979fd4db14..359c818b5720 100644
--- a/lib/libusb/libusb10_hotplug.c
+++ b/lib/libusb/libusb10_hotplug.c
@@ -176,9 +176,8 @@ libusb_hotplug_equal(libusb_device *_adev, libusb_device *_bdev)
 }
 
 static int
-libusb_hotplug_filter(libusb_context *ctx,
-    struct libusb_hotplug_callback_handle_struct *pcbh, libusb_device *dev,
-    libusb_hotplug_event event)
+libusb_hotplug_filter(libusb_context *ctx, libusb_hotplug_callback_handle pcbh,
+    libusb_device *dev, libusb_hotplug_event event)
 {
 	if (!(pcbh->events & event))
 		return (0);
@@ -217,7 +216,8 @@ libusb_hotplug_scan(void *arg)
 {
 	struct pollfd pfd;
 	struct libusb_device_head hotplug_devs;
-	struct libusb_hotplug_callback_handle_struct *acbh, *bcbh;
+	libusb_hotplug_callback_handle acbh;
+	libusb_hotplug_callback_handle bcbh;
 	libusb_context *ctx = arg;
 	libusb_device *temp;
 	libusb_device *adev;
@@ -343,7 +343,7 @@ int libusb_hotplug_register_callback(libusb_context *ctx,
     libusb_hotplug_callback_fn cb_fn, void *user_data,
     libusb_hotplug_callback_handle *phandle)
 {
-	struct libusb_hotplug_callback_handle_struct *handle;
+	libusb_hotplug_callback_handle handle;
 	struct libusb_device *adev;
 
 	ctx = GET_CONTEXT(ctx);
@@ -365,17 +365,6 @@ int libusb_hotplug_register_callback(libusb_context *ctx,
 	if (handle == NULL)
 		return (LIBUSB_ERROR_NO_MEM);
 
-	handle->events = events;
-	handle->vendor = vendor_id;
-	handle->product = product_id;
-	handle->devclass = dev_class;
-	handle->fn = cb_fn;
-	handle->user_data = user_data;
-	CTX_LOCK(ctx);
-	if ((handle->id = ctx->next_callback_id++) < 0)
-		handle->id = ctx->next_callback_id = 1;
-	CTX_UNLOCK(ctx);
-
 	HOTPLUG_LOCK(ctx);
 	if (ctx->hotplug_handler == NO_THREAD) {
 	  	libusb_hotplug_enumerate(ctx, &ctx->hotplug_devs);
@@ -384,6 +373,12 @@ int libusb_hotplug_register_callback(libusb_context *ctx,
 		    &libusb_hotplug_scan, ctx) != 0)
 			ctx->hotplug_handler = NO_THREAD;
 	}
+	handle->events = events;
+	handle->vendor = vendor_id;
+	handle->product = product_id;
+	handle->devclass = dev_class;
+	handle->fn = cb_fn;
+	handle->user_data = user_data;
 
 	if (flags & LIBUSB_HOTPLUG_ENUMERATE) {
 		TAILQ_FOREACH(adev, &ctx->hotplug_devs, hotplug_entry) {
@@ -400,32 +395,23 @@ int libusb_hotplug_register_callback(libusb_context *ctx,
 	HOTPLUG_UNLOCK(ctx);
 
 	if (phandle != NULL)
-		*phandle = handle->id;
+		*phandle = handle;
 	return (LIBUSB_SUCCESS);
 }
 
 void libusb_hotplug_deregister_callback(libusb_context *ctx,
-    libusb_hotplug_callback_handle callback_handle)
+    libusb_hotplug_callback_handle handle)
 {
-	struct libusb_hotplug_callback_handle_struct *handle;
+  	ctx = GET_CONTEXT(ctx);
 
-	ctx = GET_CONTEXT(ctx);
-
-	if (ctx == NULL || callback_handle == 0)
+	if (ctx == NULL || handle == NULL)
 		return;
 
 	HOTPLUG_LOCK(ctx);
-	TAILQ_FOREACH(handle, &ctx->hotplug_cbh, entry) {
-		if (handle->id == callback_handle)
-			break;
-	}
-	if (handle == NULL)
-		goto clean;
 	TAILQ_REMOVE(&ctx->hotplug_cbh, handle, entry);
 	libusb_interrupt_event_handler(ctx);
-
-clean:
 	HOTPLUG_UNLOCK(ctx);
+
 	free(handle);
 }
 
@@ -433,13 +419,13 @@ void *
 libusb_hotplug_get_user_data(struct libusb_context *ctx,
     libusb_hotplug_callback_handle callback_handle)
 {
-	struct libusb_hotplug_callback_handle_struct *handle;
+	libusb_hotplug_callback_handle handle;
 
 	ctx = GET_CONTEXT(ctx);
 
 	HOTPLUG_LOCK(ctx);
 	TAILQ_FOREACH(handle, &ctx->hotplug_cbh, entry) {
-		if (handle->id == callback_handle)
+		if (handle == callback_handle)
 			break;
 	}
 	HOTPLUG_UNLOCK(ctx);