168
180
static inline DBusMessage *in_progress(DBusMessage *msg, const char *str)
170
return g_dbus_create_error(msg, ERROR_INTERFACE ".InProgress", str);
182
return g_dbus_create_error(msg, ERROR_INTERFACE ".InProgress",
186
static void browse_request_free(struct browse_req *req)
188
if (req->listener_id)
189
g_dbus_remove_watch(req->conn, req->listener_id);
191
dbus_message_unref(req->msg);
193
dbus_connection_unref(req->conn);
195
btd_device_unref(req->device);
196
g_slist_foreach(req->profiles_added, (GFunc) g_free, NULL);
197
g_slist_free(req->profiles_added);
198
g_slist_free(req->profiles_removed);
200
sdp_list_free(req->records, (sdp_free_func_t) sdp_record_free);
204
static void browse_request_cancel(struct browse_req *req)
206
struct btd_device *device = req->device;
207
struct btd_adapter *adapter = device->adapter;
210
if (device_is_creating(device, NULL))
211
device_set_temporary(device, TRUE);
213
adapter_get_address(adapter, &src);
215
if (device->le == FALSE)
216
bt_cancel_discovery(&src, &device->bdaddr);
218
device->browse = NULL;
219
browse_request_free(req);
173
222
static void device_free(gpointer user_data)
177
226
struct agent *agent = adapter_get_agent(adapter);
179
228
if (device->agent)
180
agent_destroy(device->agent, FALSE);
229
agent_free(device->agent);
182
if (agent && agent_is_busy(agent, device))
231
if (agent && (agent_is_busy(agent, device) ||
232
agent_is_busy(agent, device->authr)))
183
233
agent_cancel(agent);
235
g_slist_foreach(device->services, (GFunc) g_free, NULL);
236
g_slist_free(device->services);
185
238
g_slist_foreach(device->uuids, (GFunc) g_free, NULL);
186
239
g_slist_free(device->uuids);
241
if (device->tmp_records)
242
sdp_list_free(device->tmp_records,
243
(sdp_free_func_t) sdp_record_free);
188
245
if (device->disconn_timer)
189
246
g_source_remove(device->disconn_timer);
191
248
if (device->discov_timer)
192
249
g_source_remove(device->discov_timer);
253
g_free(device->authr);
194
254
g_free(device->path);
255
g_free(device->alias);
198
259
gboolean device_is_paired(struct btd_device *device)
200
struct btd_adapter *adapter = device->adapter;
201
char filename[PATH_MAX + 1], *str;
202
char srcaddr[18], dstaddr[18];
206
adapter_get_address(adapter, &src);
207
ba2str(&src, srcaddr);
208
ba2str(&device->bdaddr, dstaddr);
210
create_name(filename, PATH_MAX, STORAGEDIR,
211
srcaddr, "linkkeys");
212
str = textfile_caseget(filename, dstaddr);
213
ret = str ? TRUE : FALSE;
261
return device->paired;
264
gboolean device_is_trusted(struct btd_device *device)
266
return device->trusted;
219
269
static DBusMessage *get_properties(DBusConnection *conn,
256
306
adapter_get_address(adapter, &src);
257
307
ba2str(&src, srcaddr);
261
dict_append_entry(&dict, "Name", DBUS_TYPE_STRING, &ptr);
310
dict_append_entry(&dict, "Name", DBUS_TYPE_STRING, &ptr);
264
312
/* Alias (fallback to name or address) */
265
if (read_device_alias(srcaddr, dstaddr, name, sizeof(name)) < 1) {
267
g_strdelimit(dstaddr, ":", '-');
313
if (device->alias != NULL)
315
else if (strlen(ptr) == 0) {
316
g_strdelimit(dstaddr, ":", '-');
274
dict_append_entry(&dict, "Alias", DBUS_TYPE_STRING, &ptr);
320
dict_append_entry(&dict, "Alias", DBUS_TYPE_STRING, &ptr);
277
323
if (read_remote_class(&src, &device->bdaddr, &class) == 0) {
289
335
dict_append_entry(&dict, "Paired", DBUS_TYPE_BOOLEAN, &boolean);
292
boolean = read_trust(&src, dstaddr, GLOBAL_TRUST);
338
boolean = device_is_trusted(device);
293
339
dict_append_entry(&dict, "Trusted", DBUS_TYPE_BOOLEAN, &boolean);
342
boolean = device->blocked;
343
dict_append_entry(&dict, "Blocked", DBUS_TYPE_BOOLEAN, &boolean);
296
346
boolean = (device->handle != 0);
297
347
dict_append_entry(&dict, "Connected", DBUS_TYPE_BOOLEAN,
301
uuids = g_new0(char *, g_slist_length(device->uuids) + 1);
351
str = g_new0(char *, g_slist_length(device->uuids) + 1);
302
352
for (i = 0, l = device->uuids; l; l = l->next, i++)
304
dict_append_array(&dict, "UUIDs", DBUS_TYPE_STRING, &uuids, i);
354
dict_append_array(&dict, "UUIDs", DBUS_TYPE_STRING, &str, i);
358
str = g_new0(char *, g_slist_length(device->services) + 1);
359
for (i = 0, l = device->services; l; l = l->next, i++)
361
dict_append_array(&dict, "Services", DBUS_TYPE_OBJECT_PATH, &str, i);
308
365
ptr = adapter_get_path(adapter);
344
409
static DBusMessage *set_trust(DBusConnection *conn, DBusMessage *msg,
345
dbus_bool_t value, void *data)
410
gboolean value, void *data)
347
412
struct btd_device *device = data;
348
413
struct btd_adapter *adapter = device->adapter;
349
414
char srcaddr[18], dstaddr[18];
418
if (device->trusted == value)
419
return dbus_message_new_method_return(msg);
352
421
adapter_get_address(adapter, &src);
353
422
ba2str(&src, srcaddr);
354
423
ba2str(&device->bdaddr, dstaddr);
356
write_trust(srcaddr, dstaddr, GLOBAL_TRUST, value);
425
err = write_trust(srcaddr, dstaddr, GLOBAL_TRUST, value);
427
return g_dbus_create_error(msg,
428
ERROR_INTERFACE ".Failed",
429
"%s", strerror(-err));
431
device->trusted = value;
358
433
emit_property_changed(conn, dbus_message_get_path(msg),
359
434
DEVICE_INTERFACE, "Trusted",
362
437
return dbus_message_new_method_return(msg);
440
static void driver_remove(struct btd_driver_data *driver_data,
441
struct btd_device *device)
443
struct btd_device_driver *driver = driver_data->driver;
445
driver->remove(device);
447
device->drivers = g_slist_remove(device->drivers, driver_data);
451
static gboolean do_disconnect(gpointer user_data)
453
struct btd_device *device = user_data;
455
device->disconn_timer = 0;
457
btd_adapter_disconnect_device(device->adapter, device->handle);
462
static int device_block(DBusConnection *conn, struct btd_device *device)
471
do_disconnect(device);
473
g_slist_foreach(device->drivers, (GFunc) driver_remove, device);
475
err = btd_adapter_block_address(device->adapter, &device->bdaddr);
479
device->blocked = TRUE;
481
adapter_get_address(device->adapter, &src);
483
err = write_blocked(&src, &device->bdaddr, TRUE);
485
error("write_blocked(): %s (%d)", strerror(-err), -err);
487
device_set_temporary(device, FALSE);
489
emit_property_changed(conn, device->path, DEVICE_INTERFACE, "Blocked",
490
DBUS_TYPE_BOOLEAN, &device->blocked);
495
static int device_unblock(DBusConnection *conn, struct btd_device *device,
501
if (!device->blocked)
504
err = btd_adapter_unblock_address(device->adapter, &device->bdaddr);
508
device->blocked = FALSE;
510
adapter_get_address(device->adapter, &src);
512
err = write_blocked(&src, &device->bdaddr, FALSE);
514
error("write_blocked(): %s (%d)", strerror(-err), -err);
517
emit_property_changed(conn, device->path,
518
DEVICE_INTERFACE, "Blocked",
519
DBUS_TYPE_BOOLEAN, &device->blocked);
520
device_probe_drivers(device, device->uuids);
526
static DBusMessage *set_blocked(DBusConnection *conn, DBusMessage *msg,
527
gboolean value, void *data)
529
struct btd_device *device = data;
533
err = device_block(conn, device);
535
err = device_unblock(conn, device, FALSE);
539
return dbus_message_new_method_return(msg);
541
return g_dbus_create_error(msg,
542
ERROR_INTERFACE ".NotSupported",
543
"Kernel lacks blacklist support");
545
return g_dbus_create_error(msg, ERROR_INTERFACE ".Failed",
546
"%s", strerror(-err));
365
550
static inline DBusMessage *invalid_args(DBusMessage *msg)
367
return g_dbus_create_error(msg,
368
ERROR_INTERFACE ".InvalidArguments",
369
"Invalid arguments in method call");
552
return g_dbus_create_error(msg, ERROR_INTERFACE ".InvalidArguments",
553
"Invalid arguments in method call");
372
556
static DBusMessage *set_property(DBusConnection *conn,
462
650
"Discovery Failed");
653
static const char *browse_request_get_requestor(struct browse_req *req)
658
return dbus_message_get_sender(req->msg);
661
static void iter_append_record(DBusMessageIter *dict, uint32_t handle,
664
DBusMessageIter entry;
666
dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY,
669
dbus_message_iter_append_basic(&entry, DBUS_TYPE_UINT32, &handle);
671
dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &record);
673
dbus_message_iter_close_container(dict, &entry);
676
static void discover_services_reply(struct browse_req *req, int err,
680
DBusMessageIter iter, dict;
686
if (err == -EHOSTDOWN)
687
err_if = ERROR_INTERFACE ".ConnectionAttemptFailed";
689
err_if = ERROR_INTERFACE ".Failed";
691
reply = dbus_message_new_error(req->msg, err_if,
693
g_dbus_send_message(req->conn, reply);
697
reply = dbus_message_new_method_return(req->msg);
701
dbus_message_iter_init_append(reply, &iter);
703
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
704
DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
705
DBUS_TYPE_UINT32_AS_STRING DBUS_TYPE_STRING_AS_STRING
706
DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
708
for (seq = recs; seq; seq = seq->next) {
709
sdp_record_t *rec = (sdp_record_t *) seq->data;
715
result = g_string_new(NULL);
717
convert_sdp_record_to_xml(rec, result,
718
(void *) g_string_append);
721
iter_append_record(&dict, rec->handle, result->str);
723
g_string_free(result, TRUE);
726
dbus_message_iter_close_container(&iter, &dict);
728
g_dbus_send_message(req->conn, reply);
465
731
static DBusMessage *cancel_discover(DBusConnection *conn,
466
732
DBusMessage *msg, void *user_data)
468
734
struct btd_device *device = user_data;
469
struct btd_adapter *adapter = device->adapter;
470
735
const char *sender = dbus_message_get_sender(msg);
473
adapter_get_address(adapter, &src);
475
if (!device->discov_active)
736
const char *requestor;
476
739
return g_dbus_create_error(msg,
477
740
ERROR_INTERFACE ".Failed",
478
741
"No pending discovery");
743
if (!dbus_message_is_method_call(device->browse->msg, DEVICE_INTERFACE,
745
return g_dbus_create_error(msg,
746
ERROR_INTERFACE ".NotAuthorized",
749
requestor = browse_request_get_requestor(device->browse);
480
751
/* only the discover requestor can cancel the inquiry process */
481
if (!device->discov_requestor ||
482
!g_str_equal(device->discov_requestor, sender))
752
if (!requestor || !g_str_equal(requestor, sender))
483
753
return g_dbus_create_error(msg,
484
754
ERROR_INTERFACE ".NotAuthorized",
485
755
"Not Authorized");
487
if (bt_cancel_discovery(&src, &device->bdaddr) < 0)
488
return g_dbus_create_error(msg,
489
ERROR_INTERFACE ".Failed",
490
"No pending discover");
757
discover_services_reply(device->browse, -ECANCELED, NULL);
759
browse_request_cancel(device->browse);
492
761
return dbus_message_new_method_return(msg);
495
static gboolean disconnect_timeout(gpointer user_data)
497
struct btd_device *device = user_data;
500
uint16_t dev_id = adapter_get_dev_id(device->adapter);
502
device->disconn_timer = 0;
504
dd = hci_open_dev(dev_id);
508
memset(&cp, 0, sizeof(cp));
509
cp.handle = htobs(device->handle);
510
cp.reason = HCI_OE_USER_ENDED_CONNECTION;
512
hci_send_cmd(dd, OGF_LINK_CTL, OCF_DISCONNECT,
513
DISCONNECT_CP_SIZE, &cp);
764
static void bonding_request_cancel(struct bonding_req *bonding)
769
g_io_channel_shutdown(bonding->io, TRUE, NULL);
770
g_io_channel_unref(bonding->io);
774
void device_request_disconnect(struct btd_device *device, DBusMessage *msg)
776
DBusConnection *conn = get_dbus_connection();
779
bonding_request_cancel(device->bonding);
782
browse_request_cancel(device->browse);
785
device->disconnects = g_slist_append(device->disconnects,
786
dbus_message_ref(msg));
788
if (device->disconn_timer)
791
while (device->watches) {
792
struct btd_disconnect_data *data = device->watches->data;
795
/* temporary is set if device is going to be removed */
796
data->watch(device, device->temporary,
799
/* Check if the watch has been removed by callback function */
800
if (!g_slist_find(device->watches, data))
803
device->watches = g_slist_remove(device->watches, data);
807
device->disconn_timer = g_timeout_add_seconds(DISCONNECT_TIMER,
808
do_disconnect, device);
810
g_dbus_emit_signal(conn, device->path,
811
DEVICE_INTERFACE, "DisconnectRequested",
521
815
static DBusMessage *disconnect(DBusConnection *conn, DBusMessage *msg,
595
887
void device_remove_connection(struct btd_device *device, DBusConnection *conn,
598
if (device->handle != handle) {
599
error("%s: Unable to remove connection %u, handle mismatch (%u)",
600
device->path, handle, device->handle);
890
if (handle && device->handle != handle) {
892
ba2str(&device->bdaddr, addr);
893
error("%s: connection handle mismatch %u != %u",
894
addr, handle, device->handle);
604
898
device->handle = 0;
900
if (device->disconn_timer > 0) {
901
g_source_remove(device->disconn_timer);
902
device->disconn_timer = 0;
905
while (device->disconnects) {
906
DBusMessage *msg = device->disconnects->data;
908
g_dbus_send_reply(conn, msg, DBUS_TYPE_INVALID);
909
device->disconnects = g_slist_remove(device->disconnects, msg);
606
912
device_set_connected(device, conn, FALSE);
647
994
str2ba(address, &device->bdaddr);
648
995
device->adapter = adapter;
649
997
adapter_get_address(adapter, &src);
650
998
ba2str(&src, srcaddr);
651
999
read_device_name(srcaddr, address, device->name);
1000
if (read_device_alias(srcaddr, address, alias, sizeof(alias)) == 0)
1001
device->alias = g_strdup(alias);
1002
device->trusted = read_trust(&src, address, GLOBAL_TRUST);
1004
if (read_blocked(&src, &device->bdaddr))
1005
device_block(conn, device);
653
1007
device->auth = 0xff;
1009
if (read_link_key(&src, &device->bdaddr, NULL, NULL) == 0)
1010
device->paired = TRUE;
1012
return btd_device_ref(device);
658
1015
void device_set_name(struct btd_device *device, const char *name)
660
1017
DBusConnection *conn = get_dbus_connection();
662
char srcaddr[18], dstaddr[18];
665
if (strncmp(name, device->name, 248) == 0)
1019
if (strncmp(name, device->name, MAX_NAME_LENGTH) == 0)
668
strncpy(device->name, name, 248);
1022
strncpy(device->name, name, MAX_NAME_LENGTH);
670
1024
emit_property_changed(conn, device->path,
671
1025
DEVICE_INTERFACE, "Name",
672
1026
DBUS_TYPE_STRING, &name);
674
adapter_get_address(device->adapter, &src);
675
ba2str(&src, srcaddr);
676
ba2str(&device->bdaddr, dstaddr);
678
if (read_device_alias(srcaddr, dstaddr, alias, sizeof(alias)) == 0)
1028
if (device->alias != NULL)
681
1031
emit_property_changed(conn, device->path,
683
1033
DBUS_TYPE_STRING, &name);
686
static void device_remove_bonding(struct btd_device *device,
687
DBusConnection *conn)
1036
void device_get_name(struct btd_device *device, char *name, size_t len)
1038
strncpy(name, device->name, len);
1041
void device_remove_bonding(struct btd_device *device)
689
1043
char filename[PATH_MAX + 1];
690
char *str, srcaddr[18], dstaddr[18];
1044
char srcaddr[18], dstaddr[18];
692
1045
bdaddr_t bdaddr;
695
1047
adapter_get_address(device->adapter, &bdaddr);
696
1048
ba2str(&bdaddr, srcaddr);
697
1049
ba2str(&device->bdaddr, dstaddr);
699
dev_id = adapter_get_dev_id(device->adapter);
701
dd = hci_open_dev(dev_id);
705
1051
create_name(filename, PATH_MAX, STORAGEDIR, srcaddr,
708
/* textfile_del doesn't return an error when the key is not found */
709
str = textfile_caseget(filename, dstaddr);
710
paired = str ? TRUE : FALSE;
716
1054
/* Delete the link key from storage */
717
1055
textfile_casedel(filename, dstaddr);
719
/* Delete the link key from the Bluetooth chip */
720
hci_delete_stored_link_key(dd, &device->bdaddr, 0, HCI_REQ_TIMEOUT);
722
/* Send the HCI disconnect command */
723
if (device->handle) {
724
int err = hci_disconnect(dd, htobs(device->handle),
725
HCI_OE_USER_ENDED_CONNECTION,
728
error("Disconnect: %s (%d)", strerror(-err), -err);
734
emit_property_changed(conn, device->path, DEVICE_INTERFACE,
735
"Paired", DBUS_TYPE_BOOLEAN, &paired);
1057
btd_adapter_remove_bonding(device->adapter, &device->bdaddr);
738
static void device_remove_stored(struct btd_device *device,
739
DBusConnection *conn)
1060
static void device_remove_stored(struct btd_device *device)
1064
DBusConnection *conn = get_dbus_connection();
744
1066
adapter_get_address(device->adapter, &src);
745
1067
ba2str(&device->bdaddr, addr);
746
device_remove_bonding(device, conn);
1070
device_remove_bonding(device);
747
1071
delete_entry(&src, "profiles", addr);
748
1072
delete_entry(&src, "trusts", addr);
1073
delete_all_records(&src, &device->bdaddr);
1074
delete_device_service(&src, &device->bdaddr);
1076
if (device->blocked)
1077
device_unblock(conn, device, TRUE);
751
void device_remove(struct btd_device *device, DBusConnection *conn,
752
gboolean remove_stored)
1080
void device_remove(struct btd_device *device, gboolean remove_stored)
755
struct btd_device_driver *driver;
756
gchar *path = g_strdup(device->path);
758
debug("Removing device %s", path);
1083
DBG("Removing device %s", device->path);
1086
agent_free(device->agent);
760
1088
if (device->bonding)
761
1089
device_cancel_bonding(device, HCI_OE_USER_ENDED_CONNECTION);
763
if (!device->temporary && remove_stored)
764
device_remove_stored(device, conn);
766
for (list = device->drivers; list; list = list->next) {
767
struct btd_driver_data *driver_data = list->data;
768
driver = driver_data->driver;
770
driver->remove(device);
775
g_dbus_unregister_interface(conn, path, DEVICE_INTERFACE);
1092
browse_request_cancel(device->browse);
1095
do_disconnect(device);
1098
device_remove_stored(device);
1100
g_slist_foreach(device->drivers, (GFunc) driver_remove, device);
1101
g_slist_free(device->drivers);
1102
device->drivers = NULL;
1104
btd_device_unref(device);
780
1107
gint device_address_cmp(struct btd_device *device, const gchar *address)
953
1280
g_free(driver_data);
955
rec = find_record_in_list(records, *uuid);
959
delete_record(srcaddr, dstaddr, rec->handle);
961
records = sdp_list_remove(records, rec);
962
sdp_record_free(rec);
1286
for (list = uuids; list; list = list->next) {
1289
device->uuids = g_slist_remove(device->uuids, list->data);
1291
rec = find_record_in_list(records, list->data);
1295
delete_record(srcaddr, dstaddr, rec->handle);
1297
records = sdp_list_remove(records, rec);
1298
sdp_record_free(rec);
969
1303
sdp_list_free(records, (sdp_free_func_t) sdp_record_free);
971
for (list = uuids; list; list = list->next)
972
device->uuids = g_slist_remove(device->uuids, list->data);
975
static void iter_append_record(DBusMessageIter *dict, uint32_t handle,
978
DBusMessageIter entry;
980
dbus_message_iter_open_container(dict, DBUS_TYPE_DICT_ENTRY,
983
dbus_message_iter_append_basic(&entry, DBUS_TYPE_UINT32, &handle);
985
dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &record);
987
dbus_message_iter_close_container(dict, &entry);
990
static void discover_services_reply(struct browse_req *req, int err,
994
DBusMessageIter iter, dict;
1000
if (err == -EHOSTDOWN)
1001
err_if = ERROR_INTERFACE ".ConnectionAttemptFailed";
1003
err_if = ERROR_INTERFACE ".Failed";
1005
reply = dbus_message_new_error(req->msg, err_if,
1007
g_dbus_send_message(req->conn, reply);
1011
reply = dbus_message_new_method_return(req->msg);
1015
dbus_message_iter_init_append(reply, &iter);
1017
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
1018
DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
1019
DBUS_TYPE_UINT32_AS_STRING DBUS_TYPE_STRING_AS_STRING
1020
DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
1022
for (seq = recs; seq; seq = seq->next) {
1023
sdp_record_t *rec = (sdp_record_t *) seq->data;
1029
result = g_string_new(NULL);
1031
convert_sdp_record_to_xml(rec, result,
1032
(void *) g_string_append);
1035
iter_append_record(&dict, rec->handle, result->str);
1037
g_string_free(result, TRUE);
1040
dbus_message_iter_close_container(&iter, &dict);
1042
g_dbus_send_message(req->conn, reply);
1045
1306
static void services_changed(struct btd_device *device)
1170
static void browse_req_free(struct browse_req *req)
1437
static void create_device_reply(struct btd_device *device, struct browse_req *req)
1172
struct btd_device *device = req->device;
1174
device->discov_active = 0;
1176
if (device->discov_requestor) {
1177
g_dbus_remove_watch(req->conn, device->discov_listener);
1178
device->discov_listener = 0;
1179
g_free(device->discov_requestor);
1180
device->discov_requestor = NULL;
1184
dbus_message_unref(req->msg);
1186
dbus_connection_unref(req->conn);
1187
g_slist_foreach(req->profiles_added, (GFunc) g_free, NULL);
1188
g_slist_free(req->profiles_added);
1189
g_slist_free(req->profiles_removed);
1191
sdp_list_free(req->records, (sdp_free_func_t) sdp_record_free);
1441
reply = dbus_message_new_method_return(req->msg);
1445
dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &device->path,
1448
g_dbus_send_message(req->conn, reply);
1195
1451
static void search_cb(sdp_list_t *recs, int err, gpointer user_data)
1197
1453
struct browse_req *req = user_data;
1198
1454
struct btd_device *device = req->device;
1457
ba2str(&device->bdaddr, addr);
1202
1460
error("%s: error updating services: %s (%d)",
1203
device->path, strerror(-err), -err);
1461
addr, strerror(-err), -err);
1207
1465
update_services(req, recs);
1467
if (device->tmp_records)
1468
sdp_list_free(device->tmp_records,
1469
(sdp_free_func_t) sdp_record_free);
1471
device->tmp_records = req->records;
1472
req->records = NULL;
1209
1474
if (!req->profiles_added && !req->profiles_removed) {
1210
debug("%s: No service update", device->path);
1214
if (device->tmp_records && req->records) {
1215
sdp_list_free(device->tmp_records,
1216
(sdp_free_func_t) sdp_record_free);
1217
device->tmp_records = req->records;
1218
req->records = NULL;
1475
DBG("%s: No service update", addr);
1221
1479
/* Probe matching drivers for services added */
1229
1487
/* Propagate services changes */
1230
1488
services_changed(req->device);
1233
/* Store the device's profiles in the filesystem */
1234
store_profiles(device);
1239
1494
if (dbus_message_is_method_call(req->msg, DEVICE_INTERFACE,
1240
"DiscoverServices")) {
1241
discover_services_reply(req, err, req->records);
1495
"DiscoverServices"))
1496
discover_services_reply(req, err, device->tmp_records);
1497
else if (dbus_message_is_method_call(req->msg, ADAPTER_INTERFACE,
1498
"CreatePairedDevice"))
1499
create_device_reply(device, req);
1500
else if (dbus_message_is_method_call(req->msg, ADAPTER_INTERFACE,
1503
error_failed_errno(req->conn, req->msg, -err);
1507
create_device_reply(device, req);
1508
device_set_temporary(device, FALSE);
1245
/* Reply create device request */
1246
reply = dbus_message_new_method_return(req->msg);
1250
dbus_message_append_args(reply, DBUS_TYPE_OBJECT_PATH, &device->path,
1253
g_dbus_send_message(req->conn, reply);
1256
browse_req_free(req);
1512
if (!device->temporary)
1513
store_profiles(device);
1514
device->browse = NULL;
1515
browse_request_free(req);
1259
1518
static void browse_cb(sdp_list_t *recs, int err, gpointer user_data)
1568
static void primary_cb(GSList *services, int err, gpointer user_data)
1570
struct browse_req *req = user_data;
1571
struct btd_device *device = req->device;
1574
error_failed_errno(req->conn, req->msg, -err);
1578
services_changed(req->device);
1579
device_set_temporary(req->device, FALSE);
1580
device_probe_drivers(req->device, services);
1582
create_device_reply(req->device, req);
1585
device->browse = NULL;
1586
browse_request_free(req);
1589
static struct browse_req *browse_primary(struct btd_device *device, int *err)
1591
struct btd_adapter *adapter = device->adapter;
1592
struct browse_req *req;
1596
req = g_new0(struct browse_req, 1);
1597
req->device = btd_device_ref(device);
1599
adapter_get_address(adapter, &src);
1601
ret = bt_discover_primary(&src, &device->bdaddr, -1, primary_cb, req,
1605
browse_request_free(req);
1615
static struct browse_req *browse_sdp(struct btd_device *device, uuid_t *search,
1616
gboolean reverse, int *err)
1618
struct btd_adapter *adapter = device->adapter;
1619
struct browse_req *req;
1625
adapter_get_address(adapter, &src);
1627
req = g_new0(struct browse_req, 1);
1628
req->device = btd_device_ref(device);
1630
memcpy(&uuid, search, sizeof(uuid_t));
1633
sdp_uuid16_create(&uuid, uuid_list[req->search_uuid++]);
1634
init_browse(req, reverse);
1638
ret = bt_search_service(&src, &device->bdaddr, &uuid, cb, req, NULL);
1640
browse_request_free(req);
1309
1650
int device_browse(struct btd_device *device, DBusConnection *conn,
1310
1651
DBusMessage *msg, uuid_t *search, gboolean reverse)
1312
struct btd_adapter *adapter = device->adapter;
1313
1653
struct browse_req *req;
1319
if (device->discov_active)
1322
adapter_get_address(adapter, &src);
1660
req = browse_primary(device, &err);
1662
req = browse_sdp(device, search, reverse, &err);
1324
req = g_new0(struct browse_req, 1);
1326
1667
if (conn == NULL)
1327
1668
conn = get_dbus_connection();
1329
1670
req->conn = dbus_connection_ref(conn);
1330
req->device = device;
1333
memcpy(&uuid, search, sizeof(uuid_t));
1336
sdp_uuid16_create(&uuid, uuid_list[req->search_uuid++]);
1337
init_browse(req, reverse);
1341
device->discov_active = 1;
1671
device->browse = req;
1344
1674
const char *sender = dbus_message_get_sender(msg);
1346
1676
req->msg = dbus_message_ref(msg);
1347
device->discov_requestor = g_strdup(sender);
1348
1677
/* Track the request owner to cancel it
1349
1678
* automatically if the owner exits */
1350
device->discov_listener = g_dbus_add_disconnect_watch(conn,
1679
req->listener_id = g_dbus_add_disconnect_watch(conn,
1352
1681
discover_services_req_exit,
1356
err = bt_search_service(&src, &device->bdaddr,
1357
&uuid, cb, req, NULL);
1359
browse_req_free(req);
1523
1843
if (bonding->conn)
1524
1844
dbus_connection_unref(bonding->conn);
1527
g_source_remove(bonding->io_id);
1531
g_io_channel_shutdown(bonding->io, TRUE, NULL);
1532
1847
g_io_channel_unref(bonding->io);
1535
1849
device = bonding->device;
1537
if (device && device->agent) {
1538
agent_destroy(device->agent, FALSE);
1539
device->agent = NULL;
1542
1855
device->bonding = NULL;
1857
adapter_resume_discovery(device->adapter);
1862
agent_cancel(device->agent);
1863
agent_free(device->agent);
1864
device->agent = NULL;
1546
static void device_set_paired(struct btd_device *device, gboolean value)
1867
void device_set_paired(struct btd_device *device, gboolean value)
1548
1869
DBusConnection *conn = get_dbus_connection();
1871
if (device->paired == value)
1874
device->paired = value;
1550
1876
emit_property_changed(conn, device->path, DEVICE_INTERFACE, "Paired",
1551
1877
DBUS_TYPE_BOOLEAN, &value);
1632
error("%s", err->message);
1633
error_connection_attempt_failed(device->bonding->conn,
1634
device->bonding->msg,
1944
/* Wait proper error to be propagated by bonding complete */
1639
1947
if (!bt_io_get(io, BT_IO_L2RAW, &err,
1640
1948
BT_IO_OPT_HANDLE, &handle,
1641
1949
BT_IO_OPT_INVALID)) {
1642
1950
error("Unable to get connection handle: %s", err->message);
1643
error_connection_attempt_failed(device->bonding->conn,
1644
device->bonding->msg,
1646
1951
g_error_free(err);
1650
dd = hci_open_dev(adapter_get_dev_id(device->adapter));
1652
DBusMessage *reply = no_such_adapter(device->bonding->msg);
1653
g_dbus_send_message(device->bonding->conn, reply);
1657
memset(&rp, 0, sizeof(rp));
1659
memset(&cp, 0, sizeof(cp));
1660
cp.handle = htobs(handle);
1662
memset(&rq, 0, sizeof(rq));
1663
rq.ogf = OGF_LINK_CTL;
1664
rq.ocf = OCF_AUTH_REQUESTED;
1666
rq.clen = AUTH_REQUESTED_CP_SIZE;
1668
rq.rlen = EVT_CMD_STATUS_SIZE;
1669
rq.event = EVT_CMD_STATUS;
1671
if (hci_send_req(dd, &rq, HCI_REQ_TIMEOUT) < 0) {
1672
error("Unable to send HCI request: %s (%d)",
1673
strerror(errno), errno);
1674
error_failed_errno(device->bonding->conn, device->bonding->msg,
1681
error("HCI_Authentication_Requested failed with status 0x%02x",
1683
error_failed_errno(device->bonding->conn, device->bonding->msg,
1684
bt_error(rp.status));
1691
device->bonding->io_id = g_io_add_watch(io,
1692
G_IO_NVAL | G_IO_HUP | G_IO_ERR,
1693
bonding_io_cb, device);
1955
if (btd_adapter_request_authentication(device->adapter, handle) < 0)
1698
1961
g_io_channel_shutdown(io, TRUE, NULL);
1701
device->bonding->io_id = 0;
1702
bonding_request_free(device->bonding, FALSE);
1962
device_cancel_bonding(device, HCI_UNSPECIFIED_ERROR);
1705
1965
static void create_bond_req_exit(DBusConnection *conn, void *user_data)
1707
1967
struct btd_device *device = user_data;
1709
debug("%s: requestor exited before bonding was completed", device->path);
1970
ba2str(&device->bdaddr, addr);
1971
DBG("%s: requestor exited before bonding was completed", addr);
1711
1973
if (device->authr)
1712
1974
device_cancel_authentication(device, FALSE);
1714
1976
if (device->bonding) {
1715
1977
device->bonding->listener_id = 0;
1716
bonding_request_free(device->bonding, TRUE);
1978
device_request_disconnect(device, NULL);
1830
2104
device_browse(device, bonding->conn, bonding->msg,
1832
} else if (!device->discov_active && !device->discov_timer &&
1833
main_opts.reverse_sdp) {
1834
/* If we are not initiators and there is no currently active
1835
* discovery or discovery timer, set the discovery timer */
1836
debug("setting timer for reverse service discovery");
1837
device->discov_timer = g_timeout_add_seconds(DISCOVERY_TIMER,
2107
bonding_request_free(bonding);
2109
if (!device->browse && !device->discov_timer &&
2110
main_opts.reverse_sdp) {
2111
/* If we are not initiators and there is no currently
2112
* active discovery or discovery timer, set discovery
2114
DBG("setting timer for reverse service discovery");
2115
device->discov_timer = g_timeout_add_seconds(
1842
2122
device_set_paired(device, TRUE);
1844
bonding_request_free(bonding, TRUE);
1849
device_cancel_bonding(device, status);
2125
gboolean device_is_creating(struct btd_device *device, const char *sender)
2129
if (device->bonding && device->bonding->msg)
2130
msg = device->bonding->msg;
2131
else if (device->browse && device->browse->msg)
2132
msg = device->browse->msg;
2136
if (!dbus_message_is_method_call(msg, ADAPTER_INTERFACE,
2137
"CreatePairedDevice") &&
2138
!dbus_message_is_method_call(msg, ADAPTER_INTERFACE,
2145
return g_str_equal(sender, dbus_message_get_sender(msg));
1852
2148
gboolean device_is_bonding(struct btd_device *device, const char *sender)
1878
2176
reply = new_authentication_return(bonding->msg, status);
1879
2177
g_dbus_send_message(bonding->conn, reply);
1881
bonding_request_free(bonding, TRUE);
2179
bonding_request_cancel(bonding);
2180
bonding_request_free(bonding);
1884
static void pincode_cb(struct agent *agent, DBusError *err, const char *pincode,
2183
static void pincode_cb(struct agent *agent, DBusError *err,
2184
const char *pincode, void *data)
1887
2186
struct authentication_req *auth = data;
1888
2187
struct btd_device *device = auth->device;
1890
2189
/* No need to reply anything if the authentication already failed */
2190
if (auth->cb == NULL)
1894
2193
((agent_pincode_cb) auth->cb)(agent, err, pincode, device);
2195
device->authr->cb = NULL;
2196
device->authr->agent = NULL;
1899
2199
static void confirm_cb(struct agent *agent, DBusError *err, void *data)
1902
2202
struct btd_device *device = auth->device;
1904
2204
/* No need to reply anything if the authentication already failed */
2205
if (auth->cb == NULL)
1908
2208
((agent_cb) auth->cb)(agent, err, device);
2210
device->authr->cb = NULL;
2211
device->authr->agent = NULL;
1913
static void passkey_cb(struct agent *agent, DBusError *err, uint32_t passkey,
2214
static void passkey_cb(struct agent *agent, DBusError *err,
2215
uint32_t passkey, void *data)
1916
2217
struct authentication_req *auth = data;
1917
2218
struct btd_device *device = auth->device;
1919
2220
/* No need to reply anything if the authentication already failed */
2221
if (auth->cb == NULL)
1923
2224
((agent_passkey_cb) auth->cb)(agent, err, passkey, device);
2226
device->authr->cb = NULL;
2227
device->authr->agent = NULL;
1928
2230
int device_request_authentication(struct btd_device *device, auth_type_t type,
1929
uint32_t passkey, void *cb)
2231
uint32_t passkey, void *cb)
1931
2233
struct authentication_req *auth;
1932
2234
struct agent *agent;
1935
debug("%s: requesting agent authentication", device->path);
1937
agent = device->agent;
1940
agent = adapter_get_agent(device->adapter);
2238
ba2str(&device->bdaddr, addr);
2239
DBG("Requesting agent authentication for %s", addr);
2241
if (device->authr) {
2242
error("Authentication already requested for %s", addr);
2246
agent = device_get_agent(device);
1943
error("No agent available for %u request", type);
2248
error("No agent available for request type %d", type);
1954
2259
switch (type) {
1955
2260
case AUTH_TYPE_PINCODE:
1956
ret = agent_request_pincode(agent, device, pincode_cb,
2261
err = agent_request_pincode(agent, device, pincode_cb,
1959
2264
case AUTH_TYPE_PASSKEY:
1960
ret = agent_request_passkey(agent, device, passkey_cb,
2265
err = agent_request_passkey(agent, device, passkey_cb,
1963
2268
case AUTH_TYPE_CONFIRM:
1964
ret = agent_request_confirmation(agent, device, passkey,
2269
err = agent_request_confirmation(agent, device, passkey,
2270
confirm_cb, auth, NULL);
1967
2272
case AUTH_TYPE_NOTIFY:
1968
ret = agent_display_passkey(agent, device, passkey);
2273
err = agent_display_passkey(agent, device, passkey);
1970
2275
case AUTH_TYPE_AUTO:
1978
2283
error("Failed requesting authentication");
1980
2285
device->authr = NULL;
1986
2291
static void cancel_authentication(struct authentication_req *auth)
1988
struct btd_device *device = auth->device;
1989
struct agent *agent = auth->agent;
2293
struct btd_device *device;
2294
struct agent *agent;
2297
if (!auth || !auth->cb)
2300
device = auth->device;
2301
agent = auth->agent;
1995
2303
dbus_error_init(&err);
1996
2304
dbus_set_error_const(&err, "org.bluez.Error.Canceled", NULL);