bt_destroy_t destroy;
gpointer user_data;
uuid_t uuid;
+ guint io_id;
};
static GSList *context_list = NULL;
int sk, err = 0;
sk = g_io_channel_unix_get_fd(chan);
+ ctxt->io_id = 0;
len = sizeof(err);
if (getsockopt(sk, SOL_SOCKET, SO_ERROR, &err, &len) < 0) {
(*ctxt)->uuid = *uuid;
chan = g_io_channel_unix_new(sdp_get_socket(s));
- g_io_add_watch(chan, G_IO_OUT | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
- connect_watch, *ctxt);
+ (*ctxt)->io_id = g_io_add_watch(chan,
+ G_IO_OUT | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
+ connect_watch, *ctxt);
g_io_channel_unref(chan);
return 0;
if (!ctxt->session)
return -ENOTCONN;
- close(ctxt->session->sock);
+ if (ctxt->io_id)
+ g_source_remove(ctxt->io_id);
+
+ sdp_close(ctxt->session);
+
+ search_context_cleanup(ctxt);
return 0;
}
return invalid_args(msg);
}
+static void browse_req_free(struct browse_req *req)
+{
+ struct btd_device *device = req->device;
+
+ device->discov_active = 0;
+
+ if (device->discov_requestor) {
+ g_dbus_remove_watch(req->conn, device->discov_listener);
+ device->discov_listener = 0;
+ g_free(device->discov_requestor);
+ device->discov_requestor = NULL;
+ }
+
+ if (req->msg)
+ dbus_message_unref(req->msg);
+ if (req->conn)
+ dbus_connection_unref(req->conn);
+ g_slist_foreach(req->profiles_added, (GFunc) g_free, NULL);
+ g_slist_free(req->profiles_added);
+ g_slist_free(req->profiles_removed);
+ if (req->records)
+ sdp_list_free(req->records, (sdp_free_func_t) sdp_record_free);
+ g_free(req);
+}
+
static void discover_services_req_exit(DBusConnection *conn, void *user_data)
{
- struct btd_device *device = user_data;
+ struct browse_req *req = user_data;
+ struct btd_device *device = req->device;
struct btd_adapter *adapter = device->adapter;
bdaddr_t src;
debug("DiscoverDevices requestor exited");
bt_cancel_discovery(&src, &device->bdaddr);
+
+ browse_req_free(req);
}
static DBusMessage *discover_services(DBusConnection *conn,
g_free(str);
}
-static void browse_req_free(struct browse_req *req)
-{
- struct btd_device *device = req->device;
-
- device->discov_active = 0;
-
- if (device->discov_requestor) {
- g_dbus_remove_watch(req->conn, device->discov_listener);
- device->discov_listener = 0;
- g_free(device->discov_requestor);
- device->discov_requestor = NULL;
- }
-
- if (req->msg)
- dbus_message_unref(req->msg);
- if (req->conn)
- dbus_connection_unref(req->conn);
- g_slist_foreach(req->profiles_added, (GFunc) g_free, NULL);
- g_slist_free(req->profiles_added);
- g_slist_free(req->profiles_removed);
- if (req->records)
- sdp_list_free(req->records, (sdp_free_func_t) sdp_record_free);
- g_free(req);
-}
-
static void search_cb(sdp_list_t *recs, int err, gpointer user_data)
{
struct browse_req *req = user_data;
device->discov_listener = g_dbus_add_disconnect_watch(conn,
sender,
discover_services_req_exit,
- device, NULL);
+ req, NULL);
}
err = bt_search_service(&src, &device->bdaddr,