package/bluez5_utils: fix build w/ HoG and w/o HID

When building the bluez5_utils package with HoG plugin without enabling
the HID plugin the following linker error would occur:

```
/workdir/instance-0/output-1/per-package/bluez5_utils/host/bin/../lib/gcc/x86_64-buildroot-linux-uclibc/13.3.0/../../../../x86_64-buildroot-linux-uclibc/bin/ld: profiles/input/bluetoothd-hog.o: in function `hog_disconnect':
hog.c:(.text.hog_disconnect+0x12): undefined reference to `input_get_userspace_hid'
collect2: error: ld returned 1 exit status
```

This patch adds two upstream commits that decouple both the HID
and the HoG plugin.

As a consequence of this patch the HID plugin can be compiled without
the HoG one as well but to keep the compatibility the same in buildroot
the selection of the HoG plugin is kept when selecting the HID plugin.

The error can be reproduced with the following defconfig

```
BR2_arm=y
BR2_cortex_a7=y
BR2_TOOLCHAIN_EXTERNAL=y
BR2_TOOLCHAIN_EXTERNAL_BOOTLIN=y
BR2_PACKAGE_BLUEZ5_UTILS=y
BR2_PACKAGE_BLUEZ5_UTILS_PLUGINS_HOG=y
```

Fixes: https://autobuild.buildroot.org/results/78e/78ed7664f3a2dd5858fd71bd63836c822c106cc0

Signed-off-by: Thomas Perale <thomas.perale@mind.be>
Signed-off-by: Peter Korsgaard <peter@korsgaard.com>
This commit is contained in:
Thomas Perale
2025-05-14 18:38:36 +02:00
committed by Peter Korsgaard
parent 7319e4af19
commit 57eb26837b
2 changed files with 260 additions and 0 deletions

View File

@@ -0,0 +1,140 @@
From b111b5e15eb74e08b74cb3c7e91bcb21f54be4c7 Mon Sep 17 00:00:00 2001
From: Thomas Perale <thomas.perale@mind.be>
Date: Thu, 1 May 2025 18:35:35 +0200
Subject: input: fix HID compilation w/o HoG
Commit [1] introduced a dependency with the HID plugin in the HoG code
As a result, building with --enable-hid --disable-hog caused linker
errors due to undefined references to HoG-related functions:
```
> ./configure --enable-hid --disable-hog
...
> make
...
CCLD src/bluetoothd
/usr/bin/ld: profiles/input/bluetoothd-manager.o: in function `input_init':
/home/../bluez/profiles/input/manager.c:122:(.text.input_init+0x1c8): undefined reference to `input_set_auto_sec'
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:6376: src/bluetoothd] Error 1
```
This patch moves the reading of the HOG specific configuration of the
'input.conf' file: LEAutoSecurity, to the HoG plugin file.
[1] f2778f587 input: Add LEAutoSecurity setting to input.conf
Upstream: https://git.kernel.org/pub/scm/bluetooth/bluez.git/commit/?id=b111b5e15eb74e08b74cb3c7e91bcb21f54be4c7
Signed-off-by: Thomas Perale <thomas.perale@mind.be>
---
profiles/input/device.h | 1 -
profiles/input/hog.c | 40 +++++++++++++++++++++++++++++++++++-----
profiles/input/manager.c | 11 +----------
3 files changed, 36 insertions(+), 16 deletions(-)
diff --git a/profiles/input/device.h b/profiles/input/device.h
index 7b87ce5903..036a88980e 100644
--- a/profiles/input/device.h
+++ b/profiles/input/device.h
@@ -25,7 +25,6 @@ void input_set_userspace_hid(char *state);
uint8_t input_get_userspace_hid(void);
void input_set_classic_bonded_only(bool state);
bool input_get_classic_bonded_only(void);
-void input_set_auto_sec(bool state);
int input_device_register(struct btd_service *service);
void input_device_unregister(struct btd_service *service);
diff --git a/profiles/input/hog.c b/profiles/input/hog.c
index 017e320f07..f82648fec8 100644
--- a/profiles/input/hog.c
+++ b/profiles/input/hog.c
@@ -57,11 +57,6 @@ static gboolean suspend_supported = FALSE;
static bool auto_sec = true;
static struct queue *devices = NULL;
-void input_set_auto_sec(bool state)
-{
- auto_sec = state;
-}
-
static void hog_device_accept(struct hog_device *dev, struct gatt_db *db)
{
char name[248];
@@ -228,10 +223,45 @@ static struct btd_profile hog_profile = {
.auto_connect = true,
};
+static void hog_read_config(void)
+{
+ const char filename[] = CONFIGDIR "/input.conf";
+ GKeyFile *config;
+ GError *err = NULL;
+ bool config_auto_sec;
+
+ config = g_key_file_new();
+ if (!config) {
+ error("Failed to allocate memory for config");
+ return;
+ }
+
+ if (!g_key_file_load_from_file(config, filename, 0, &err)) {
+ if (!g_error_matches(err, G_FILE_ERROR, G_FILE_ERROR_NOENT))
+ error("Parsing %s failed: %s", filename, err->message);
+ g_error_free(err);
+ g_key_file_free(config);
+ return;
+ }
+
+ config_auto_sec = g_key_file_get_boolean(config, "General",
+ "LEAutoSecurity", &err);
+ if (!err) {
+ DBG("input.conf: LEAutoSecurity=%s",
+ config_auto_sec ? "true" : "false");
+ auto_sec = config_auto_sec;
+ } else
+ g_clear_error(&err);
+
+ g_key_file_free(config);
+}
+
static int hog_init(void)
{
int err;
+ hog_read_config();
+
err = suspend_init(suspend_callback, resume_callback);
if (err < 0)
error("Loading suspend plugin failed: %s (%d)", strerror(-err),
diff --git a/profiles/input/manager.c b/profiles/input/manager.c
index 95ca0a7ee5..1c0b6122a1 100644
--- a/profiles/input/manager.c
+++ b/profiles/input/manager.c
@@ -85,7 +85,7 @@ static int input_init(void)
config = load_config_file(CONFIGDIR "/input.conf");
if (config) {
int idle_timeout;
- gboolean classic_bonded_only, auto_sec;
+ gboolean classic_bonded_only;
char *uhid_enabled;
idle_timeout = g_key_file_get_integer(config, "General",
@@ -115,15 +115,6 @@ static int input_init(void)
} else
g_clear_error(&err);
- auto_sec = g_key_file_get_boolean(config, "General",
- "LEAutoSecurity", &err);
- if (!err) {
- DBG("input.conf: LEAutoSecurity=%s",
- auto_sec ? "true" : "false");
- input_set_auto_sec(auto_sec);
- } else
- g_clear_error(&err);
-
}
btd_profile_register(&input_profile);
--
cgit 1.2.3-korg

View File

@@ -0,0 +1,120 @@
From 9c52188d753002a6afd6ae145f921a2ff52c1c81 Mon Sep 17 00:00:00 2001
From: Thomas Perale <thomas.perale@mind.be>
Date: Thu, 1 May 2025 18:35:36 +0200
Subject: input: fix HoG compilation w/o HID
Commit [1] introduced a dependency with the HID plugin in the HoG code
As a result, building with --disable-hid --enable-hog caused linker
errors due to undefined references to HID-related functions:
```
> ./configure --disable-hid --enable-hog
> make
/usr/bin/ld: profiles/input/bluetoothd-hog.o: in function `hog_accept':
/home/../bluez/profiles/input/hog.c:184:(.text.hog_accept+0xbb): undefined reference to `input_get_auto_sec'
/usr/bin/ld: profiles/input/bluetoothd-hog.o: in function `hog_disconnect':
/home/../bluez/profiles/input/hog.c:205:(.text.hog_disconnect+0x12): undefined reference to `input_get_userspace_hid'
collect2: error: ld returned 1 exit status
make[1]: *** [Makefile:6344: src/bluetoothd] Error 1
make: *** [Makefile:4695: all] Error 2
```
This patch duplicate the read of the 'UserspaceHID=persist' config entry
in the HoG plugin file to remove the dependency on the HID plugin files.
[1] 1782bfd79 input: Add support for UserspaceHID=persist
Fixes: https://github.com/bluez/bluez/issues/1228
Upstream: https://git.kernel.org/pub/scm/bluetooth/bluez.git/commit/?id=9c52188d753002a6afd6ae145f921a2ff52c1c81
Signed-off-by: Thomas Perale <thomas.perale@mind.be>
---
profiles/input/device.c | 5 -----
profiles/input/device.h | 1 -
profiles/input/hog.c | 14 ++++++++++++--
3 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/profiles/input/device.c b/profiles/input/device.c
index a7bc4d44fa..3642cc3267 100644
--- a/profiles/input/device.c
+++ b/profiles/input/device.c
@@ -112,11 +112,6 @@ void input_set_userspace_hid(char *state)
error("Unknown value '%s'", state);
}
-uint8_t input_get_userspace_hid(void)
-{
- return uhid_state;
-}
-
void input_set_classic_bonded_only(bool state)
{
classic_bonded_only = state;
diff --git a/profiles/input/device.h b/profiles/input/device.h
index 036a88980e..9056695026 100644
--- a/profiles/input/device.h
+++ b/profiles/input/device.h
@@ -22,7 +22,6 @@ struct input_conn;
void input_set_idle_timeout(int timeout);
void input_set_userspace_hid(char *state);
-uint8_t input_get_userspace_hid(void);
void input_set_classic_bonded_only(bool state);
bool input_get_classic_bonded_only(void);
diff --git a/profiles/input/hog.c b/profiles/input/hog.c
index f82648fec8..a3c876cf9f 100644
--- a/profiles/input/hog.c
+++ b/profiles/input/hog.c
@@ -40,7 +40,6 @@
#include "src/shared/gatt-client.h"
#include "src/plugin.h"
-#include "device.h"
#include "suspend.h"
#include "attrib/att.h"
#include "attrib/gattrib.h"
@@ -55,6 +54,7 @@ struct hog_device {
static gboolean suspend_supported = FALSE;
static bool auto_sec = true;
+static bool uhid_state_persist = false;
static struct queue *devices = NULL;
static void hog_device_accept(struct hog_device *dev, struct gatt_db *db)
@@ -203,7 +203,7 @@ static int hog_disconnect(struct btd_service *service)
{
struct hog_device *dev = btd_service_get_user_data(service);
- if (input_get_userspace_hid() == UHID_PERSIST)
+ if (uhid_state_persist)
bt_hog_detach(dev->hog, false);
else
bt_hog_detach(dev->hog, true);
@@ -229,6 +229,7 @@ static void hog_read_config(void)
GKeyFile *config;
GError *err = NULL;
bool config_auto_sec;
+ char *uhid_enabled;
config = g_key_file_new();
if (!config) {
@@ -253,6 +254,15 @@ static void hog_read_config(void)
} else
g_clear_error(&err);
+ uhid_enabled = g_key_file_get_string(config, "General",
+ "UserspaceHID", &err);
+ if (!err) {
+ DBG("input.conf: UserspaceHID=%s", uhid_enabled);
+ uhid_state_persist = strcasecmp(uhid_enabled, "persist") == 0;
+ free(uhid_enabled);
+ } else
+ g_clear_error(&err);
+
g_key_file_free(config);
}
--
cgit 1.2.3-korg