Написал патч для bluez. Используя встроенный плагин autopair при условии что используется capability=noinputnooutput пин-код для паринга устройств берем из файла main.conf
При компиляции получаю предупреждение:
plugins/autopair.c:158:18: предупреждение: при передаче аргумента 2 «memcpy» целое преобразуется в указатель без приведения типа [-Wint-conversion]
memcpy(pinbuf, main_opts.defaultpin, 4);
^~~~~~~~~
замечание: ожидался тип «const void * restrict», но аргумент имеет тип «gchar {aka char}»
extern void *memcpy (void *__restrict __dest, const void *__restrict __src,
^~~~~~
# cat ./bluez.patch
--- ./main.c_old 2018-06-01 16:37:36.000000000 +0800
+++ ./src/main.c 2018-11-28 13:56:32.489196607 +0800
@@ -90,6 +90,7 @@
"MultiProfile",
"FastConnectable",
"Privacy",
+ "DefaultPin",
NULL
};
@@ -317,6 +318,16 @@
g_free(str);
}
+ val = g_key_file_get_string(config, "General",
+ "DefaultPin", &err);
+ if (err) {
+ DBG("%s", err->message);
+ g_clear_error(&err);
+ } else {
+ DBG("defaultpin=%d", val);
+ main_opts.defaultpin = val;
+ }
+
str = g_key_file_get_string(config, "General", "Name", &err);
if (err) {
DBG("%s", err->message);
@@ -434,6 +445,7 @@
main_opts.reverse_sdp = TRUE;
main_opts.name_resolv = TRUE;
main_opts.debug_keys = FALSE;
+ main_opts.defaultpin = 0000;
if (sscanf(VERSION, "%hhu.%hhu", &major, &minor) != 2)
return;
--- ./hcid.h_old 2018-06-01 16:37:36.000000000 +0800
+++ ./src/hcid.h 2018-11-28 13:54:29.753199017 +0800
@@ -41,6 +41,7 @@
uint32_t pairto;
uint32_t discovto;
uint8_t privacy;
+ char defaultpin;
gboolean reverse_sdp;
gboolean name_resolv;
--- ./autopair.c_old 2018-11-30 14:32:55.000000000 +0800
+++ ./plugins/autopair.c 2018-12-05 10:10:59.000000000 +0800
@@ -35,12 +35,14 @@
#include "src/plugin.h"
#include "src/adapter.h"
#include "src/device.h"
#include "src/log.h"
#include "src/storage.h"
+#include "src/agent.h"
/*
* Plugin to handle automatic pairing of devices with reduced user
@@ -62,6 +64,8 @@
char pinstr[7];
char name[25];
uint32_t class;
+ uint8_t io_cap;
+ struct agent *agent;
ba2str(device_get_address(device), addr);
@@ -143,7 +147,18 @@
}
break;
}
-
+ /*check capability=NOINPUTNOOUTPUT and use DefaultPin=0000 or from main.conf if available*/
+ if (agent)
+ io_cap = agent_get_io_capability(agent);
+
+ if (io_cap == 0x03) {
+ DBG("capability set to NOINPUTNOOUTPUT use defaultpin");
+ if (attempt > 1)
+ return 0;
+ memcpy(pinbuf, main_opts.defaultpin, 4);
+ return 4;
+ }
+
return 0;
}