static int hid_device_probe(struct btd_device *device, GSList *uuids) { struct btd_adapter *adapter = device_get_adapter(device); const gchar *path = device_get_path(device); const sdp_record_t *rec = btd_device_get_record(device, uuids->data); bdaddr_t src, dst; sdp_data_t *pdlist; DBG("path %s", path); if (!rec) return -1; adapter_get_address(adapter, &src); device_get_address(device, &dst); if (rec) pdlist = sdp_data_get(rec, SDP_ATTR_HID_SDP_DISABLE); if (pdlist && pdlist->val.uint8) { DBG("cancel discovery is issued"); bt_cancel_discovery(&src, &dst); } return input_device_register(connection, device, path, &src, &dst, HID_UUID, rec->handle, idle_timeout * 60); }
static int port_release(struct serial_port *port) { struct rfcomm_dev_req req; int rfcomm_ctl; int err = 0; if (port->id < 0) { if (port->io) { g_io_channel_shutdown(port->io, TRUE, NULL); g_io_channel_unref(port->io); port->io = NULL; } else bt_cancel_discovery(&port->device->src, &port->device->dst); return 0; } debug("Serial port %s released", port->dev); rfcomm_ctl = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_RFCOMM); if (rfcomm_ctl < 0) return -errno; if (port->fd >= 0) { close(port->fd); port->fd = -1; } memset(&req, 0, sizeof(req)); req.dev_id = port->id; /* * We are hitting a kernel bug inside RFCOMM code when * RFCOMM_HANGUP_NOW bit is set on request's flags passed to * ioctl(RFCOMMRELEASEDEV)! */ req.flags = (1 << RFCOMM_HANGUP_NOW); if (ioctl(rfcomm_ctl, RFCOMMRELEASEDEV, &req) < 0) { err = errno; error("Can't release device %s: %s (%d)", port->dev, strerror(err), err); } g_free(port->dev); port->dev = NULL; port->id = -1; close(rfcomm_ctl); return -err; }
static void ext_io_destroy(gpointer p) { struct ext_io *ext_io = p; struct ext_profile *ext = ext_io->ext; if (ext_io->io_id > 0) g_source_remove(ext_io->io_id); if (ext_io->io) { g_io_channel_shutdown(ext_io->io, FALSE, NULL); g_io_channel_unref(ext_io->io); } if (ext_io->auth_id != 0) btd_cancel_authorization(ext_io->auth_id); if (ext_io->new_conn) { dbus_pending_call_cancel(ext_io->new_conn); dbus_pending_call_unref(ext_io->new_conn); ext_cancel(ext); } if (ext_io->resolving) bt_cancel_discovery(adapter_get_address(ext_io->adapter), device_get_address(ext_io->device)); if (ext_io->rec_handle) remove_record_from_server(ext_io->rec_handle); if (ext_io->adapter) btd_adapter_unref(ext_io->adapter); if (ext_io->device) btd_device_unref(ext_io->device); g_free(ext_io); }