diff options
| -rw-r--r-- | hcid/dbus.c | 88 | ||||
| -rw-r--r-- | hcid/hcid.h | 11 | ||||
| -rw-r--r-- | hcid/security.c | 53 | 
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); | 
