sdp_record_t *find_record_in_list(sdp_list_t *recs, const char *uuid) { sdp_list_t *seq; for (seq = recs; seq; seq = seq->next) { sdp_record_t *rec = (sdp_record_t *) seq->data; sdp_list_t *svcclass = NULL; char *uuid_str; if (sdp_get_service_classes(rec, &svcclass) < 0) continue; /* Extract the uuid */ uuid_str = bt_uuid2string(svcclass->data); if (!uuid_str) { sdp_list_free(svcclass, free); continue; } if (!strcasecmp(uuid_str, uuid)) { sdp_list_free(svcclass, free); free(uuid_str); return rec; } sdp_list_free(svcclass, free); free(uuid_str); } return NULL; }
static int parse_eir_data(struct eir_data *eir, uint8_t *eir_data, size_t eir_length) { uint16_t len = 0; size_t total; size_t uuid16_count = 0; size_t uuid32_count = 0; size_t uuid128_count = 0; uint8_t *uuid16 = NULL; uint8_t *uuid32 = NULL; uint8_t *uuid128 = NULL; uuid_t service; char *uuid_str; unsigned int i; /* No EIR data to parse */ if (eir_data == NULL || eir_length == 0) return 0; while (len < eir_length - 1) { uint8_t field_len = eir_data[0]; /* Check for the end of EIR */ if (field_len == 0) break; switch (eir_data[1]) { case EIR_UUID16_SOME: case EIR_UUID16_ALL: uuid16_count = field_len / 2; uuid16 = &eir_data[2]; break; case EIR_UUID32_SOME: case EIR_UUID32_ALL: uuid32_count = field_len / 4; uuid32 = &eir_data[2]; break; case EIR_UUID128_SOME: case EIR_UUID128_ALL: uuid128_count = field_len / 16; uuid128 = &eir_data[2]; break; case EIR_FLAGS: eir->flags = eir_data[2]; break; case EIR_NAME_SHORT: case EIR_NAME_COMPLETE: if (g_utf8_validate((char *) &eir_data[2], field_len - 1, NULL)) eir->name = g_strndup((char *) &eir_data[2], field_len - 1); else eir->name = g_strdup(""); eir->name_complete = eir_data[1] == EIR_NAME_COMPLETE; break; } len += field_len + 1; eir_data += field_len + 1; } /* Bail out if got incorrect length */ if (len > eir_length) return -EINVAL; total = uuid16_count + uuid32_count + uuid128_count; /* No UUIDs were parsed, so skip code below */ if (!total) return 0; /* Generate uuids in SDP format (EIR data is Little Endian) */ service.type = SDP_UUID16; for (i = 0; i < uuid16_count; i++) { uint16_t val16 = uuid16[1]; val16 = (val16 << 8) + uuid16[0]; service.value.uuid16 = val16; uuid_str = bt_uuid2string(&service); eir->services = g_slist_append(eir->services, uuid_str); uuid16 += 2; } service.type = SDP_UUID32; for (i = uuid16_count; i < uuid32_count + uuid16_count; i++) { uint32_t val32 = uuid32[3]; int k; for (k = 2; k >= 0; k--) val32 = (val32 << 8) + uuid32[k]; service.value.uuid32 = val32; uuid_str = bt_uuid2string(&service); eir->services = g_slist_append(eir->services, uuid_str); uuid32 += 4; } service.type = SDP_UUID128; for (i = uuid32_count + uuid16_count; i < total; i++) { int k; for (k = 0; k < 16; k++) service.value.uuid128.data[k] = uuid128[16 - k - 1]; uuid_str = bt_uuid2string(&service); eir->services = g_slist_append(eir->services, uuid_str); uuid128 += 16; } return 0; }