summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2009-02-12 16:41:23 -0300
committerLuiz Augusto von Dentz <luiz.dentz@openbossa.org>2009-02-12 16:41:23 -0300
commit81fdab9c7eb725146a6de14b12cbd3fab2903625 (patch)
treefade6a0eccd52b0c5677ac12516b9604526ad505 /src
parent13fd71450abf7f4ac2d6b1d6c2c70b81b0796f80 (diff)
Fix not handling properly local name changes.
Changing adapter name via dbus was emitting PropertyChanged right away. This not only can cause consistency problems but also makes bluetoothd to not emit a PropertyChanged when a third application such as hciconfig changes the adapter name.
Diffstat (limited to 'src')
-rw-r--r--src/adapter.c29
-rw-r--r--src/adapter.h1
-rw-r--r--src/dbus-hci.c14
3 files changed, 33 insertions, 11 deletions
diff --git a/src/adapter.c b/src/adapter.c
index 08993858..4f35766b 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -814,6 +814,28 @@ static void update_ext_inquiry_response(int dd, struct hci_dev *dev)
strerror(errno), errno);
}
+void adapter_name_changed(struct btd_adapter *adapter, const char *name)
+{
+ struct hci_dev *dev = &adapter->dev;
+ int dd;
+
+ if (strncmp(name, (char *) dev->name, 248) == 0)
+ return;
+
+ write_local_name(&adapter->bdaddr, (char *) name);
+
+ strncpy((char *) dev->name, name, 248);
+
+ dd = hci_open_dev(adapter->dev_id);
+ if (dd >= 0) {
+ update_ext_inquiry_response(dd, dev);
+ hci_close_dev(dd);
+ }
+
+ emit_property_changed(connection, adapter->path, ADAPTER_INTERFACE,
+ "Name", DBUS_TYPE_STRING, &name);
+}
+
static int adapter_set_name(struct btd_adapter *adapter, const char *name)
{
struct hci_dev *dev = &adapter->dev;
@@ -854,7 +876,6 @@ static DBusMessage *set_name(DBusConnection *conn, DBusMessage *msg,
{
struct btd_adapter *adapter = data;
int ecode;
- const char *path;
if (!g_utf8_validate(name, -1, NULL)) {
error("Name change failed: supplied name isn't valid UTF-8");
@@ -865,10 +886,8 @@ static DBusMessage *set_name(DBusConnection *conn, DBusMessage *msg,
if (ecode < 0)
return failed_strerror(msg, -ecode);
- path = dbus_message_get_path(msg);
-
- emit_property_changed(conn, path, ADAPTER_INTERFACE, "Name",
- DBUS_TYPE_STRING, &name);
+ emit_property_changed(conn, adapter->path, ADAPTER_INTERFACE,
+ "Name", DBUS_TYPE_STRING, &name);
return dbus_message_new_method_return(msg);
}
diff --git a/src/adapter.h b/src/adapter.h
index 6c63b7e0..59b00f70 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -112,6 +112,7 @@ int adapter_remove_found_device(struct btd_adapter *adapter, bdaddr_t *bdaddr);
void adapter_update_oor_devices(struct btd_adapter *adapter);
void adapter_remove_oor_device(struct btd_adapter *adapter, char *peer_addr);
void adapter_mode_changed(struct btd_adapter *adapter, uint8_t scan_mode);
+void adapter_name_changed(struct btd_adapter *adapter, const char *name);
struct agent *adapter_get_agent(struct btd_adapter *adapter);
void adapter_add_connection(struct btd_adapter *adapter,
struct btd_device *device, uint16_t handle);
diff --git a/src/dbus-hci.c b/src/dbus-hci.c
index ff89043f..6d6696f2 100644
--- a/src/dbus-hci.c
+++ b/src/dbus-hci.c
@@ -1047,20 +1047,20 @@ int set_major_and_minor_class(int dd, const uint8_t *cls,
void hcid_dbus_setname_complete(bdaddr_t *local)
{
+ struct btd_adapter *adapter;
int id, dd = -1;
read_local_name_rp rp;
struct hci_request rq;
const char *pname = (char *) rp.name;
- char local_addr[18], name[249];
-
- ba2str(local, local_addr);
+ char name[249];
- id = hci_devid(local_addr);
- if (id < 0) {
- error("No matching device id for %s", local_addr);
+ adapter = manager_find_adapter(local);
+ if (!adapter) {
+ error("No matching adapter found");
return;
}
+ id = adapter_get_dev_id(adapter);
dd = hci_open_dev(id);
if (dd < 0) {
error("HCI device open failed: hci%d", id);
@@ -1088,6 +1088,8 @@ void hcid_dbus_setname_complete(bdaddr_t *local)
strncpy(name, pname, sizeof(name) - 1);
name[248] = '\0';
pname = name;
+
+ adapter_name_changed(adapter, pname);
}
void hcid_dbus_setscan_enable_complete(bdaddr_t *local)