summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2005-07-07 16:50:07 +0000
committerMarcel Holtmann <marcel@holtmann.org>2005-07-07 16:50:07 +0000
commit20f65cf4e0ab67ac3e528d84a877a5fe6161904a (patch)
tree65def04cf7021baf8b72013dcfb320ed9fa79cef
parente2a54220b404119a2516a3cac5edc5b2bcf6089a (diff)
Send D-Bus messages for inquiry results and remote name resolves
-rw-r--r--hcid/dbus.c88
-rw-r--r--hcid/hcid.h11
-rw-r--r--hcid/security.c53
3 files changed, 151 insertions, 1 deletions
diff --git a/hcid/dbus.c b/hcid/dbus.c
index 683cf6fb..69a3a6cb 100644
--- a/hcid/dbus.c
+++ b/hcid/dbus.c
@@ -170,6 +170,94 @@ failed:
OCF_PIN_CODE_NEG_REPLY, 6, &ci->bdaddr);
}
+void hcid_dbus_inquiry_result(const bdaddr_t *local, const bdaddr_t *peer)
+{
+ DBusMessage *message;
+#ifndef HAVE_DBUS_MESSAGE_APPEND_ARGS
+ DBusMessageIter iter;
+#endif
+ char local_addr[18], peer_addr[18];
+
+ ba2str(local, local_addr);
+ ba2str(peer, peer_addr);
+
+ message = dbus_message_new_signal("/org/bluez/DevAgent",
+ "org.bluez.DevAgent", "InquiryResult");
+ if (message == NULL) {
+ syslog(LOG_ERR, "Can't allocate D-BUS inquiry result message");
+ goto failed;
+ }
+
+#ifdef HAVE_DBUS_MESSAGE_APPEND_ARGS
+ dbus_message_append_args(message,
+ DBUS_TYPE_STRING, local_addr,
+ DBUS_TYPE_STRING, peer_addr,
+ DBUS_TYPE_INVALID);
+#else
+ dbus_message_append_iter_init(message, &iter);
+
+ dbus_message_iter_append_string(&iter, local_addr);
+ dbus_message_iter_append_string(&iter, peer_addr);
+#endif
+
+ if (dbus_connection_send(connection, message, NULL) == FALSE) {
+ syslog(LOG_ERR, "Can't send D-BUS inquiry result message");
+ goto failed;
+ }
+
+ dbus_connection_flush(connection);
+
+failed:
+ dbus_message_unref(message);
+
+ return;
+}
+
+void hcid_dbus_remote_name(const bdaddr_t *local, const bdaddr_t *peer, const char *name)
+{
+ DBusMessage *message;
+#ifndef HAVE_DBUS_MESSAGE_APPEND_ARGS
+ DBusMessageIter iter;
+#endif
+ char local_addr[18], peer_addr[18];
+
+ ba2str(local, local_addr);
+ ba2str(peer, peer_addr);
+
+ message = dbus_message_new_signal("/org/bluez/DevAgent",
+ "org.bluez.DevAgent", "RemoteName");
+ if (message == NULL) {
+ syslog(LOG_ERR, "Can't allocate D-BUS remote name message");
+ goto failed;
+ }
+
+#ifdef HAVE_DBUS_MESSAGE_APPEND_ARGS
+ dbus_message_append_args(message,
+ DBUS_TYPE_STRING, local_addr,
+ DBUS_TYPE_STRING, peer_addr,
+ DBUS_TYPE_STRING, name,
+ DBUS_TYPE_INVALID);
+#else
+ dbus_message_append_iter_init(message, &iter);
+
+ dbus_message_iter_append_string(&iter, local_addr);
+ dbus_message_iter_append_string(&iter, peer_addr);
+ dbus_message_iter_append_string(&iter, name);
+#endif
+
+ if (dbus_connection_send(connection, message, NULL) == FALSE) {
+ syslog(LOG_ERR, "Can't send D-BUS remote name message");
+ goto failed;
+ }
+
+ dbus_connection_flush(connection);
+
+failed:
+ dbus_message_unref(message);
+
+ return;
+}
+
gboolean watch_func(GIOChannel *chan, GIOCondition cond, gpointer data)
{
DBusWatch *watch = (DBusWatch *) data;
diff --git a/hcid/hcid.h b/hcid/hcid.h
index c64016ea..5e835807 100644
--- a/hcid/hcid.h
+++ b/hcid/hcid.h
@@ -121,8 +121,17 @@ void stop_security_manager(int hdev);
void toggle_pairing(int enable);
#ifdef ENABLE_DBUS
-void hcid_dbus_request_pin(int dev, struct hci_conn_info *ci);
gboolean hcid_dbus_init(void);
+void hcid_dbus_request_pin(int dev, struct hci_conn_info *ci);
+void hcid_dbus_inquiry_result(const bdaddr_t *local, const bdaddr_t *peer);
+void hcid_dbus_remote_name(const bdaddr_t *local, const bdaddr_t *peer, const char *name);
+#else
+static inline void hcid_dbus_inquiry_result(const bdaddr_t *local, const bdaddr_t *peer)
+{
+}
+static inline void hcid_dbus_remote_name(const bdaddr_t *local, const bdaddr_t *peer, const char *name)
+{
+}
#endif
int write_device_name(const bdaddr_t *local, const bdaddr_t *peer, const char *name);
diff --git a/hcid/security.c b/hcid/security.c
index 04f5b9b8..148c3237 100644
--- a/hcid/security.c
+++ b/hcid/security.c
@@ -471,6 +471,8 @@ static void remote_name_information(int dev, bdaddr_t *sba, void *ptr)
if (evt->status)
return;
+ hcid_dbus_remote_name(sba, dba, (char *) evt->name);
+
write_device_name(sba, dba, (char *) evt->name);
}
@@ -489,6 +491,47 @@ static void remote_version_information(int dev, bdaddr_t *sba, void *ptr)
evt->lmp_ver, btohs(evt->lmp_subver));
}
+static void inquiry_result(int dev, bdaddr_t *sba, int plen, void *ptr)
+{
+ uint8_t num = *(uint8_t *)ptr++;
+ int i;
+
+ for (i = 0; i < num; i++) {
+ inquiry_info *info = ptr;
+
+ hcid_dbus_inquiry_result(sba, &info->bdaddr);
+
+ ptr += INQUIRY_INFO_SIZE;
+ }
+}
+
+static void inquiry_result_with_rssi(int dev, bdaddr_t *sba, int plen, void *ptr)
+{
+ uint8_t num = *(uint8_t *)ptr++;
+ int i;
+
+ if (!num)
+ return;
+
+ if ((plen - 1) / num == INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE) {
+ for (i = 0; i < num; i++) {
+ inquiry_info_with_rssi_and_pscan_mode *info = ptr;
+
+ hcid_dbus_inquiry_result(sba, &info->bdaddr);
+
+ ptr += INQUIRY_INFO_WITH_RSSI_AND_PSCAN_MODE_SIZE;
+ }
+ } else {
+ for (i = 0; i < num; i++) {
+ inquiry_info_with_rssi *info = ptr;
+
+ hcid_dbus_inquiry_result(sba, &info->bdaddr);
+
+ ptr += INQUIRY_INFO_WITH_RSSI_SIZE;
+ }
+ }
+}
+
static void remote_features_information(int dev, bdaddr_t *sba, void *ptr)
{
evt_read_remote_features_complete *evt = ptr;
@@ -553,6 +596,14 @@ static gboolean io_security_event(GIOChannel *chan, GIOCondition cond, gpointer
case EVT_READ_REMOTE_FEATURES_COMPLETE:
remote_features_information(dev, &di->bdaddr, ptr);
break;
+
+ case EVT_INQUIRY_RESULT:
+ inquiry_result(dev, &di->bdaddr, eh->plen, ptr);
+ break;
+
+ case EVT_INQUIRY_RESULT_WITH_RSSI:
+ inquiry_result_with_rssi(dev, &di->bdaddr, eh->plen, ptr);
+ break;
}
if (hci_test_bit(HCI_SECMGR, &di->flags))
@@ -608,6 +659,8 @@ void start_security_manager(int hdev)
hci_filter_set_event(EVT_REMOTE_NAME_REQ_COMPLETE, &flt);
hci_filter_set_event(EVT_READ_REMOTE_VERSION_COMPLETE, &flt);
hci_filter_set_event(EVT_READ_REMOTE_FEATURES_COMPLETE, &flt);
+ hci_filter_set_event(EVT_INQUIRY_RESULT, &flt);
+ hci_filter_set_event(EVT_INQUIRY_RESULT_WITH_RSSI, &flt);
if (setsockopt(dev, SOL_HCI, HCI_FILTER, &flt, sizeof(flt)) < 0) {
syslog(LOG_ERR, "Can't set filter on hci%d: %s (%d)",
hdev, strerror(errno), errno);