diff --git a/src/device.c b/src/device.c
index ab21b3a..2196cd4 100644
--- a/src/device.c
+++ b/src/device.c
DBusConnection *conn;
DBusMessage *msg;
GAttrib *attrib;
+ GIOChannel *io;
struct btd_device *device;
GSList *match_uuids;
GSList *profiles_added;
static GSList *device_drivers = NULL;
-static void browse_request_free(struct browse_req *req)
+static void browse_request_free(struct browse_req *req, gboolean shutdown)
{
if (req->listener_id)
g_dbus_remove_watch(req->conn, req->listener_id);
+ if (req->io) {
+ if (shutdown)
+ g_io_channel_shutdown(req->io, FALSE, NULL);
+ g_io_channel_unref(req->io);
+ }
if (req->msg)
dbus_message_unref(req->msg);
if (req->conn)
bt_cancel_discovery(&src, &device->bdaddr);
device->browse = NULL;
- browse_request_free(req);
+ browse_request_free(req, TRUE);
}
static void device_free(gpointer user_data)
}
device->browse = NULL;
- browse_request_free(req);
+ browse_request_free(req, FALSE);
}
static void browse_cb(sdp_list_t *recs, int err, gpointer user_data)
struct browse_req *req = user_data;
struct btd_device *device = req->device;
GSList *l, *uuids = NULL;
+ gboolean shutdown;
if (status) {
DBusMessage *reply;
reply = btd_error_failed(req->msg, att_ecode2str(status));
g_dbus_send_message(req->conn, reply);
+ shutdown = TRUE;
goto done;
}
create_device_reply(device, req);
store_services(device);
+ shutdown = FALSE;
done:
device->browse = NULL;
- browse_request_free(req);
+ browse_request_free(req, shutdown);
}
static void gatt_connect_cb(GIOChannel *io, GError *gerr, gpointer user_data)
g_dbus_send_message(req->conn, reply);
device->browse = NULL;
- browse_request_free(req);
+ browse_request_free(req, TRUE);
return;
}
struct btd_adapter *adapter = device->adapter;
struct browse_req *req;
BtIOSecLevel sec_level;
- GIOChannel *io;
bdaddr_t src;
if (device->browse)
sec_level = secure ? BT_IO_SEC_HIGH : BT_IO_SEC_LOW;
- io = bt_io_connect(BT_IO_L2CAP, gatt_connect_cb, req, NULL, NULL,
+ req->io = bt_io_connect(BT_IO_L2CAP, gatt_connect_cb, req, NULL, NULL,
BT_IO_OPT_SOURCE_BDADDR, &src,
BT_IO_OPT_DEST_BDADDR, &device->bdaddr,
BT_IO_OPT_CID, ATT_CID,
BT_IO_OPT_SEC_LEVEL, sec_level,
BT_IO_OPT_INVALID);
- if (io == NULL ) {
- browse_request_free(req);
+ if (req->io == NULL) {
+ browse_request_free(req, FALSE);
return -EIO;
}
err = bt_search_service(&src, &device->bdaddr, &uuid, cb, req, NULL);
if (err < 0) {
- browse_request_free(req);
+ browse_request_free(req, FALSE);
return err;
}