--- Begin Message ---
- Subject: Re: [PATCH BlueZ] src/adapter: Removed obsolete conversion functions for persistant settings
- From: Luiz Augusto von Dentz <luiz.dentz@xxxxxxxxx>
- Date: Sat, 10 Nov 2018 19:58:03 +0200
- Authentication-results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=IbK5xi0b; spf=pass (google.com: domain of luiz.dentz@xxxxxxxxx designates 209.85.220.65 as permitted sender) smtp.mailfrom=luiz.dentz@xxxxxxxxx; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com
- Cc: "linux-bluetooth@xxxxxxxxxxxxxxx" <linux-bluetooth@xxxxxxxxxxxxxxx>
- Delivered-to: zimmermach@xxxxxxxxx
- In-reply-to: <447CAA92-87E8-4E79-B850-EA22A682E5C5@gmail.com>
- References: <20181105160342.29434-1-zimmermach@gmail.com> <CABBYNZ+A+iU4wAw6LVy6toi+Qb7=2trkbx+HJmQYtdYyTHwSEA@mail.gmail.com> <447CAA92-87E8-4E79-B850-EA22A682E5C5@gmail.com>
Hi Christian,
On Sat, Nov 10, 2018 at 4:34 PM Christian Zimmermann
<zimmermach@xxxxxxxxx> wrote:
>
> Hi Luiz,
>
> thank you for your response.
> How about having a shell or python script which does the necessary conversion during bluez install? Would this be sufficient?
Yep, that way the distro can actually run those in case of updating an
old installation.
> Regards,
> Christian
>
> > Am 07.11.2018 um 12:37 schrieb Luiz Augusto von Dentz <luiz.dentz@xxxxxxxxx>:
> >
> > Hi Christian,
> >
> > On Mon, Nov 5, 2018 at 6:10 PM Christian Zimmermann
> > <zimmermach@xxxxxxxxx> wrote:
> >>
> >> According to TODO file:
> >> Removal of conversion functions for persistant settings
> >> since they're obsolete with Bluez5 after certain time of it's first release
> >
> > We probably need to consider if there are still platforms using BlueZ
> > 4 then removing this code would make the transition, perhaps we could
> > have a tool to do that so we can remove this from the daemon.
> >
> >> ---
> >> TODO | 6 -
> >> src/adapter.c | 832 ----------------------------------------------------------
> >> 2 files changed, 838 deletions(-)
> >>
> >> diff --git a/TODO b/TODO
> >> index d88349e06..ae2d69dfa 100644
> >> --- a/TODO
> >> +++ b/TODO
> >> @@ -37,12 +37,6 @@ General
> >> Priority: Medium
> >> Complexity: C2
> >>
> >> -- Function in src/adapter.c to convert old storage files to new ini-file format
> >> - should be removed 6-8 months after first BlueZ 5 release.
> >> -
> >> - Priority: Low
> >> - Complexity: C1
> >> -
> >> - Remove usage of symlinks for drivers, such as profiles/input/suspend.c and
> >> profiles/sap/sap.c. Instead, select drivers at runtime by using config
> >> options or probing for running D-Bus services (using e.g.
> >> diff --git a/src/adapter.c b/src/adapter.c
> >> index c24432125..5709ee956 100644
> >> --- a/src/adapter.c
> >> +++ b/src/adapter.c
> >> @@ -423,18 +423,6 @@ void btd_adapter_set_class(struct btd_adapter *adapter, uint8_t major,
> >> set_dev_class(adapter);
> >> }
> >>
> >> -static uint8_t get_mode(const char *mode)
> >> -{
> >> - if (strcasecmp("off", mode) == 0)
> >> - return MODE_OFF;
> >> - else if (strcasecmp("connectable", mode) == 0)
> >> - return MODE_CONNECTABLE;
> >> - else if (strcasecmp("discoverable", mode) == 0)
> >> - return MODE_DISCOVERABLE;
> >> - else
> >> - return MODE_UNKNOWN;
> >> -}
> >> -
> >> const char *btd_adapter_get_storage_dir(struct btd_adapter *adapter)
> >> {
> >> static char dir[25];
> >> @@ -4927,824 +4915,10 @@ void btd_adapter_unref(struct btd_adapter *adapter)
> >> ADAPTER_INTERFACE);
> >> }
> >>
> >> -static void convert_names_entry(char *key, char *value, void *user_data)
> >> -{
> >> - char *address = user_data;
> >> - char *str = key;
> >> - char filename[PATH_MAX];
> >> - GKeyFile *key_file;
> >> - char *data;
> >> - gsize length = 0;
> >> -
> >> - if (strchr(key, '#'))
> >> - str[17] = '\0';
> >> -
> >> - if (bachk(str) != 0)
> >> - return;
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", address, str);
> >> - create_file(filename, S_IRUSR | S_IWUSR);
> >> -
> >> - key_file = g_key_file_new();
> >> - g_key_file_load_from_file(key_file, filename, 0, NULL);
> >> - g_key_file_set_string(key_file, "General", "Name", value);
> >> -
> >> - data = g_key_file_to_data(key_file, &length, NULL);
> >> - g_file_set_contents(filename, data, length, NULL);
> >> - g_free(data);
> >> -
> >> - g_key_file_free(key_file);
> >> -}
> >> -
> >> -struct device_converter {
> >> - char *address;
> >> - void (*cb)(GKeyFile *key_file, void *value);
> >> - gboolean force;
> >> -};
> >> -
> >> -static void set_device_type(GKeyFile *key_file, char type)
> >> -{
> >> - char *techno;
> >> - char *addr_type = NULL;
> >> - char *str;
> >> -
> >> - switch (type) {
> >> - case BDADDR_BREDR:
> >> - techno = "BR/EDR";
> >> - break;
> >> - case BDADDR_LE_PUBLIC:
> >> - techno = "LE";
> >> - addr_type = "public";
> >> - break;
> >> - case BDADDR_LE_RANDOM:
> >> - techno = "LE";
> >> - addr_type = "static";
> >> - break;
> >> - default:
> >> - return;
> >> - }
> >> -
> >> - str = g_key_file_get_string(key_file, "General",
> >> - "SupportedTechnologies", NULL);
> >> - if (!str)
> >> - g_key_file_set_string(key_file, "General",
> >> - "SupportedTechnologies", techno);
> >> - else if (!strstr(str, techno))
> >> - g_key_file_set_string(key_file, "General",
> >> - "SupportedTechnologies", "BR/EDR;LE");
> >> -
> >> - g_free(str);
> >> -
> >> - if (addr_type)
> >> - g_key_file_set_string(key_file, "General", "AddressType",
> >> - addr_type);
> >> -}
> >> -
> >> -static void convert_aliases_entry(GKeyFile *key_file, void *value)
> >> -{
> >> - g_key_file_set_string(key_file, "General", "Alias", value);
> >> -}
> >> -
> >> -static void convert_trusts_entry(GKeyFile *key_file, void *value)
> >> -{
> >> - g_key_file_set_boolean(key_file, "General", "Trusted", TRUE);
> >> -}
> >> -
> >> -static void convert_classes_entry(GKeyFile *key_file, void *value)
> >> -{
> >> - g_key_file_set_string(key_file, "General", "Class", value);
> >> -}
> >> -
> >> -static void convert_blocked_entry(GKeyFile *key_file, void *value)
> >> -{
> >> - g_key_file_set_boolean(key_file, "General", "Blocked", TRUE);
> >> -}
> >> -
> >> -static void convert_did_entry(GKeyFile *key_file, void *value)
> >> -{
> >> - char *vendor_str, *product_str, *version_str;
> >> - uint16_t val;
> >> -
> >> - vendor_str = strchr(value, ' ');
> >> - if (!vendor_str)
> >> - return;
> >> -
> >> - *(vendor_str++) = 0;
> >> -
> >> - if (g_str_equal(value, "FFFF"))
> >> - return;
> >> -
> >> - product_str = strchr(vendor_str, ' ');
> >> - if (!product_str)
> >> - return;
> >> -
> >> - *(product_str++) = 0;
> >> -
> >> - version_str = strchr(product_str, ' ');
> >> - if (!version_str)
> >> - return;
> >> -
> >> - *(version_str++) = 0;
> >> -
> >> - val = (uint16_t) strtol(value, NULL, 16);
> >> - g_key_file_set_integer(key_file, "DeviceID", "Source", val);
> >> -
> >> - val = (uint16_t) strtol(vendor_str, NULL, 16);
> >> - g_key_file_set_integer(key_file, "DeviceID", "Vendor", val);
> >> -
> >> - val = (uint16_t) strtol(product_str, NULL, 16);
> >> - g_key_file_set_integer(key_file, "DeviceID", "Product", val);
> >> -
> >> - val = (uint16_t) strtol(version_str, NULL, 16);
> >> - g_key_file_set_integer(key_file, "DeviceID", "Version", val);
> >> -}
> >> -
> >> -static void convert_linkkey_entry(GKeyFile *key_file, void *value)
> >> -{
> >> - char *type_str, *length_str, *str;
> >> - int val;
> >> -
> >> - type_str = strchr(value, ' ');
> >> - if (!type_str)
> >> - return;
> >> -
> >> - *(type_str++) = 0;
> >> -
> >> - length_str = strchr(type_str, ' ');
> >> - if (!length_str)
> >> - return;
> >> -
> >> - *(length_str++) = 0;
> >> -
> >> - str = g_strconcat("0x", value, NULL);
> >> - g_key_file_set_string(key_file, "LinkKey", "Key", str);
> >> - g_free(str);
> >> -
> >> - val = strtol(type_str, NULL, 16);
> >> - g_key_file_set_integer(key_file, "LinkKey", "Type", val);
> >> -
> >> - val = strtol(length_str, NULL, 16);
> >> - g_key_file_set_integer(key_file, "LinkKey", "PINLength", val);
> >> -}
> >> -
> >> -static void convert_ltk_entry(GKeyFile *key_file, void *value)
> >> -{
> >> - char *auth_str, *rand_str, *str;
> >> - int i, ret;
> >> - unsigned char auth, master, enc_size;
> >> - unsigned short ediv;
> >> -
> >> - auth_str = strchr(value, ' ');
> >> - if (!auth_str)
> >> - return;
> >> -
> >> - *(auth_str++) = 0;
> >> -
> >> - for (i = 0, rand_str = auth_str; i < 4; i++) {
> >> - rand_str = strchr(rand_str, ' ');
> >> - if (!rand_str || rand_str[1] == '\0')
> >> - return;
> >> -
> >> - rand_str++;
> >> - }
> >> -
> >> - ret = sscanf(auth_str, " %hhd %hhd %hhd %hd", &auth, &master,
> >> - &enc_size, &ediv);
> >> - if (ret < 4)
> >> - return;
> >> -
> >> - str = g_strconcat("0x", value, NULL);
> >> - g_key_file_set_string(key_file, "LongTermKey", "Key", str);
> >> - g_free(str);
> >> -
> >> - g_key_file_set_integer(key_file, "LongTermKey", "Authenticated", auth);
> >> - g_key_file_set_integer(key_file, "LongTermKey", "Master", master);
> >> - g_key_file_set_integer(key_file, "LongTermKey", "EncSize", enc_size);
> >> - g_key_file_set_integer(key_file, "LongTermKey", "EDiv", ediv);
> >> -
> >> - str = g_strconcat("0x", rand_str, NULL);
> >> - g_key_file_set_string(key_file, "LongTermKey", "Rand", str);
> >> - g_free(str);
> >> -}
> >> -
> >> -static void convert_profiles_entry(GKeyFile *key_file, void *value)
> >> -{
> >> - g_strdelimit(value, " ", ';');
> >> - g_key_file_set_string(key_file, "General", "Services", value);
> >> -}
> >> -
> >> -static void convert_appearances_entry(GKeyFile *key_file, void *value)
> >> -{
> >> - g_key_file_set_string(key_file, "General", "Appearance", value);
> >> -}
> >> -
> >> -static void convert_entry(char *key, char *value, void *user_data)
> >> -{
> >> - struct device_converter *converter = user_data;
> >> - char type = BDADDR_BREDR;
> >> - char filename[PATH_MAX];
> >> - GKeyFile *key_file;
> >> - char *data;
> >> - gsize length = 0;
> >> -
> >> - if (strchr(key, '#')) {
> >> - key[17] = '\0';
> >> - type = key[18] - '0';
> >> - }
> >> -
> >> - if (bachk(key) != 0)
> >> - return;
> >> -
> >> - if (converter->force == FALSE) {
> >> - struct stat st;
> >> - int err;
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s",
> >> - converter->address, key);
> >> -
> >> - err = stat(filename, &st);
> >> - if (err || !S_ISDIR(st.st_mode))
> >> - return;
> >> - }
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
> >> - converter->address, key);
> >> -
> >> - key_file = g_key_file_new();
> >> - g_key_file_load_from_file(key_file, filename, 0, NULL);
> >> -
> >> - set_device_type(key_file, type);
> >> -
> >> - converter->cb(key_file, value);
> >> -
> >> - data = g_key_file_to_data(key_file, &length, NULL);
> >> - if (length > 0) {
> >> - create_file(filename, S_IRUSR | S_IWUSR);
> >> - g_file_set_contents(filename, data, length, NULL);
> >> - }
> >> -
> >> - g_free(data);
> >> -
> >> - g_key_file_free(key_file);
> >> -}
> >> -
> >> -static void convert_file(char *file, char *address,
> >> - void (*cb)(GKeyFile *key_file, void *value),
> >> - gboolean force)
> >> -{
> >> - char filename[PATH_MAX];
> >> - struct device_converter converter;
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", address, file);
> >> -
> >> - converter.address = address;
> >> - converter.cb = cb;
> >> - converter.force = force;
> >> -
> >> - textfile_foreach(filename, convert_entry, &converter);
> >> -}
> >> -
> >> -static gboolean record_has_uuid(const sdp_record_t *rec,
> >> - const char *profile_uuid)
> >> -{
> >> - sdp_list_t *pat;
> >> -
> >> - for (pat = rec->pattern; pat != NULL; pat = pat->next) {
> >> - char *uuid;
> >> - int ret;
> >> -
> >> - uuid = bt_uuid2string(pat->data);
> >> - if (!uuid)
> >> - continue;
> >> -
> >> - ret = strcasecmp(uuid, profile_uuid);
> >> -
> >> - free(uuid);
> >> -
> >> - if (ret == 0)
> >> - return TRUE;
> >> - }
> >> -
> >> - return FALSE;
> >> -}
> >> -
> >> -static void store_attribute_uuid(GKeyFile *key_file, uint16_t start,
> >> - uint16_t end, char *att_uuid,
> >> - uuid_t uuid)
> >> -{
> >> - char handle[6], uuid_str[33];
> >> - int i;
> >> -
> >> - switch (uuid.type) {
> >> - case SDP_UUID16:
> >> - sprintf(uuid_str, "%4.4X", uuid.value.uuid16);
> >> - break;
> >> - case SDP_UUID32:
> >> - sprintf(uuid_str, "%8.8X", uuid.value.uuid32);
> >> - break;
> >> - case SDP_UUID128:
> >> - for (i = 0; i < 16; i++)
> >> - sprintf(uuid_str + (i * 2), "%2.2X",
> >> - uuid.value.uuid128.data[i]);
> >> - break;
> >> - default:
> >> - uuid_str[0] = '\0';
> >> - }
> >> -
> >> - sprintf(handle, "%hu", start);
> >> - g_key_file_set_string(key_file, handle, "UUID", att_uuid);
> >> - g_key_file_set_string(key_file, handle, "Value", uuid_str);
> >> - g_key_file_set_integer(key_file, handle, "EndGroupHandle", end);
> >> -}
> >> -
> >> -static void store_sdp_record(char *local, char *peer, int handle, char *value)
> >> -{
> >> - char filename[PATH_MAX];
> >> - GKeyFile *key_file;
> >> - char handle_str[11];
> >> - char *data;
> >> - gsize length = 0;
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", local, peer);
> >> -
> >> - key_file = g_key_file_new();
> >> - g_key_file_load_from_file(key_file, filename, 0, NULL);
> >> -
> >> - sprintf(handle_str, "0x%8.8X", handle);
> >> - g_key_file_set_string(key_file, "ServiceRecords", handle_str, value);
> >> -
> >> - data = g_key_file_to_data(key_file, &length, NULL);
> >> - if (length > 0) {
> >> - create_file(filename, S_IRUSR | S_IWUSR);
> >> - g_file_set_contents(filename, data, length, NULL);
> >> - }
> >> -
> >> - g_free(data);
> >> -
> >> - g_key_file_free(key_file);
> >> -}
> >> -
> >> -static void convert_sdp_entry(char *key, char *value, void *user_data)
> >> -{
> >> - char *src_addr = user_data;
> >> - char dst_addr[18];
> >> - char type = BDADDR_BREDR;
> >> - int handle, ret;
> >> - char filename[PATH_MAX];
> >> - GKeyFile *key_file;
> >> - struct stat st;
> >> - sdp_record_t *rec;
> >> - uuid_t uuid;
> >> - char *att_uuid, *prim_uuid;
> >> - uint16_t start = 0, end = 0, psm = 0;
> >> - int err;
> >> - char *data;
> >> - gsize length = 0;
> >> -
> >> - ret = sscanf(key, "%17s#%hhu#%08X", dst_addr, &type, &handle);
> >> - if (ret < 3) {
> >> - ret = sscanf(key, "%17s#%08X", dst_addr, &handle);
> >> - if (ret < 2)
> >> - return;
> >> - }
> >> -
> >> - if (bachk(dst_addr) != 0)
> >> - return;
> >> -
> >> - /* Check if the device directory has been created as records should
> >> - * only be converted for known devices */
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, dst_addr);
> >> -
> >> - err = stat(filename, &st);
> >> - if (err || !S_ISDIR(st.st_mode))
> >> - return;
> >> -
> >> - /* store device records in cache */
> >> - store_sdp_record(src_addr, dst_addr, handle, value);
> >> -
> >> - /* Retrieve device record and check if there is an
> >> - * attribute entry in it */
> >> - sdp_uuid16_create(&uuid, ATT_UUID);
> >> - att_uuid = bt_uuid2string(&uuid);
> >> -
> >> - sdp_uuid16_create(&uuid, GATT_PRIM_SVC_UUID);
> >> - prim_uuid = bt_uuid2string(&uuid);
> >> -
> >> - rec = record_from_string(value);
> >> -
> >> - if (record_has_uuid(rec, att_uuid))
> >> - goto failed;
> >> -
> >> - /* TODO: Do this through btd_gatt_database */
> >> - if (!gatt_parse_record(rec, &uuid, &psm, &start, &end))
> >> - goto failed;
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/attributes", src_addr,
> >> - dst_addr);
> >> -
> >> - key_file = g_key_file_new();
> >> - g_key_file_load_from_file(key_file, filename, 0, NULL);
> >> -
> >> - store_attribute_uuid(key_file, start, end, prim_uuid, uuid);
> >> -
> >> - data = g_key_file_to_data(key_file, &length, NULL);
> >> - if (length > 0) {
> >> - create_file(filename, S_IRUSR | S_IWUSR);
> >> - g_file_set_contents(filename, data, length, NULL);
> >> - }
> >> -
> >> - g_free(data);
> >> - g_key_file_free(key_file);
> >> -
> >> -failed:
> >> - sdp_record_free(rec);
> >> - free(prim_uuid);
> >> - free(att_uuid);
> >> -}
> >> -
> >> -static void convert_primaries_entry(char *key, char *value, void *user_data)
> >> -{
> >> - char *address = user_data;
> >> - int device_type = -1;
> >> - uuid_t uuid;
> >> - char **services, **service, *prim_uuid;
> >> - char filename[PATH_MAX];
> >> - GKeyFile *key_file;
> >> - int ret;
> >> - uint16_t start, end;
> >> - char uuid_str[MAX_LEN_UUID_STR + 1];
> >> - char *data;
> >> - gsize length = 0;
> >> -
> >> - if (strchr(key, '#')) {
> >> - key[17] = '\0';
> >> - device_type = key[18] - '0';
> >> - }
> >> -
> >> - if (bachk(key) != 0)
> >> - return;
> >> -
> >> - services = g_strsplit(value, " ", 0);
> >> - if (services == NULL)
> >> - return;
> >> -
> >> - sdp_uuid16_create(&uuid, GATT_PRIM_SVC_UUID);
> >> - prim_uuid = bt_uuid2string(&uuid);
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/attributes", address,
> >> - key);
> >> - key_file = g_key_file_new();
> >> - g_key_file_load_from_file(key_file, filename, 0, NULL);
> >> -
> >> - for (service = services; *service; service++) {
> >> - ret = sscanf(*service, "%04hX#%04hX#%s", &start, &end,
> >> - uuid_str);
> >> - if (ret < 3)
> >> - continue;
> >> -
> >> - bt_string2uuid(&uuid, uuid_str);
> >> - sdp_uuid128_to_uuid(&uuid);
> >> -
> >> - store_attribute_uuid(key_file, start, end, prim_uuid, uuid);
> >> - }
> >> -
> >> - g_strfreev(services);
> >> -
> >> - data = g_key_file_to_data(key_file, &length, NULL);
> >> - if (length == 0)
> >> - goto end;
> >> -
> >> - create_file(filename, S_IRUSR | S_IWUSR);
> >> - g_file_set_contents(filename, data, length, NULL);
> >> -
> >> - if (device_type < 0)
> >> - goto end;
> >> -
> >> - g_free(data);
> >> - g_key_file_free(key_file);
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", address, key);
> >> -
> >> - key_file = g_key_file_new();
> >> - g_key_file_load_from_file(key_file, filename, 0, NULL);
> >> - set_device_type(key_file, device_type);
> >> -
> >> - data = g_key_file_to_data(key_file, &length, NULL);
> >> - if (length > 0) {
> >> - create_file(filename, S_IRUSR | S_IWUSR);
> >> - g_file_set_contents(filename, data, length, NULL);
> >> - }
> >> -
> >> -end:
> >> - g_free(data);
> >> - free(prim_uuid);
> >> - g_key_file_free(key_file);
> >> -}
> >> -
> >> -static void convert_ccc_entry(char *key, char *value, void *user_data)
> >> -{
> >> - char *src_addr = user_data;
> >> - char dst_addr[18];
> >> - char type = BDADDR_BREDR;
> >> - uint16_t handle;
> >> - int ret, err;
> >> - char filename[PATH_MAX];
> >> - GKeyFile *key_file;
> >> - struct stat st;
> >> - char group[6];
> >> - char *data;
> >> - gsize length = 0;
> >> -
> >> - ret = sscanf(key, "%17s#%hhu#%04hX", dst_addr, &type, &handle);
> >> - if (ret < 3)
> >> - return;
> >> -
> >> - if (bachk(dst_addr) != 0)
> >> - return;
> >> -
> >> - /* Check if the device directory has been created as records should
> >> - * only be converted for known devices */
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, dst_addr);
> >> -
> >> - err = stat(filename, &st);
> >> - if (err || !S_ISDIR(st.st_mode))
> >> - return;
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/ccc", src_addr,
> >> - dst_addr);
> >> - key_file = g_key_file_new();
> >> - g_key_file_load_from_file(key_file, filename, 0, NULL);
> >> -
> >> - sprintf(group, "%hu", handle);
> >> - g_key_file_set_string(key_file, group, "Value", value);
> >> -
> >> - data = g_key_file_to_data(key_file, &length, NULL);
> >> - if (length > 0) {
> >> - create_file(filename, S_IRUSR | S_IWUSR);
> >> - g_file_set_contents(filename, data, length, NULL);
> >> - }
> >> -
> >> - g_free(data);
> >> - g_key_file_free(key_file);
> >> -}
> >> -
> >> -static void convert_gatt_entry(char *key, char *value, void *user_data)
> >> -{
> >> - char *src_addr = user_data;
> >> - char dst_addr[18];
> >> - char type = BDADDR_BREDR;
> >> - uint16_t handle;
> >> - int ret, err;
> >> - char filename[PATH_MAX];
> >> - GKeyFile *key_file;
> >> - struct stat st;
> >> - char group[6];
> >> - char *data;
> >> - gsize length = 0;
> >> -
> >> - ret = sscanf(key, "%17s#%hhu#%04hX", dst_addr, &type, &handle);
> >> - if (ret < 3)
> >> - return;
> >> -
> >> - if (bachk(dst_addr) != 0)
> >> - return;
> >> -
> >> - /* Check if the device directory has been created as records should
> >> - * only be converted for known devices */
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, dst_addr);
> >> -
> >> - err = stat(filename, &st);
> >> - if (err || !S_ISDIR(st.st_mode))
> >> - return;
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/gatt", src_addr,
> >> - dst_addr);
> >> - key_file = g_key_file_new();
> >> - g_key_file_load_from_file(key_file, filename, 0, NULL);
> >> -
> >> - sprintf(group, "%hu", handle);
> >> - g_key_file_set_string(key_file, group, "Value", value);
> >> -
> >> - data = g_key_file_to_data(key_file, &length, NULL);
> >> - if (length > 0) {
> >> - create_file(filename, S_IRUSR | S_IWUSR);
> >> - g_file_set_contents(filename, data, length, NULL);
> >> - }
> >> -
> >> - g_free(data);
> >> - g_key_file_free(key_file);
> >> -}
> >> -
> >> -static void convert_proximity_entry(char *key, char *value, void *user_data)
> >> -{
> >> - char *src_addr = user_data;
> >> - char *alert;
> >> - char filename[PATH_MAX];
> >> - GKeyFile *key_file;
> >> - struct stat st;
> >> - int err;
> >> - char *data;
> >> - gsize length = 0;
> >> -
> >> - if (!strchr(key, '#'))
> >> - return;
> >> -
> >> - key[17] = '\0';
> >> - alert = &key[18];
> >> -
> >> - if (bachk(key) != 0)
> >> - return;
> >> -
> >> - /* Check if the device directory has been created as records should
> >> - * only be converted for known devices */
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, key);
> >> -
> >> - err = stat(filename, &st);
> >> - if (err || !S_ISDIR(st.st_mode))
> >> - return;
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/proximity", src_addr,
> >> - key);
> >> - key_file = g_key_file_new();
> >> - g_key_file_load_from_file(key_file, filename, 0, NULL);
> >> -
> >> - g_key_file_set_string(key_file, alert, "Level", value);
> >> -
> >> - data = g_key_file_to_data(key_file, &length, NULL);
> >> - if (length > 0) {
> >> - create_file(filename, S_IRUSR | S_IWUSR);
> >> - g_file_set_contents(filename, data, length, NULL);
> >> - }
> >> -
> >> - g_free(data);
> >> - g_key_file_free(key_file);
> >> -}
> >> -
> >> -static void convert_device_storage(struct btd_adapter *adapter)
> >> -{
> >> - char filename[PATH_MAX];
> >> - char address[18];
> >> -
> >> - ba2str(&adapter->bdaddr, address);
> >> -
> >> - /* Convert device's name cache */
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/names", address);
> >> - textfile_foreach(filename, convert_names_entry, address);
> >> -
> >> - /* Convert aliases */
> >> - convert_file("aliases", address, convert_aliases_entry, TRUE);
> >> -
> >> - /* Convert trusts */
> >> - convert_file("trusts", address, convert_trusts_entry, TRUE);
> >> -
> >> - /* Convert blocked */
> >> - convert_file("blocked", address, convert_blocked_entry, TRUE);
> >> -
> >> - /* Convert profiles */
> >> - convert_file("profiles", address, convert_profiles_entry, TRUE);
> >> -
> >> - /* Convert primaries */
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/primaries", address);
> >> - textfile_foreach(filename, convert_primaries_entry, address);
> >> -
> >> - /* Convert linkkeys */
> >> - convert_file("linkkeys", address, convert_linkkey_entry, TRUE);
> >> -
> >> - /* Convert longtermkeys */
> >> - convert_file("longtermkeys", address, convert_ltk_entry, TRUE);
> >> -
> >> - /* Convert classes */
> >> - convert_file("classes", address, convert_classes_entry, FALSE);
> >> -
> >> - /* Convert device ids */
> >> - convert_file("did", address, convert_did_entry, FALSE);
> >> -
> >> - /* Convert sdp */
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/sdp", address);
> >> - textfile_foreach(filename, convert_sdp_entry, address);
> >> -
> >> - /* Convert ccc */
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/ccc", address);
> >> - textfile_foreach(filename, convert_ccc_entry, address);
> >> -
> >> - /* Convert appearances */
> >> - convert_file("appearances", address, convert_appearances_entry, FALSE);
> >> -
> >> - /* Convert gatt */
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/gatt", address);
> >> - textfile_foreach(filename, convert_gatt_entry, address);
> >> -
> >> - /* Convert proximity */
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/proximity", address);
> >> - textfile_foreach(filename, convert_proximity_entry, address);
> >> -}
> >> -
> >> -static void convert_config(struct btd_adapter *adapter, const char *filename,
> >> - GKeyFile *key_file)
> >> -{
> >> - char address[18];
> >> - char str[MAX_NAME_LENGTH + 1];
> >> - char config_path[PATH_MAX];
> >> - int timeout;
> >> - uint8_t mode;
> >> - char *data;
> >> - gsize length = 0;
> >> -
> >> - ba2str(&adapter->bdaddr, address);
> >> - snprintf(config_path, PATH_MAX, STORAGEDIR "/%s/config", address);
> >> -
> >> - if (read_pairable_timeout(address, &timeout) == 0)
> >> - g_key_file_set_integer(key_file, "General",
> >> - "PairableTimeout", timeout);
> >> -
> >> - if (read_discoverable_timeout(address, &timeout) == 0)
> >> - g_key_file_set_integer(key_file, "General",
> >> - "DiscoverableTimeout", timeout);
> >> -
> >> - if (read_on_mode(address, str, sizeof(str)) == 0) {
> >> - mode = get_mode(str);
> >> - g_key_file_set_boolean(key_file, "General", "Discoverable",
> >> - mode == MODE_DISCOVERABLE);
> >> - }
> >> -
> >> - if (read_local_name(&adapter->bdaddr, str) == 0)
> >> - g_key_file_set_string(key_file, "General", "Alias", str);
> >> -
> >> - create_file(filename, S_IRUSR | S_IWUSR);
> >> -
> >> - data = g_key_file_to_data(key_file, &length, NULL);
> >> - g_file_set_contents(filename, data, length, NULL);
> >> - g_free(data);
> >> -}
> >> -
> >> -static void fix_storage(struct btd_adapter *adapter)
> >> -{
> >> - char filename[PATH_MAX];
> >> - char address[18];
> >> - char *converted;
> >> -
> >> - ba2str(&adapter->bdaddr, address);
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/config", address);
> >> - converted = textfile_get(filename, "converted");
> >> - if (!converted)
> >> - return;
> >> -
> >> - free(converted);
> >> -
> >> - textfile_del(filename, "converted");
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/names", address);
> >> - textfile_del(filename, "converted");
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/aliases", address);
> >> - textfile_del(filename, "converted");
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/trusts", address);
> >> - textfile_del(filename, "converted");
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/blocked", address);
> >> - textfile_del(filename, "converted");
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/profiles", address);
> >> - textfile_del(filename, "converted");
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/primaries", address);
> >> - textfile_del(filename, "converted");
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/linkkeys", address);
> >> - textfile_del(filename, "converted");
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/longtermkeys", address);
> >> - textfile_del(filename, "converted");
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/classes", address);
> >> - textfile_del(filename, "converted");
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/did", address);
> >> - textfile_del(filename, "converted");
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/sdp", address);
> >> - textfile_del(filename, "converted");
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/ccc", address);
> >> - textfile_del(filename, "converted");
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/appearances", address);
> >> - textfile_del(filename, "converted");
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/gatt", address);
> >> - textfile_del(filename, "converted");
> >> -
> >> - snprintf(filename, PATH_MAX, STORAGEDIR "/%s/proximity", address);
> >> - textfile_del(filename, "converted");
> >> -}
> >> -
> >> static void load_config(struct btd_adapter *adapter)
> >> {
> >> GKeyFile *key_file;
> >> char filename[PATH_MAX];
> >> - struct stat st;
> >> GError *gerr = NULL;
> >>
> >> key_file = g_key_file_new();
> >> @@ -5752,11 +4926,6 @@ static void load_config(struct btd_adapter *adapter)
> >> snprintf(filename, PATH_MAX, STORAGEDIR "/%s/settings",
> >> btd_adapter_get_storage_dir(adapter));
> >>
> >> - if (stat(filename, &st) < 0) {
> >> - convert_config(adapter, filename, key_file);
> >> - convert_device_storage(adapter);
> >> - }
> >> -
> >> g_key_file_load_from_file(key_file, filename, 0, NULL);
> >>
> >> /* Get alias */
> >> @@ -8124,7 +7293,6 @@ static int adapter_register(struct btd_adapter *adapter)
> >>
> >> load:
> >> load_config(adapter);
> >> - fix_storage(adapter);
> >> load_drivers(adapter);
> >> btd_profile_foreach(probe_profile, adapter);
> >> clear_blocked(adapter);
> >> --
> >> 2.11.0
> >>
> >
> >
> > --
> > Luiz Augusto von Dentz
--
Luiz Augusto von Dentz
--- End Message ---