diff --git a/src/sdp-client.c b/src/sdp-client.c
index b6a3663..f9412f0 100644
--- a/src/sdp-client.c
+++ b/src/sdp-client.c
bdaddr_t dst;
sdp_session_t *session;
guint timer;
+ guint io_id;
};
static GSList *cached_sdp_sessions = NULL;
{
struct cached_sdp_session *cached = user_data;
+ g_source_remove(cached->io_id);
cleanup_cached_session(cached);
return FALSE;
continue;
g_source_remove(c->timer);
+ g_source_remove(c->io_id);
session = c->session;
return NULL;
}
+static gboolean disconnect_watch(GIOChannel *chan, GIOCondition cond,
+ gpointer user_data)
+{
+ struct cached_sdp_session *cached = user_data;
+
+ g_source_remove(cached->timer);
+ cleanup_cached_session(cached);
+
+ return FALSE;
+}
+
static void cache_sdp_session(bdaddr_t *src, bdaddr_t *dst,
sdp_session_t *session)
{
struct cached_sdp_session *cached;
+ int sk;
+ GIOChannel *chan;
cached = g_new0(struct cached_sdp_session, 1);
cached->timer = g_timeout_add_seconds(CACHE_TIMEOUT,
cached_session_expired,
cached);
+
+ /* Watch the connection state during cache timeout */
+ sk = sdp_get_socket(session);
+ chan = g_io_channel_unix_new(sk);
+
+ cached->io_id = g_io_add_watch(chan, G_IO_HUP | G_IO_ERR | G_IO_NVAL,
+ disconnect_watch, cached);
}
struct search_context {