diff options
-rw-r--r-- | hcid/adapter.c | 22 | ||||
-rw-r--r-- | hcid/adapter.h | 2 | ||||
-rw-r--r-- | hcid/dbus-api.txt | 6 | ||||
-rw-r--r-- | hcid/hcid.h | 1 | ||||
-rw-r--r-- | hcid/storage.c | 21 |
5 files changed, 49 insertions, 3 deletions
diff --git a/hcid/adapter.c b/hcid/adapter.c index cddffcde..496d13d3 100644 --- a/hcid/adapter.c +++ b/hcid/adapter.c @@ -248,7 +248,20 @@ const char *mode2str(uint8_t mode) } } -uint8_t str2mode(const char *mode) +static uint8_t on_mode(const char *addr) +{ + char mode[14]; + bdaddr_t sba; + + str2ba(addr, &sba); + + if (read_on_mode(&sba, mode, sizeof(mode)) < 0) + return MODE_CONNECTABLE; + + return str2mode(addr, mode); +} + +uint8_t str2mode(const char *addr, const char *mode) { if (strcasecmp("off", mode) == 0) return MODE_OFF; @@ -258,6 +271,8 @@ uint8_t str2mode(const char *mode) return MODE_DISCOVERABLE; else if (strcasecmp("limited", mode) == 0) return MODE_LIMITED; + else if (strcasecmp("on", mode) == 0) + return on_mode(addr); else return MODE_UNKNOWN; } @@ -531,7 +546,7 @@ static DBusHandlerResult adapter_set_mode(DBusConnection *conn, if (!mode) return error_invalid_arguments(conn, msg); - new_mode = str2mode(mode); + new_mode = str2mode(adapter->address, mode); switch(new_mode) { case MODE_OFF: scan_enable = SCAN_DISABLED; @@ -547,6 +562,9 @@ static DBusHandlerResult adapter_set_mode(DBusConnection *conn, return error_invalid_arguments(conn, msg); } + /* Do reverse resolution in case of "on" mode */ + mode = mode2str(new_mode); + dd = hci_open_dev(adapter->dev_id); if (dd < 0) return error_no_such_adapter(conn, msg); diff --git a/hcid/adapter.h b/hcid/adapter.h index 6ffc6bcc..dc70119b 100644 --- a/hcid/adapter.h +++ b/hcid/adapter.h @@ -115,6 +115,8 @@ const char *minor_class_str(uint32_t class); const char *mode2str(uint8_t mode); +uint8_t str2mode(const char *addr, const char *mode); + GSList *service_classes_str(uint32_t class); int pending_remote_name_cancel(struct adapter *adapter); diff --git a/hcid/dbus-api.txt b/hcid/dbus-api.txt index de604302..9a29916d 100644 --- a/hcid/dbus-api.txt +++ b/hcid/dbus-api.txt @@ -380,7 +380,11 @@ Methods dict GetInfo() void SetMode(string mode) Sets mode of the adapter. See GetMode for valid strings - for the mode parameter. + for the mode parameter. In addition to the valid strings + for GetMode, this method also supports a special + parameter value "on" which will change the mode to the + previous non-off mode (or do nothing if the current + mode isn't "off"). Possible errors: org.bluez.Error.NoSuchAdapter org.bluez.Error.Failed diff --git a/hcid/hcid.h b/hcid/hcid.h index b096d264..4da1bdb7 100644 --- a/hcid/hcid.h +++ b/hcid/hcid.h @@ -182,6 +182,7 @@ int write_discoverable_timeout(bdaddr_t *bdaddr, int timeout); int read_discoverable_timeout(bdaddr_t *bdaddr, int *timeout); int write_device_mode(bdaddr_t *bdaddr, const char *mode); int read_device_mode(bdaddr_t *bdaddr, char *mode, int length); +int read_on_mode(bdaddr_t *bdaddr, char *mode, int length); int write_local_name(bdaddr_t *bdaddr, char *name); int read_local_name(bdaddr_t *bdaddr, char *name); int write_local_class(bdaddr_t *bdaddr, uint8_t *class); diff --git a/hcid/storage.c b/hcid/storage.c index 68f3470c..f2254cc3 100644 --- a/hcid/storage.c +++ b/hcid/storage.c @@ -94,6 +94,9 @@ int write_device_mode(bdaddr_t *bdaddr, const char *mode) create_file(filename, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); + if (strcmp(mode, "off") != 0) + textfile_put(filename, "on", mode); + return textfile_put(filename, "mode", mode); } @@ -115,6 +118,24 @@ int read_device_mode(bdaddr_t *bdaddr, char *mode, int length) return 0; } +int read_on_mode(bdaddr_t *bdaddr, char *mode, int length) +{ + char filename[PATH_MAX + 1], *str; + + create_filename(filename, PATH_MAX, bdaddr, "config"); + + str = textfile_get(filename, "on"); + if (!str) + return -ENOENT; + + strncpy(mode, str, length); + mode[length - 1] = '\0'; + + free(str); + + return 0; +} + int write_local_name(bdaddr_t *bdaddr, char *name) { char filename[PATH_MAX + 1], str[249]; |