diff --git a/plugins/neard.c b/plugins/neard.c
index 2da5024..8018977 100644
--- a/plugins/neard.c
+++ b/plugins/neard.c
if (btd_adapter_check_oob_handler(adapter))
return -EINPROGRESS;
- btd_adapter_get_mode(adapter, NULL, NULL, NULL, &pairable);
+ btd_adapter_get_mode(adapter, NULL, NULL, &pairable);
if (!pairable || !adapter_get_agent(adapter))
return -ENOENT;
diff --git a/src/adapter.c b/src/adapter.c
index a91e9bb..a2a5da9 100644
--- a/src/adapter.c
+++ b/src/adapter.c
guint auto_timeout_id; /* Automatic connections timeout */
sdp_list_t *services; /* Services associated to adapter */
+ gboolean discoverable; /* discoverable state */
gboolean pairable; /* pairable state */
gboolean initialized;
}
}
-static uint8_t get_mode(const bdaddr_t *bdaddr, const char *mode)
+static uint8_t get_mode(const char *mode)
{
if (strcasecmp("off", mode) == 0)
return MODE_OFF;
return MODE_CONNECTABLE;
else if (strcasecmp("discoverable", mode) == 0)
return MODE_DISCOVERABLE;
- else if (strcasecmp("on", mode) == 0) {
- char onmode[14], srcaddr[18];
-
- ba2str(bdaddr, srcaddr);
- if (read_on_mode(srcaddr, onmode, sizeof(onmode)) < 0)
- return MODE_CONNECTABLE;
-
- return get_mode(bdaddr, onmode);
- } else
+ else
return MODE_UNKNOWN;
}
uint8_t mode;
int err;
- if (powered) {
- mode = get_mode(&adapter->bdaddr, "on");
- return set_discoverable(adapter, mode == MODE_DISCOVERABLE,
- id);
- }
+ if (powered)
+ return set_discoverable(adapter, adapter->discoverable, id);
mode = MODE_OFF;
if (!adapter->mode_sessions)
adapter->global_mode = adapter->mode;
- new_mode = get_mode(&adapter->bdaddr, "on");
+ if (adapter->discoverable)
+ new_mode = MODE_DISCOVERABLE;
+ else
+ new_mode = MODE_CONNECTABLE;
req = find_session(adapter->mode_sessions, sender);
if (req) {
}
void btd_adapter_get_mode(struct btd_adapter *adapter, uint8_t *mode,
- uint8_t *on_mode,
uint16_t *discoverable_timeout,
gboolean *pairable)
{
- char str[14], address[18];
+ char address[18];
ba2str(&adapter->bdaddr, address);
- if (mode) {
- if (main_opts.remember_powered == FALSE)
- *mode = main_opts.mode;
- else if (read_device_mode(address, str, sizeof(str)) == 0)
- *mode = get_mode(&adapter->bdaddr, str);
- else
- *mode = main_opts.mode;
- }
-
- if (on_mode)
- *on_mode = get_mode(&adapter->bdaddr, "on");
+ if (mode)
+ *mode = adapter->mode;
if (discoverable_timeout)
*discoverable_timeout = adapter->discov_timeout;
adapter->up = TRUE;
adapter->off_timer = 0;
- if (adapter->scan_mode & SCAN_INQUIRY)
+ if (adapter->scan_mode & SCAN_INQUIRY) {
adapter->mode = MODE_DISCOVERABLE;
- else
+ adapter->discoverable = TRUE;
+ } else {
adapter->mode = MODE_CONNECTABLE;
+ adapter->discoverable = FALSE;
+ }
g_dbus_emit_property_changed(btd_get_dbus_connection(), adapter->path,
ADAPTER_INTERFACE, "Powered");
{
char name[MAX_NAME_LENGTH + 1];
char address[18];
+ char mode[14];
int timeout;
ba2str(&adapter->bdaddr, address);
adapter->discov_timeout = main_opts.discovto;
else
adapter->discov_timeout = timeout;
+
+ /* Get mode */
+ if (main_opts.remember_powered == FALSE)
+ adapter->mode = main_opts.mode;
+ else if (read_device_mode(address, mode, sizeof(mode)) == 0)
+ adapter->mode = get_mode(mode);
+ else
+ adapter->mode = main_opts.mode;
+
+ /* Get on mode */
+ if (read_on_mode(address, mode, sizeof(mode)) == 0)
+ adapter->discoverable = (strcasecmp("discoverable", mode) == 0);
+ else
+ adapter->discoverable = (adapter->mode == MODE_DISCOVERABLE);
+
+ mgmt_set_connectable(adapter->dev_id, TRUE);
+ mgmt_set_discoverable(adapter->dev_id, adapter->discoverable,
+ adapter->discov_timeout);
}
gboolean adapter_init(struct btd_adapter *adapter, gboolean up)
break;
case SCAN_PAGE:
adapter->mode = MODE_CONNECTABLE;
+ adapter->discoverable = FALSE;
break;
case (SCAN_PAGE | SCAN_INQUIRY):
adapter->mode = MODE_DISCOVERABLE;
+ adapter->discoverable = TRUE;
break;
default:
/* ignore, reserved */
int btd_adapter_restore_powered(struct btd_adapter *adapter)
{
- char mode[14], address[18];
-
if (!main_opts.remember_powered)
return -EINVAL;
if (adapter->up)
return 0;
- ba2str(&adapter->bdaddr, address);
- if (read_device_mode(address, mode, sizeof(mode)) == 0 &&
- g_str_equal(mode, "off"))
+ if (adapter->mode == MODE_OFF)
return 0;
return mgmt_set_powered(adapter->dev_id, TRUE);
diff --git a/src/adapter.h b/src/adapter.h
index be69781..54f9ea7 100644
--- a/src/adapter.h
+++ b/src/adapter.h
int btd_adapter_stop(struct btd_adapter *adapter);
void btd_adapter_get_mode(struct btd_adapter *adapter, uint8_t *mode,
- uint8_t *on_mode,
uint16_t *discoverable_timeout,
gboolean *pairable);
diff --git a/src/mgmt.c b/src/mgmt.c
index f179dfa..8fe5100 100644
--- a/src/mgmt.c
+++ b/src/mgmt.c
return 0;
}
-static int mgmt_set_connectable(int index, gboolean connectable)
+int mgmt_set_connectable(int index, gboolean connectable)
{
DBG("index %d connectable %d", index, connectable);
return mgmt_set_mode(index, MGMT_OP_SET_CONNECTABLE, connectable);
{
struct controller_info *info;
gboolean pairable;
- uint8_t on_mode;
uint16_t index, discoverable_timeout;
DBG("new settings %x", settings);
- btd_adapter_get_mode(adapter, NULL, &on_mode, &discoverable_timeout,
- &pairable);
+ btd_adapter_get_mode(adapter, NULL, &discoverable_timeout, &pairable);
index = adapter_get_dev_id(adapter);
info = &controllers[index];
- if (on_mode == MODE_DISCOVERABLE && !mgmt_discoverable(settings)) {
- if(!mgmt_connectable(settings))
- mgmt_set_connectable(index, TRUE);
- mgmt_set_discoverable(index, TRUE, discoverable_timeout);
- } else if (on_mode == MODE_CONNECTABLE && !mgmt_connectable(settings)) {
- mgmt_set_connectable(index, TRUE);
- } else if (mgmt_powered(settings)) {
+ if (mgmt_powered(settings))
adapter_mode_changed(adapter, create_mode(settings));
- }
if (mgmt_pairable(settings) != pairable)
mgmt_set_pairable(index, pairable);
btd_adapter_get_major_minor(adapter, &major, &minor);
mgmt_set_dev_class(index, major, minor);
- btd_adapter_get_mode(adapter, &mode, NULL, NULL, NULL);
+ btd_adapter_get_mode(adapter, &mode, NULL, NULL);
if (mode == MODE_OFF && mgmt_powered(info->current_settings)) {
mgmt_set_powered(index, FALSE);
return;
diff --git a/src/mgmt.h b/src/mgmt.h
index a2c0497..daa168a 100644
--- a/src/mgmt.h
+++ b/src/mgmt.h
void mgmt_cleanup(void);
int mgmt_set_powered(int index, gboolean powered);
+int mgmt_set_connectable(int index, gboolean connectable);
int mgmt_set_discoverable(int index, gboolean discoverable, uint16_t timeout);
int mgmt_set_pairable(int index, gboolean pairable);
int mgmt_set_name(int index, const char *name);