diff --git a/plugins/adaptername.c b/plugins/adaptername.c
index 9e99e6a..e154e92 100644
--- a/plugins/adaptername.c
+++ b/plugins/adaptername.c
current_id + 1);
DBG("Setting name '%s' for device 'hci%d'", str, current_id);
- adapter_update_local_name(adapter, str);
+ adapter_set_name(adapter, str);
g_free(str);
} else {
DBG("Setting name '%s' for device 'hci%d'", pretty_hostname,
current_id);
- adapter_update_local_name(adapter, pretty_hostname);
+ adapter_set_name(adapter, pretty_hostname);
}
/* And disable the name change now */
expand_name(name, MAX_NAME_LENGTH, main_opts.name, current_id);
DBG("Setting name '%s' for device 'hci%d'", name, current_id);
- adapter_update_local_name(adapter, name);
+ adapter_set_name(adapter, name);
return 0;
}
diff --git a/plugins/hciops.c b/plugins/hciops.c
index ddff544..c3fbf85 100644
--- a/plugins/hciops.c
+++ b/plugins/hciops.c
adapter = manager_find_adapter_by_id(index);
if (adapter)
- adapter_update_local_name(adapter, name);
+ adapter_name_changed(adapter, name);
update_ext_inquiry_response(index);
}
diff --git a/plugins/mgmtops.c b/plugins/mgmtops.c
index c7ddea5..0f68aa3 100644
--- a/plugins/mgmtops.c
+++ b/plugins/mgmtops.c
else
mgmt_set_powered(index, TRUE);
- adapter_update_local_name(adapter, (char *) rp->name);
+ adapter_name_changed(adapter, (char *) rp->name);
btd_adapter_unref(adapter);
}
return;
}
- adapter_update_local_name(adapter, (char *) rp->name);
+ adapter_name_changed(adapter, (char *) rp->name);
}
static void read_local_oob_data_complete(int sk, uint16_t index, void *buf,
adapter = manager_find_adapter(&info->bdaddr);
if (adapter)
- adapter_update_local_name(adapter, (char *) ev->name);
+ adapter_name_changed(adapter, (char *) ev->name);
}
static void mgmt_device_found(int sk, uint16_t index, void *buf, size_t len)
diff --git a/src/adapter.c b/src/adapter.c
index d3ba7a8..4eafe15 100644
--- a/src/adapter.c
+++ b/src/adapter.c
DBUS_TYPE_UINT32, &new_class);
}
-int adapter_update_local_name(struct btd_adapter *adapter, const char *name)
+void adapter_name_changed(struct btd_adapter *adapter, const char *name)
{
- char *name_ptr;
+ if (g_strcmp0(adapter->name, name) == 0)
+ return;
- if (adapter->allow_name_changes == FALSE)
- return -EPERM;
+ strncpy(adapter->name, name, MAX_NAME_LENGTH);
+
+ if (connection)
+ emit_property_changed(connection, adapter->path,
+ ADAPTER_INTERFACE, "Name",
+ DBUS_TYPE_STRING, &name);
+ if (main_opts.attrib_server)
+ attrib_gap_set(GATT_CHARAC_DEVICE_NAME,
+ (const uint8_t *) name, strlen(name));
+}
+
+int adapter_set_name(struct btd_adapter *adapter, const char *name)
+{
if (strncmp(name, adapter->name, MAX_NAME_LENGTH) == 0)
return 0;
return -EINVAL;
}
- strncpy(adapter->name, name, MAX_NAME_LENGTH);
-
- if (main_opts.attrib_server)
- attrib_gap_set(GATT_CHARAC_DEVICE_NAME,
- (const uint8_t *) adapter->name, strlen(adapter->name));
-
- name_ptr = adapter->name;
-
- write_local_name(&adapter->bdaddr, adapter->name);
-
- if (connection)
- emit_property_changed(connection, adapter->path,
- ADAPTER_INTERFACE, "Name",
- DBUS_TYPE_STRING, &name_ptr);
-
if (adapter->up) {
int err = adapter_ops->set_name(adapter->dev_id, name);
if (err < 0)
return err;
}
+ write_local_name(&adapter->bdaddr, name);
+
return 0;
}
struct btd_adapter *adapter = data;
int ret;
- ret = adapter_update_local_name(adapter, name);
+ if (adapter->allow_name_changes == FALSE)
+ return btd_error_failed(msg, strerror(EPERM));
+
+ ret = adapter_set_name(adapter, name);
if (ret == -EINVAL)
return btd_error_invalid_args(msg);
else if (ret < 0)
adapter->mode = MODE_CONNECTABLE;
adapter->off_timer = 0;
+ /* Forcing: Name is lost when adapter is powered off */
adapter_ops->set_name(adapter->dev_id, adapter->name);
if (read_local_class(&adapter->bdaddr, cls) < 0) {
diff --git a/src/adapter.h b/src/adapter.h
index 1baa547..7ef0af0 100644
--- a/src/adapter.h
+++ b/src/adapter.h
void adapter_emit_device_found(struct btd_adapter *adapter,
struct remote_dev_info *dev);
void adapter_mode_changed(struct btd_adapter *adapter, uint8_t scan_mode);
-int adapter_update_local_name(struct btd_adapter *adapter, const char *name);
+int adapter_set_name(struct btd_adapter *adapter, const char *name);
+void adapter_name_changed(struct btd_adapter *adapter, const char *name);
void adapter_service_insert(struct btd_adapter *adapter, void *rec);
void adapter_service_remove(struct btd_adapter *adapter, void *rec);
void btd_adapter_class_changed(struct btd_adapter *adapter,