@@ -82,6 +82,8 @@ struct input_device {
static int idle_timeout = 0;
static bool uhid_enabled = false;
static bool classic_bonded_only = false;
+static char **exclude_adapters;
+static gsize num_exclude_adapters;
void input_set_idle_timeout(int timeout)
{
@@ -103,6 +105,26 @@ bool input_get_classic_bonded_only(void)
return classic_bonded_only;
}
+char **input_get_exclude_adapters(void)
+{
+ return exclude_adapters;
+}
+
+void input_set_exclude_adapters(char **adapters)
+{
+ exclude_adapters = adapters;
+}
+
+gsize input_get_num_exclude_adapters(void)
+{
+ return num_exclude_adapters;
+}
+
+void input_set_num_exclude_adapters(gsize num)
+{
+ num_exclude_adapters = num;
+}
+
static void input_device_enter_reconnect_mode(struct input_device *idev);
static int connection_disconnect(struct input_device *idev, uint32_t flags);
static int uhid_disconnect(struct input_device *idev);
@@ -19,6 +19,10 @@ void input_enable_userspace_hid(bool state);
void input_set_classic_bonded_only(bool state);
bool input_get_classic_bonded_only(void);
void input_set_auto_sec(bool state);
+char **input_get_exclude_adapters(void);
+void input_set_exclude_adapters(char **address);
+gsize input_get_num_exclude_adapters(void);
+void input_set_num_exclude_adapters(gsize address);
int input_device_register(struct btd_service *service);
void input_device_unregister(struct btd_service *service);
@@ -24,3 +24,7 @@
# Enables upgrades of security automatically if required.
# Defaults to true to maximize device compatibility.
#LEAutoSecurity=true
+
+# Exclude adapters
+# Disables input plugin on adapters with specified bdaddrs
+#ExcludeAdapters=00:00:00:00:00:00,00:00:00:00:00:01
@@ -32,7 +32,22 @@
static int hid_server_probe(struct btd_profile *p, struct btd_adapter *adapter)
{
- return server_start(btd_adapter_get_address(adapter));
+ const bdaddr_t *address;
+ char addr[18];
+ char **exclude_adapters;
+ gsize num_exclude_adapters;
+
+ address = btd_adapter_get_address(adapter);
+ ba2str(address, addr);
+ exclude_adapters = input_get_exclude_adapters();
+ num_exclude_adapters = input_get_num_exclude_adapters();
+
+ for (gsize i = 0; i < num_exclude_adapters; i++) {
+ if (strcmp(addr, exclude_adapters[i]))
+ return 0;
+ }
+
+ return server_start(address);
}
static void hid_server_remove(struct btd_profile *p,
@@ -83,6 +98,9 @@ static int input_init(void)
config = load_config_file(CONFIGDIR "/input.conf");
if (config) {
int idle_timeout;
+ char *exclude_adapters_str;
+ char **exclude_adapters;
+ gsize num_exclude_adapters;
gboolean uhid_enabled, classic_bonded_only, auto_sec;
idle_timeout = g_key_file_get_integer(config, "General",
@@ -121,6 +139,20 @@ static int input_init(void)
} else
g_clear_error(&err);
+ g_key_file_set_list_separator(config, ',');
+
+ exclude_adapters_str = g_key_file_get_string(config, "General",
+ "ExcludeAdapters", &err);
+ exclude_adapters = g_key_file_get_string_list(config, "General",
+ "ExcludeAdapters", &num_exclude_adapters, &err);
+
+ if (!err) {
+ DBG("input.conf: ExcludeAdapters=%s",
+ exclude_adapters_str);
+ input_set_exclude_adapters(exclude_adapters);
+ input_set_num_exclude_adapters(num_exclude_adapters);
+ } else
+ g_clear_error(&err);
}
btd_profile_register(&input_profile);