summaryrefslogtreecommitdiffstats
path: root/hcid/dbus.c
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2006-02-09 15:56:37 +0000
committerMarcel Holtmann <marcel@holtmann.org>2006-02-09 15:56:37 +0000
commit2210fda2d9ff2d751fc1ba97e03f6006e4802690 (patch)
treef1a65f3a6d325604c1ebe07535b329100f284617 /hcid/dbus.c
parent0722d48e5cd78d94fc66e27de13a726ad81d3425 (diff)
Read remote name from cache first before sending a request
Diffstat (limited to 'hcid/dbus.c')
-rw-r--r--hcid/dbus.c104
1 files changed, 80 insertions, 24 deletions
diff --git a/hcid/dbus.c b/hcid/dbus.c
index c85eadc7..9aff43fb 100644
--- a/hcid/dbus.c
+++ b/hcid/dbus.c
@@ -45,6 +45,7 @@
#include "hcid.h"
#include "dbus.h"
+#include "textfile.h"
#ifndef DBUS_NAME_FLAG_PROHIBIT_REPLACEMENT
#define DBUS_NAME_FLAG_PROHIBIT_REPLACEMENT 0x00
@@ -98,6 +99,19 @@ struct profile_obj_path_data {
unregister_function_t *unreg_func;
get_svc_table_func_t *get_svc_table; /* return the service table */
};
+/*
+ * Utility functions
+ */
+static char *get_device_name(const bdaddr_t *local, const bdaddr_t *peer)
+{
+ char filename[PATH_MAX + 1], addr[18];
+
+ ba2str(local, addr);
+ snprintf(filename, PATH_MAX, "%s/%s/names", STORAGEDIR, addr);
+
+ ba2str(peer, addr);
+ return textfile_get(filename, addr);
+}
/*
* D-Bus error messages functions and declarations.
@@ -1707,50 +1721,92 @@ failed:
static DBusMessage* handle_remote_name_req(DBusMessage *msg, void *data)
{
DBusMessage *reply = NULL;
+ DBusMessage *signal = NULL;
struct hci_dbus_data *dbus_data = data;
- int dd = -1;
const char *str_bdaddr;
+ char *name;
+ char path[MAX_PATH_LENGTH];
bdaddr_t bdaddr;
+ struct hci_dev_info di;
struct hci_request rq;
remote_name_req_cp cp;
evt_cmd_status rp;
+ int dd = -1;
dbus_message_get_args(msg, NULL,
DBUS_TYPE_STRING, &str_bdaddr,
DBUS_TYPE_INVALID);
str2ba(str_bdaddr, &bdaddr);
-
- dd = hci_open_dev(dbus_data->dev_id);
- if (dd < 0) {
- syslog(LOG_ERR, "Unable to open device %d: %s (%d)",
- dbus_data->dev_id, strerror(errno), errno);
- reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_OFFSET + errno);
+ if (hci_devinfo(dbus_data->dev_id, &di) < 0) {
+ syslog(LOG_ERR, "Can't get device info");
+ reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_ENODEV);
goto failed;
}
- memset(&cp, 0, sizeof(cp));
- cp.bdaddr = bdaddr;
- cp.pscan_rep_mode = 0x01;
+ /* Try retrieve from local cache */
+ name = get_device_name(&di.bdaddr, &bdaddr);
+ if (name) {
- memset(&rq, 0, sizeof(rq));
- rq.ogf = OGF_LINK_CTL;
- rq.ocf = OCF_REMOTE_NAME_REQ;
- rq.cparam = &cp;
- rq.clen = REMOTE_NAME_REQ_CP_SIZE;
- rq.rparam = &rp;
- rq.rlen = EVT_CMD_STATUS_SIZE;
- rq.event = EVT_CMD_STATUS;
+ reply = dbus_message_new_method_return(msg);
- if (hci_send_req(dd, &rq, 100) < 0) {
- syslog(LOG_ERR, "Unable to send remote name request: %s (%d)",
- strerror(errno), errno);
- reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_OFFSET + errno);
- goto failed;
+ snprintf(path, sizeof(path), "%s/hci%d/%s", DEVICE_PATH, dbus_data->dev_id, BLUEZ_HCI);
+
+ signal = dbus_message_new_signal(path, DEV_HCI_INTERFACE,
+ BLUEZ_HCI_REMOTE_NAME);
+
+ dbus_message_append_args(signal,
+ DBUS_TYPE_STRING, &str_bdaddr,
+ DBUS_TYPE_STRING, &name,
+ DBUS_TYPE_INVALID);
+
+ if (dbus_connection_send(connection, signal, NULL) == FALSE) {
+ syslog(LOG_ERR, "Can't send D-BUS remote name signal message");
+ goto failed;
+ }
+
+ dbus_message_unref(signal);
+ free(name);
+
+ } else {
+
+ /* Send HCI command */
+ dd = hci_open_dev(dbus_data->dev_id);
+ if (dd < 0) {
+ syslog(LOG_ERR, "Unable to open device %d: %s (%d)",
+ dbus_data->dev_id, strerror(errno), errno);
+ reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_OFFSET + errno);
+ goto failed;
+ }
+
+ memset(&cp, 0, sizeof(cp));
+ cp.bdaddr = bdaddr;
+ cp.pscan_rep_mode = 0x02;
+
+ memset(&rq, 0, sizeof(rq));
+ rq.ogf = OGF_LINK_CTL;
+ rq.ocf = OCF_REMOTE_NAME_REQ;
+ rq.cparam = &cp;
+ rq.clen = REMOTE_NAME_REQ_CP_SIZE;
+ rq.rparam = &rp;
+ rq.rlen = EVT_CMD_STATUS_SIZE;
+ rq.event = EVT_CMD_STATUS;
+
+ if (hci_send_req(dd, &rq, 100) < 0) {
+ syslog(LOG_ERR, "Unable to send remote name request: %s (%d)",
+ strerror(errno), errno);
+ reply = bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_OFFSET | errno);
+ goto failed;
+ }
+
+ if (rp.status) {
+ syslog(LOG_ERR, "Remote name request failed");
+ reply = bluez_new_failure_msg(msg, BLUEZ_EBT_OFFSET | rp.status);
+ goto failed;
+ }
}
reply = dbus_message_new_method_return(msg);
-
failed:
if (dd >= 0)
hci_close_dev(dd);