diff --git a/src/device.c b/src/device.c
index 30c67c0..5028b24 100644
--- a/src/device.c
+++ b/src/device.c
gint ref;
GIOChannel *att_io;
+ guint cleanup_id;
};
static uint16_t uuid_list[] = {
bt_cancel_discovery(&src, &device->bdaddr);
- if (device->att_io != NULL) {
+ if (device->cleanup_id) {
+ g_source_remove(device->cleanup_id);
+ device->cleanup_id = 0;
+ }
+
+ if (device->att_io) {
g_io_channel_shutdown(device->att_io, FALSE, NULL);
g_io_channel_unref(device->att_io);
device->att_io = NULL;
g_slist_free_full(device->attios, g_free);
g_slist_free_full(device->attios_offline, g_free);
+ if (device->cleanup_id)
+ g_source_remove(device->cleanup_id);
+
g_attrib_unref(device->attrib);
if (device->tmp_records)
static gboolean att_connect(gpointer user_data);
-static void attrib_disconnected(gpointer user_data)
+static gboolean attrib_disconnected_cb(GIOChannel *io, GIOCondition cond,
+ gpointer user_data)
{
struct btd_device *device = user_data;
- GIOChannel *io;
int sock, err = 0;
socklen_t len;
if (device->browse)
goto done;
- io = g_attrib_get_channel(device->attrib);
sock = g_io_channel_unix_get_fd(io);
len = sizeof(err);
getsockopt(sock, SOL_SOCKET, SO_ERROR, &err, &len);
device->attachid = 0;
g_attrib_unref(device->attrib);
device->attrib = NULL;
+
+ device->cleanup_id = 0;
+
+ return FALSE;
}
static void primary_cb(GSList *services, guint8 status, gpointer user_data)
if (device->attios == NULL && device->attios_offline == NULL) {
attrib_channel_detach(device->attrib, device->attachid);
+ g_source_remove(device->cleanup_id);
+ device->cleanup_id = 0;
device->attachid = 0;
g_attrib_unref(device->attrib);
device->attrib = NULL;
error("Attribute server attach failure!");
device->attrib = attrib;
- g_attrib_set_disconnect_function(device->attrib,
- attrib_disconnected, device);
+ device->cleanup_id = g_io_add_watch(io, G_IO_HUP,
+ attrib_disconnected_cb, device);
if (attcb->success)
attcb->success(user_data);
device->attachid = 0;
}
+ g_source_remove(device->cleanup_id);
+ device->cleanup_id = 0;
+
if (device->attrib) {
g_attrib_unref(device->attrib);
device->attrib = NULL;