diff --git a/src/adapter.c b/src/adapter.c
index 0e97e57..55f03a4 100644
--- a/src/adapter.c
+++ b/src/adapter.c
sdp_list_t *services; /* Services associated to adapter */
bool connectable; /* connectable state */
+ bool toggle_discoverable; /* discoverable needs to be changed */
gboolean discoverable; /* discoverable state */
gboolean pairable; /* pairable state */
gboolean initialized;
char filename[PATH_MAX + 1];
char address[18];
GError *gerr = NULL;
+ gboolean stored_discoverable;
ba2str(&adapter->bdaddr, address);
}
/* Get discoverable mode */
- adapter->discoverable = g_key_file_get_boolean(key_file, "General",
+ stored_discoverable = g_key_file_get_boolean(key_file, "General",
"Discoverable", &gerr);
if (gerr) {
- adapter->discoverable = FALSE;
+ stored_discoverable = FALSE;
g_error_free(gerr);
gerr = NULL;
}
gerr = NULL;
}
- mgmt_set_connectable(adapter->dev_id, TRUE);
+ if (!adapter->connectable)
+ mgmt_set_connectable(adapter->dev_id, TRUE);
- if (adapter->discov_timeout > 0) {
- /* Ensure that discoverable mode is off */
- mgmt_set_discoverable(adapter->dev_id, FALSE, 0);
- } else
- mgmt_set_discoverable(adapter->dev_id, adapter->discoverable,
+ if (adapter->discov_timeout > 0 && adapter->discoverable) {
+ if (adapter->connectable)
+ mgmt_set_discoverable(adapter->dev_id, FALSE, 0);
+ else
+ adapter->toggle_discoverable = true;
+ } else if (stored_discoverable != adapter->discoverable) {
+ if (adapter->connectable)
+ mgmt_set_discoverable(adapter->dev_id,
+ adapter->discoverable,
adapter->discov_timeout);
+ else
+ adapter->toggle_discoverable = true;
+ }
g_key_file_free(key_file);
}
-gboolean adapter_init(struct btd_adapter *adapter, gboolean powered)
+gboolean adapter_init(struct btd_adapter *adapter, gboolean powered,
+ bool connectable, bool discoverable)
{
struct agent *agent;
adapter->powered = powered;
+ adapter->connectable = connectable;
+ adapter->discoverable = discoverable;
adapter->allow_name_changes = TRUE;
if (adapter->connectable == connectable)
return;
+ if (adapter->toggle_discoverable) {
+ DBG("toggling discoverable from %u to %u",
+ adapter->discoverable, !adapter->discoverable);
+ mgmt_set_discoverable(adapter->dev_id, !adapter->discoverable,
+ adapter->discov_timeout);
+ adapter->toggle_discoverable = false;
+ }
+
adapter->connectable = connectable;
g_dbus_emit_property_changed(conn, adapter->path, ADAPTER_INTERFACE,
"Connectable");
diff --git a/src/adapter.h b/src/adapter.h
index 89910cc..d35b8db 100644
--- a/src/adapter.h
+++ b/src/adapter.h
gboolean remove_storage);
struct btd_adapter *adapter_create(int id);
-gboolean adapter_init(struct btd_adapter *adapter, gboolean powered);
+gboolean adapter_init(struct btd_adapter *adapter, gboolean powered,
+ bool connectable, bool discoverable);
void adapter_remove(struct btd_adapter *adapter);
void adapter_set_allow_name_changes(struct btd_adapter *adapter,
gboolean allow_name_changes);
diff --git a/src/manager.c b/src/manager.c
index 8b55711..1b83114 100644
--- a/src/manager.c
+++ b/src/manager.c
return adapters;
}
-struct btd_adapter *btd_manager_register_adapter(int id, gboolean powered)
+struct btd_adapter *btd_manager_register_adapter(int id, gboolean powered,
+ bool connectable,
+ bool discoverable)
{
struct btd_adapter *adapter;
const char *path;
adapters = g_slist_append(adapters, adapter);
- if (!adapter_init(adapter, powered)) {
+ if (!adapter_init(adapter, powered, connectable, discoverable)) {
adapters = g_slist_remove(adapters, adapter);
btd_adapter_unref(adapter);
return NULL;
diff --git a/src/manager.h b/src/manager.h
index a2b8c31..7311ce3 100644
--- a/src/manager.h
+++ b/src/manager.h
struct btd_adapter *manager_get_default_adapter(void);
void manager_foreach_adapter(adapter_cb func, gpointer user_data);
GSList *manager_get_adapters(void);
-struct btd_adapter *btd_manager_register_adapter(int id, gboolean powered);
+struct btd_adapter *btd_manager_register_adapter(int id, gboolean powered,
+ bool connectable,
+ bool discoverable);
int btd_manager_unregister_adapter(int id);
diff --git a/src/mgmt.c b/src/mgmt.c
index 798435f..03ec049 100644
--- a/src/mgmt.c
+++ b/src/mgmt.c
clear_uuids(index);
adapter = btd_manager_register_adapter(index,
- mgmt_powered(info->current_settings));
+ mgmt_powered(info->current_settings),
+ mgmt_connectable(info->current_settings),
+ mgmt_discoverable(info->current_settings));
+
if (adapter == NULL) {
error("mgmt: unable to register adapter");
return;