summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2006-09-21 23:01:16 +0000
committerMarcel Holtmann <marcel@holtmann.org>2006-09-21 23:01:16 +0000
commitd6bd57566441595ff844a6ce27b1b1306dfb43af (patch)
treea3f3e3172598ccc1d24d9ccf811d36656f6b0ff5
parent6eff5843d007147dcf54d100a0eb8af0306081f7 (diff)
Make sure to disable the name resolution for non D-Bus clients
-rw-r--r--hcid/dbus.c105
1 files changed, 69 insertions, 36 deletions
diff --git a/hcid/dbus.c b/hcid/dbus.c
index 6167685c..f92ae1b1 100644
--- a/hcid/dbus.c
+++ b/hcid/dbus.c
@@ -401,9 +401,10 @@ static void reply_pending_requests(const char *path, struct hci_dbus_data *pdata
}
if (pdata->disc_active) {
- /* Send discovery completed signal if there isn't name to resolve */
+ /* Send discovery completed signal if there isn't name
+ * to resolve */
message = dbus_message_new_signal(path, ADAPTER_INTERFACE,
- "DiscoveryCompleted");
+ "DiscoveryCompleted");
send_reply_and_unref(connection, message);
/* Cancel inquiry initiated by D-Bus client */
@@ -412,9 +413,10 @@ static void reply_pending_requests(const char *path, struct hci_dbus_data *pdata
}
if (pdata->pdisc_active) {
- /* Send periodic discovery stopped signal exit or stop the device */
+ /* Send periodic discovery stopped signal exit or stop
+ * the device */
message = dbus_message_new_signal(path, ADAPTER_INTERFACE,
- "PeriodicDiscoveryStopped");
+ "PeriodicDiscoveryStopped");
send_reply_and_unref(connection, message);
/* Stop periodic inquiry initiated by D-Bus client */
@@ -439,39 +441,45 @@ static int unregister_dbus_path(const char *path)
release_passkey_agents(pdata, NULL);
if (pdata->discovery_requestor) {
- name_listener_remove(connection, pdata->discovery_requestor,
- (name_cb_t) discover_devices_req_exit, pdata);
+ name_listener_remove(connection,
+ pdata->discovery_requestor,
+ (name_cb_t) discover_devices_req_exit, pdata);
free(pdata->discovery_requestor);
pdata->discovery_requestor = NULL;
}
if (pdata->pdiscovery_requestor) {
- name_listener_remove(connection, pdata->pdiscovery_requestor,
- (name_cb_t) periodic_discover_req_exit, pdata);
+ name_listener_remove(connection,
+ pdata->pdiscovery_requestor,
+ (name_cb_t) periodic_discover_req_exit, pdata);
free(pdata->pdiscovery_requestor);
pdata->pdiscovery_requestor = NULL;
}
if (pdata->disc_devices) {
- slist_foreach(pdata->disc_devices, (slist_func_t) free, NULL);
+ slist_foreach(pdata->disc_devices,
+ (slist_func_t) free, NULL);
slist_free(pdata->disc_devices);
pdata->disc_devices = NULL;
}
if (pdata->oor_devices) {
- slist_foreach(pdata->oor_devices, (slist_func_t) free, NULL);
+ slist_foreach(pdata->oor_devices,
+ (slist_func_t) free, NULL);
slist_free(pdata->oor_devices);
pdata->oor_devices = NULL;
}
if (pdata->pin_reqs) {
- slist_foreach(pdata->pin_reqs, (slist_func_t) free, NULL);
+ slist_foreach(pdata->pin_reqs,
+ (slist_func_t) free, NULL);
slist_free(pdata->pin_reqs);
pdata->pin_reqs = NULL;
}
if (pdata->active_conn) {
- slist_foreach(pdata->active_conn, (slist_func_t) free, NULL);
+ slist_foreach(pdata->active_conn,
+ (slist_func_t) free, NULL);
slist_free(pdata->active_conn);
pdata->active_conn = NULL;
}
@@ -650,7 +658,8 @@ int hcid_dbus_start_device(uint16_t id)
}
for (i = 0; i < cl->conn_num; i++, ci++)
- active_conn_append(&pdata->active_conn, &ci->bdaddr, ci->handle);
+ active_conn_append(&pdata->active_conn,
+ &ci->bdaddr, ci->handle);
ret = 0;
@@ -891,7 +900,7 @@ void hcid_dbus_inquiry_start(bdaddr_t *local)
if (pdata->pdisc_active)
pending_remote_name_cancel(pdata);
- /* disable name resolution for NON D-Bus requests */
+ /* Disable name resolution for non D-Bus clients */
if (!pdata->discovery_requestor)
pdata->discover_type &= ~RESOLVE_NAME;
}
@@ -934,7 +943,8 @@ int disc_device_req_name(struct hci_dbus_data *dbus_data)
bacpy(&match.bdaddr, BDADDR_ANY);
match.name_status = NAME_REQUIRED;
- l = slist_find(dbus_data->disc_devices, &match, (cmp_func_t) disc_device_find);
+ l = slist_find(dbus_data->disc_devices, &match,
+ (cmp_func_t) disc_device_find);
if (!l)
return -ENODATA;
@@ -969,17 +979,19 @@ int disc_device_req_name(struct hci_dbus_data *dbus_data)
if (hci_send_req(dd, &rq, 100) < 0) {
error("Unable to send the HCI remote name request: %s (%d)",
- strerror(errno), errno);
- failed_signal = dev_signal_factory(dbus_data->dev_id, "RemoteNameFailed",
- DBUS_TYPE_STRING, &peer_addr,
- DBUS_TYPE_INVALID);
+ strerror(errno), errno);
+ failed_signal = dev_signal_factory(dbus_data->dev_id,
+ "RemoteNameFailed",
+ DBUS_TYPE_STRING, &peer_addr,
+ DBUS_TYPE_INVALID);
}
if (rp.status) {
error("Remote name request failed with status 0x%02x", rp.status);
- failed_signal = dev_signal_factory(dbus_data->dev_id, "RemoteNameFailed",
- DBUS_TYPE_STRING, &peer_addr,
- DBUS_TYPE_INVALID);
+ failed_signal = dev_signal_factory(dbus_data->dev_id,
+ "RemoteNameFailed",
+ DBUS_TYPE_STRING, &peer_addr,
+ DBUS_TYPE_INVALID);
}
free(peer_addr);
@@ -998,7 +1010,8 @@ int disc_device_req_name(struct hci_dbus_data *dbus_data)
free(dev);
/* get the next element */
- l = slist_find(dbus_data->disc_devices, &match, (cmp_func_t) disc_device_find);
+ l = slist_find(dbus_data->disc_devices, &match,
+ (cmp_func_t) disc_device_find);
} while (l);
@@ -1073,6 +1086,7 @@ void hcid_dbus_inquiry_complete(bdaddr_t *local)
}
pdata->pinq_idle = 1;
+
/*
* Enable resolution again: standard inquiry can be
* received in the periodic inquiry idle state.
@@ -1083,9 +1097,11 @@ void hcid_dbus_inquiry_complete(bdaddr_t *local)
/*
* The following scenarios can happen:
* 1. standard inquiry: always send discovery completed signal
- * 2. standard inquiry + name resolving: send discovery completed after name resolving
+ * 2. standard inquiry + name resolving: send discovery completed
+ * after name resolving
* 3. periodic inquiry: skip discovery completed signal
- * 4. periodic inquiry + standard inquiry: always send discovery completed signal
+ * 4. periodic inquiry + standard inquiry: always send discovery
+ * completed signal
*
* Keep in mind that non D-Bus requests can arrive.
*/
@@ -1095,7 +1111,7 @@ void hcid_dbus_inquiry_complete(bdaddr_t *local)
if (pdata->disc_active) {
message = dbus_message_new_signal(path, ADAPTER_INTERFACE,
- "DiscoveryCompleted");
+ "DiscoveryCompleted");
send_reply_and_unref(connection, message);
pdata->disc_active = 0;
@@ -1154,7 +1170,7 @@ void hcid_dbus_periodic_inquiry_start(bdaddr_t *local, uint8_t status)
if (dbus_connection_get_object_path_data(connection, path, (void *) &pdata)) {
pdata->pdisc_active = 1;
- /* disable name resolution for NON D-Bus requests */
+ /* Disable name resolution for non D-Bus clients */
if (!pdata->pdiscovery_requestor)
pdata->discover_type &= ~RESOLVE_NAME;
}
@@ -1162,6 +1178,7 @@ void hcid_dbus_periodic_inquiry_start(bdaddr_t *local, uint8_t status)
message = dbus_message_new_signal(path, ADAPTER_INTERFACE,
"PeriodicDiscoveryStarted");
send_reply_and_unref(connection, message);
+
failed:
bt_free(local_addr);
}
@@ -1435,11 +1452,13 @@ void hcid_dbus_remote_name(bdaddr_t *local, bdaddr_t *peer, uint8_t status, char
}
if (status)
- message = dev_signal_factory(pdata->dev_id, "RemoteNameFailed",
+ message = dev_signal_factory(pdata->dev_id,
+ "RemoteNameFailed",
DBUS_TYPE_STRING, &peer_addr,
DBUS_TYPE_INVALID);
else
- message = dev_signal_factory(pdata->dev_id, "RemoteNameUpdated",
+ message = dev_signal_factory(pdata->dev_id,
+ "RemoteNameUpdated",
DBUS_TYPE_STRING, &peer_addr,
DBUS_TYPE_STRING, &name,
DBUS_TYPE_INVALID);
@@ -1477,12 +1496,18 @@ void hcid_dbus_remote_name(bdaddr_t *local, bdaddr_t *peer, uint8_t status, char
}
if (pdata->discover_type & RESOLVE_NAME) {
- message = dbus_message_new_signal(path, ADAPTER_INTERFACE,
- "DiscoveryCompleted");
+ message = dbus_message_new_signal(path,
+ ADAPTER_INTERFACE, "DiscoveryCompleted");
send_reply_and_unref(connection, message);
}
+
+ /* Disable name resolution for non D-Bus clients */
+ if (!pdata->pdiscovery_requestor)
+ pdata->discover_type &= ~RESOLVE_NAME;
}
+
pdata->disc_active = 0;
+
done:
bt_free(local_addr);
bt_free(peer_addr);
@@ -2252,8 +2277,9 @@ void discover_devices_req_exit(const char *name, struct hci_dbus_data *pdata)
debug("DiscoverDevices requestor at %s exited before the operation finished", name);
/*
- * Cleanup the discovered devices list and send the cmd to cancel inquiry
- * or cancel remote name request. The return value can be ignored.
+ * Cleanup the discovered devices list and send the command to
+ * cancel inquiry or cancel remote name request. The return
+ * can be ignored.
*/
cancel_discovery(pdata);
}
@@ -2334,16 +2360,19 @@ int cancel_discovery(struct hci_dbus_data *pdata)
bacpy(&match.bdaddr, BDADDR_ANY);
match.name_status = NAME_REQUESTED;
- l = slist_find(pdata->disc_devices, &match, (cmp_func_t) disc_device_find);
+ l = slist_find(pdata->disc_devices, &match,
+ (cmp_func_t) disc_device_find);
if (l) {
dev = l->data;
if (remote_name_cancel(dd, &dev->bdaddr, 100) < 0) {
- error("Read remote name cancel failed: %s, (%d)", strerror(errno), errno);
+ error("Read remote name cancel failed: %s, (%d)",
+ strerror(errno), errno);
err = -errno;
}
} else {
if (inquiry_cancel(dd, 100) < 0) {
- error("Inquiry cancel failed:%s (%d)", strerror(errno), errno);
+ error("Inquiry cancel failed:%s (%d)",
+ strerror(errno), errno);
err = -errno;
}
}
@@ -2359,6 +2388,10 @@ cleanup:
slist_free(pdata->disc_devices);
pdata->disc_devices = NULL;
+ /* Disable name resolution for non D-Bus clients */
+ if (!pdata->pdiscovery_requestor)
+ pdata->discover_type &= ~RESOLVE_NAME;
+
return err;
}