diff options
Diffstat (limited to 'src/adapter.c')
-rw-r--r-- | src/adapter.c | 61 |
1 files changed, 50 insertions, 11 deletions
diff --git a/src/adapter.c b/src/adapter.c index 18b03313..a22112c8 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -457,8 +457,8 @@ static DBusMessage *set_mode(DBusConnection *conn, DBusMessage *msg, return no_such_adapter(msg); if (!adapter->up && - (hcid.offmode == HCID_OFFMODE_NOSCAN || - (hcid.offmode == HCID_OFFMODE_DEVDOWN && + (main_opts.offmode == HCID_OFFMODE_NOSCAN || + (main_opts.offmode == HCID_OFFMODE_DEVDOWN && scan_enable != SCAN_DISABLED))) { /* Start HCI device */ if (ioctl(dd, HCIDEVUP, adapter->dev_id) == 0) @@ -475,7 +475,7 @@ static DBusMessage *set_mode(DBusConnection *conn, DBusMessage *msg, } if (adapter->up && scan_enable == SCAN_DISABLED && - hcid.offmode == HCID_OFFMODE_DEVDOWN) { + main_opts.offmode == HCID_OFFMODE_DEVDOWN) { if (ioctl(dd, HCIDEVDOWN, adapter->dev_id) < 0) { hci_close_dev(dd); return failed_strerror(msg, errno); @@ -1375,7 +1375,7 @@ static DBusMessage *adapter_discover_devices(DBusConnection *conn, if ((adapter->state & STD_INQUIRY) || (adapter->state & PERIODIC_INQUIRY)) goto done; - if (default_device.inqmode) + if (main_opts.inqmode) err = start_inquiry(adapter); else err = start_periodic_inquiry(adapter); @@ -2389,22 +2389,61 @@ static void load_drivers(struct adapter *adapter) } } +static int get_discoverable_timeout(const char *src) +{ + int timeout; + + if (read_discoverable_timeout(src, &timeout) == 0) + return timeout; + + return main_opts.discovto; +} + static void adapter_up(struct adapter *adapter, int dd) { struct hci_conn_list_req *cl = NULL; struct hci_conn_info *ci; - const char *mode; + const char *pmode; + char mode[14]; int i; adapter->up = 1; - adapter->discov_timeout = get_discoverable_timeout(adapter->dev_id); + adapter->discov_timeout = get_discoverable_timeout(adapter->address); adapter->state = DISCOVER_TYPE_NONE; - adapter->scan_mode = get_startup_scan(adapter->dev_id); + /* Set scan mode */ + if (read_device_mode(adapter->address, mode, sizeof(mode)) == 0) { + if (!strcmp(mode, "off") && main_opts.offmode == HCID_OFFMODE_NOSCAN) { + adapter->mode = MODE_OFF; + adapter->scan_mode= SCAN_DISABLED; + } else if (!strcmp(mode, "connectable")) { + adapter->mode = MODE_CONNECTABLE; + adapter->scan_mode = SCAN_PAGE; + } else if (!strcmp(mode, "discoverable")) { + /* Set discoverable only if timeout is 0 */ + if (adapter->discov_timeout == 0) { + adapter->mode = MODE_DISCOVERABLE; + adapter->scan_mode = SCAN_PAGE | SCAN_INQUIRY; + } else { + adapter->mode = MODE_CONNECTABLE; + adapter->scan_mode = SCAN_PAGE; + } + } else if (!strcmp(mode, "limited")) { + /* Set discoverable only if timeout is 0 */ + if (adapter->discov_timeout == 0) { + adapter->mode = MODE_LIMITED; + adapter->scan_mode = SCAN_PAGE | SCAN_INQUIRY; + } else { + adapter->mode = MODE_CONNECTABLE; + adapter->scan_mode = SCAN_PAGE; + + } + } + } + hci_send_cmd(dd, OGF_HOST_CTL, OCF_WRITE_SCAN_ENABLE, 1, &adapter->scan_mode); - adapter->mode = get_startup_mode(adapter->dev_id); if (adapter->mode == MODE_LIMITED) set_limited_discoverable(dd, adapter->dev.class, TRUE); @@ -2426,11 +2465,11 @@ static void adapter_up(struct adapter *adapter, int dd) } g_free(cl); - mode = mode2str(adapter->mode); + pmode = mode2str(adapter->mode); dbus_connection_emit_property_changed(connection, adapter->path, ADAPTER_INTERFACE, "Mode", - DBUS_TYPE_STRING, &mode); + DBUS_TYPE_STRING, &pmode); load_drivers(adapter); load_devices(adapter); @@ -2896,7 +2935,7 @@ void adapter_set_state(struct adapter *adapter, int state) if (adapter->scheduler_id) goto done; } else if (adapter->disc_sessions && adapter->state & STD_INQUIRY) { - adapter->scheduler_id = g_timeout_add(default_device.inqmode * 1000, + adapter->scheduler_id = g_timeout_add(main_opts.inqmode * 1000, (GSourceFunc) start_inquiry, adapter); goto done; } |