summaryrefslogtreecommitdiffstats
path: root/hcid
diff options
context:
space:
mode:
authorClaudio Takahasi <claudio.takahasi@openbossa.org>2006-03-21 14:06:41 +0000
committerClaudio Takahasi <claudio.takahasi@openbossa.org>2006-03-21 14:06:41 +0000
commit5eac136182fd238043ce62613830019256bd7120 (patch)
treeb1b5d4eec8942a405b6c088f77b35ae18417316a /hcid
parentf8a36952f39f2c51d4cd6f2e170817d89724c422 (diff)
Fixed discover devices without names and minor errors.
Diffstat (limited to 'hcid')
-rw-r--r--hcid/dbus-adapter.c32
-rw-r--r--hcid/dbus.c85
-rw-r--r--hcid/dbus.h10
3 files changed, 73 insertions, 54 deletions
diff --git a/hcid/dbus-adapter.c b/hcid/dbus-adapter.c
index 551586ed..a10cbdb2 100644
--- a/hcid/dbus-adapter.c
+++ b/hcid/dbus-adapter.c
@@ -313,7 +313,7 @@ static DBusHandlerResult handle_dev_set_mode_req(DBusConnection *conn, DBusMessa
if (status) {
error("Setting scan enable failed with status 0x%02x", status);
hci_close_dev(dd);
- return error_failed(conn, msg, status);
+ return error_failed(conn, msg, bt_error(status));
}
}
@@ -863,11 +863,11 @@ static DBusHandlerResult handle_dev_get_remote_name_req(DBusConnection *conn, DB
/* put the request name in the queue to resolve name */
str2ba(peer_addr, &peer_bdaddr);
- remote_name_append(&dbus_data->discovered_devices, &peer_bdaddr, NAME_PENDING);
+ disc_device_append(&dbus_data->disc_devices, &peer_bdaddr, NAME_PENDING);
/* check if there is a discover process running */
if (dbus_data->discover_state == DISCOVER_OFF)
- remote_name_resolve(dbus_data);
+ disc_device_req_name(dbus_data);
return error_request_deferred(conn, msg);
}
@@ -1053,7 +1053,7 @@ static DBusHandlerResult handle_dev_create_bonding_req(DBusConnection *conn, DBu
struct hci_request rq;
evt_cmd_status rp;
DBusError err;
- char *peer_addr;
+ char *peer_addr = NULL;
char *str;
struct hci_dbus_data *dbus_data = data;
struct slist *l;
@@ -1072,6 +1072,8 @@ static DBusHandlerResult handle_dev_create_bonding_req(DBusConnection *conn, DBu
return error_invalid_arguments(conn, msg);
}
+ /* FIXME: check if the address is valid */
+
str2ba(peer_addr, &peer_bdaddr);
/* check if there is a pending bonding request */
@@ -1158,7 +1160,7 @@ static DBusHandlerResult handle_dev_create_bonding_req(DBusConnection *conn, DBu
if (rp.status) {
error("Failed with status 0x%02x", rp.status);
hci_close_dev(dd);
- return error_failed(conn, msg, rp.status);
+ return error_failed(conn, msg, bt_error(rp.status));
}
/* add in the bonding requests list */
@@ -1477,7 +1479,7 @@ static DBusHandlerResult handle_dev_cancel_discovery_req(DBusConnection *conn, D
{
DBusMessage *reply = NULL;
const char *requestor_name;
- bdaddr_t *addr;
+ const struct discovered_dev_info *dev;
struct hci_request rq;
remote_name_req_cancel_cp cp;
struct hci_dbus_data *dbus_data = data;
@@ -1506,13 +1508,12 @@ static DBusHandlerResult handle_dev_cancel_discovery_req(DBusConnection *conn, D
switch (dbus_data->discover_state) {
case DISCOVER_OFF:
- /* FIXME: */
- break;
+ goto failed;
case RESOLVING_NAMES:
/* get the first element */
- addr = (bdaddr_t *) (dbus_data->discovered_devices)->data;
+ dev = (struct discovered_dev_info *) (dbus_data->disc_devices)->data;
- bacpy(&cp.bdaddr, addr);
+ bacpy(&cp.bdaddr, dev->bdaddr);
rq.ocf = OCF_REMOTE_NAME_REQ_CANCEL;
rq.cparam = &cp;
@@ -1525,10 +1526,6 @@ static DBusHandlerResult handle_dev_cancel_discovery_req(DBusConnection *conn, D
break;
}
- slist_foreach(dbus_data->discovered_devices, discovered_device_info_free, NULL);
- slist_free(dbus_data->discovered_devices);
- dbus_data->discovered_devices = NULL;
-
if (hci_send_req(dd, &rq, 100) < 0) {
error("Sending command failed: %s (%d)",
strerror(errno), errno);
@@ -1540,9 +1537,14 @@ static DBusHandlerResult handle_dev_cancel_discovery_req(DBusConnection *conn, D
if (status) {
error("Cancel failed with status 0x%02x", status);
- return error_failed(conn, msg, status);
+ return error_failed(conn, msg, bt_error(status));
}
+failed:
+ slist_foreach(dbus_data->disc_devices, disc_device_info_free, NULL);
+ slist_free(dbus_data->disc_devices);
+ dbus_data->disc_devices = NULL;
+
free(dbus_data->requestor_name);
dbus_data->requestor_name = NULL;
diff --git a/hcid/dbus.c b/hcid/dbus.c
index 02d7f739..63da099a 100644
--- a/hcid/dbus.c
+++ b/hcid/dbus.c
@@ -98,7 +98,7 @@ static const char *phone_minor_cls[] = {
};
-void discovered_device_info_free(void *data, void *user_data)
+void disc_device_info_free(void *data, void *user_data)
{
struct discovered_dev_info *dev = data;
@@ -140,7 +140,7 @@ int bonding_requests_find(const void *data, const void *user_data)
return -1;
}
-int remote_name_find_by_bdaddr(const void *data, const void *user_data)
+int disc_device_find_by_bdaddr(const void *data, const void *user_data)
{
const struct discovered_dev_info *dev = data;
const bdaddr_t *bdaddr = user_data;
@@ -151,7 +151,7 @@ int remote_name_find_by_bdaddr(const void *data, const void *user_data)
return -1;
}
-static int remote_name_find_by_name_status(const void *data, const void *user_data)
+static int disc_device_find_by_name_status(const void *data, const void *user_data)
{
const struct discovered_dev_info *dev = data;
const name_status_t *name_status = user_data;
@@ -162,13 +162,13 @@ static int remote_name_find_by_name_status(const void *data, const void *user_da
return -1;
}
-int remote_name_append(struct slist **list, bdaddr_t *bdaddr, name_status_t name_status)
+int disc_device_append(struct slist **list, bdaddr_t *bdaddr, name_status_t name_status)
{
struct discovered_dev_info *dev = NULL;
struct slist *l;
/* ignore repeated entries */
- l = slist_find(*list, bdaddr, remote_name_find_by_bdaddr);
+ l = slist_find(*list, bdaddr, disc_device_find_by_bdaddr);
if (l) {
/* device found, update the attributes */
@@ -189,13 +189,13 @@ int remote_name_append(struct slist **list, bdaddr_t *bdaddr, name_status_t name
return 0;
}
-static int remote_name_remove(struct slist **list, bdaddr_t *bdaddr)
+static int disc_device_remove(struct slist **list, bdaddr_t *bdaddr)
{
struct discovered_dev_info *dev;
struct slist *l;
int ret_val = -1;
- l = slist_find(*list, bdaddr, remote_name_find_by_bdaddr);
+ l = slist_find(*list, bdaddr, disc_device_find_by_bdaddr);
if (l) {
dev = l->data;
@@ -431,10 +431,10 @@ static gboolean unregister_dbus_path(const char *path)
if (pdata->requestor_name)
free(pdata->requestor_name);
- if (pdata->discovered_devices) {
- slist_foreach(pdata->discovered_devices, discovered_device_info_free, NULL);
- slist_free(pdata->discovered_devices);
- pdata->discovered_devices = NULL;
+ if (pdata->disc_devices) {
+ slist_foreach(pdata->disc_devices, disc_device_info_free, NULL);
+ slist_free(pdata->disc_devices);
+ pdata->disc_devices = NULL;
}
if (pdata->bonding_requests) {
@@ -738,7 +738,7 @@ failed:
bt_free(local_addr);
}
-int remote_name_resolve(struct hci_dbus_data *dbus_data)
+int disc_device_req_name(struct hci_dbus_data *dbus_data)
{
struct hci_request rq;
evt_cmd_status rp;
@@ -752,10 +752,10 @@ int remote_name_resolve(struct hci_dbus_data *dbus_data)
name_status_t name_status = NAME_PENDING;
/*get the next remote address */
- if (!dbus_data->discovered_devices)
+ if (!dbus_data->disc_devices)
return -1;
- l = slist_find(dbus_data->discovered_devices, &name_status, remote_name_find_by_name_status);
+ l = slist_find(dbus_data->disc_devices, &name_status, disc_device_find_by_name_status);
if (!l)
return -1;
@@ -811,12 +811,12 @@ int remote_name_resolve(struct hci_dbus_data *dbus_data)
/* if failed, request the next element */
if (!req_sent) {
/* remove the element from the list */
- dbus_data->discovered_devices = slist_remove(dbus_data->discovered_devices, dev);
+ dbus_data->disc_devices = slist_remove(dbus_data->disc_devices, dev);
free(dev->bdaddr);
free(dev);
/* get the next element */
- l = slist_find(dbus_data->discovered_devices, &name_status, remote_name_find_by_name_status);
+ l = slist_find(dbus_data->disc_devices, &name_status, disc_device_find_by_name_status);
if (!l) {
/* no more devices: exit */
@@ -854,7 +854,7 @@ void hcid_dbus_inquiry_complete(bdaddr_t *local)
snprintf(path, sizeof(path), "%s/hci%d", ADAPTER_PATH, id);
if (dbus_connection_get_object_path_data(connection, path, (void *) &pdata)) {
- if (!remote_name_resolve(pdata)) {
+ if (!disc_device_req_name(pdata)) {
pdata->discover_state = RESOLVING_NAMES;
goto failed; /* skip - there is name to resolve */
}
@@ -862,9 +862,9 @@ void hcid_dbus_inquiry_complete(bdaddr_t *local)
pdata->discover_state = DISCOVER_OFF;
/* free discovered devices list */
- slist_foreach(pdata->discovered_devices, discovered_device_info_free, NULL);
- slist_free(pdata->discovered_devices);
- pdata->discovered_devices = NULL;
+ slist_foreach(pdata->disc_devices, disc_device_info_free, NULL);
+ slist_free(pdata->disc_devices);
+ pdata->disc_devices = NULL;
if (pdata->requestor_name) {
free(pdata->requestor_name);
@@ -978,7 +978,7 @@ void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class, i
}
/* send the remote name signal */
- l = slist_find(pdata->discovered_devices, peer, remote_name_find_by_bdaddr);
+ l = slist_find(pdata->disc_devices, peer, disc_device_find_by_bdaddr);
if (l) {
dev = l->data;
@@ -998,12 +998,26 @@ void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class, i
free(name);
name_status = NAME_SENT;
- }
- /* handle only requests triggered by dbus applications */
- if ((pdata->discover_state == DISCOVER_RUNNING_WITH_NAMES) ||
- (pdata->discover_state == DISCOVER_RUNNING))
- remote_name_append(&pdata->discovered_devices, peer, name_status);
+ /*
+ * Add in the discovered devices list to avoid
+ * multiple remote name update signals
+ */
+ switch (pdata->discover_state) {
+ case DISCOVER_RUNNING_WITH_NAMES:
+ case DISCOVER_RUNNING:
+ disc_device_append(&pdata->disc_devices, peer, name_status);
+ break;
+ default: /* ignore */
+ break;
+ }
+
+
+ } else {
+ /* check if the remote name needs be requested */
+ if (pdata->discover_state == DISCOVER_RUNNING_WITH_NAMES)
+ disc_device_append(&pdata->disc_devices, peer, name_status);
+ }
failed:
if (signal_device)
@@ -1035,7 +1049,7 @@ void hcid_dbus_remote_name(bdaddr_t *local, bdaddr_t *peer, uint8_t status, char
/* remove from remote name request list */
if (dbus_connection_get_object_path_data(connection, path, (void *) &pdata))
- remote_name_remove(&pdata->discovered_devices, peer);
+ disc_device_remove(&pdata->disc_devices, peer);
/* if the requested name failed, don't send signal and request the next name */
if (status)
@@ -1051,13 +1065,13 @@ void hcid_dbus_remote_name(bdaddr_t *local, bdaddr_t *peer, uint8_t status, char
send_reply_and_unref(connection, message);
/* check if there is more devices to request names */
- if (!remote_name_resolve(pdata))
+ if (!disc_device_req_name(pdata))
goto failed; /* skip if a new request has been sent */
/* free discovered devices list */
- slist_foreach(pdata->discovered_devices, discovered_device_info_free, NULL);
- slist_free(pdata->discovered_devices);
- pdata->discovered_devices = NULL;
+ slist_foreach(pdata->disc_devices, disc_device_info_free, NULL);
+ slist_free(pdata->disc_devices);
+ pdata->disc_devices = NULL;
if (pdata->discover_state != DISCOVER_OFF) {
message = dbus_message_new_signal(path, ADAPTER_INTERFACE,
@@ -1128,7 +1142,7 @@ void hcid_dbus_conn_complete(bdaddr_t *local, uint8_t status, uint16_t handle, b
dev = l->data;
if (status) {
- error_connection_attempt_failed(connection, dev->msg, status);
+ error_connection_attempt_failed(connection, dev->msg, bt_error(status));
goto failed;
}
@@ -1158,14 +1172,14 @@ void hcid_dbus_conn_complete(bdaddr_t *local, uint8_t status, uint16_t handle, b
if (hci_send_req(dd, &rq, 100) < 0) {
error("Unable to send the HCI request: %s (%d)",
- strerror(errno), errno);
+ strerror(errno), errno);
error_failed(connection, dev->msg, errno);
goto failed;
}
if (rp.status) {
error("Failed with status 0x%02x", rp.status);
- error_failed(connection, dev->msg, rp.status);
+ error_failed(connection, dev->msg, bt_error(rp.status));
goto failed;
}
/* request sent properly */
@@ -1528,6 +1542,9 @@ static void sigalarm_handler(int signum)
active_handlers++;
+ if (!pdata->discoverable_timeout)
+ continue; /* skip if discoverable always: timeout zero */
+
if ((++(pdata->timeout_hits) % pdata->discoverable_timeout) != 0)
continue;
diff --git a/hcid/dbus.h b/hcid/dbus.h
index ae247fc0..92a673e8 100644
--- a/hcid/dbus.h
+++ b/hcid/dbus.h
@@ -113,7 +113,7 @@ struct hci_dbus_data {
timeout_handler_func_t *timeout_handler;
uint8_t mode; /* scan mode */
discover_state_t discover_state;
- struct slist *discovered_devices;
+ struct slist *disc_devices;
char *requestor_name; /* requestor unique name */
struct slist *passkey_agents;
struct slist *bonding_requests;
@@ -190,11 +190,11 @@ static inline DBusHandlerResult send_reply_and_unref(DBusConnection *conn, DBusM
return DBUS_HANDLER_RESULT_HANDLED;
}
-void discovered_device_info_free(void *data, void *user_data);
+void disc_device_info_free(void *data, void *user_data);
int bonding_requests_find(const void *data, const void *user_data);
-int remote_name_find_by_bdaddr(const void *data, const void *user_data);
-int remote_name_append(struct slist **list, bdaddr_t *bdaddr, name_status_t name_status);
-int remote_name_resolve(struct hci_dbus_data *dbus_data);
+int disc_device_find_by_bdaddr(const void *data, const void *user_data);
+int disc_device_append(struct slist **list, bdaddr_t *bdaddr, name_status_t name_status);
+int disc_device_req_name(struct hci_dbus_data *dbus_data);
/*
* Scanning modes, used by DEV_SET_MODE