diff options
| -rw-r--r-- | hcid/dbus-device.c | 121 | ||||
| -rw-r--r-- | hcid/dbus.c | 48 | ||||
| -rw-r--r-- | hcid/dbus.h | 30 | ||||
| -rw-r--r-- | hcid/hcid.h | 2 | ||||
| -rw-r--r-- | hcid/security.c | 3 | 
5 files changed, 34 insertions, 170 deletions
| diff --git a/hcid/dbus-device.c b/hcid/dbus-device.c index 811d06b2..96dc7fba 100644 --- a/hcid/dbus-device.c +++ b/hcid/dbus-device.c @@ -175,7 +175,7 @@ static DBusMessage* handle_dev_set_name_req(DBusMessage *msg, void *data)  	return reply;  } -static DBusMessage* handle_dev_get_alias_req(DBusMessage *msg, void *data) +static DBusMessage* handle_dev_get_remote_alias_req(DBusMessage *msg, void *data)  {  	struct hci_dbus_data *dbus_data = data;  	DBusMessageIter iter; @@ -201,7 +201,7 @@ static DBusMessage* handle_dev_get_alias_req(DBusMessage *msg, void *data)  	return reply;  } -static DBusMessage* handle_dev_set_alias_req(DBusMessage *msg, void *data) +static DBusMessage* handle_dev_set_remote_alias_req(DBusMessage *msg, void *data)  {  	struct hci_dbus_data *dbus_data = data;  	DBusConnection *connection = get_dbus_connection(); @@ -224,17 +224,7 @@ static DBusMessage* handle_dev_set_alias_req(DBusMessage *msg, void *data)  	set_device_alias(dbus_data->dev_id, &bdaddr, str_ptr); -	signal = dev_signal_factory(dbus_data->dev_id, "AliasChanged", -						DBUS_TYPE_STRING, &addr_ptr, -						DBUS_TYPE_STRING, &str_ptr, -						DBUS_TYPE_INVALID); -	if (signal) { -		dbus_connection_send(connection, signal, NULL); -		dbus_connection_flush(connection); -		dbus_message_unref(signal); -	} - -	signal = dev_signal_factory(dbus_data->dev_id, "RemoteAlias", +	signal = dev_signal_factory(dbus_data->dev_id, DEV_SIG_REMOTE_ALIAS_CHANGED,  						DBUS_TYPE_STRING, &addr_ptr,  						DBUS_TYPE_STRING, &str_ptr,  						DBUS_TYPE_INVALID); @@ -539,110 +529,40 @@ static DBusMessage* handle_dev_last_used_req(DBusMessage *msg, void *data)  	return bluez_new_failure_msg(msg, BLUEZ_EDBUS_NOT_IMPLEMENTED);  } -static DBusMessage* handle_dev_remote_alias_req(DBusMessage *msg, void *data) +static DBusMessage* handle_dev_get_remote_name_req(DBusMessage *msg, void *data)  { -	/*FIXME: */ -	return bluez_new_failure_msg(msg, BLUEZ_EDBUS_NOT_IMPLEMENTED); -} - -static DBusMessage* handle_dev_remote_name_req(DBusMessage *msg, void *data) -{ -	DBusConnection *connection = get_dbus_connection(); -	DBusMessage *reply = NULL; -	DBusMessage *signal = NULL;  	struct hci_dbus_data *dbus_data = data; +	DBusMessage *reply = NULL;  	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); +	dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &str_bdaddr, +							DBUS_TYPE_INVALID);  	str2ba(str_bdaddr, &bdaddr); +  	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; +		return bluez_new_failure_msg(msg, BLUEZ_ESYSTEM_ENODEV);  	} -	/* Try retrieve from local cache */  	name = get_peer_name(&di.bdaddr, &bdaddr); -	if (name) { - -		reply = dbus_message_new_method_return(msg); - -		snprintf(path, sizeof(path), "%s/hci%d", DEVICE_PATH, dbus_data->dev_id); +	if (!name) +		return bluez_new_failure_msg(msg, BLUEZ_EDBUS_RECORD_NOT_FOUND); -		signal = dbus_message_new_signal(path, DEVICE_INTERFACE, -							DEV_SIG_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; -		} +	reply = dbus_message_new_method_return(msg); -		if (rp.status) { -			syslog(LOG_ERR, "Remote name request failed"); -			reply = bluez_new_failure_msg(msg, BLUEZ_EBT_OFFSET | rp.status); -			goto failed; -		} -	} +	dbus_message_append_args(reply, DBUS_TYPE_STRING, &name, +					DBUS_TYPE_INVALID); -	reply = dbus_message_new_method_return(msg); -failed: -	if (dd >= 0) -		hci_close_dev(dd); +	free(name);  	return reply;  } -static DBusMessage* handle_dev_remote_version_req(DBusMessage *msg, void *data) +static DBusMessage* handle_dev_get_remote_version_req(DBusMessage *msg, void *data)  {  	/*FIXME: */  	return bluez_new_failure_msg(msg, BLUEZ_EDBUS_NOT_IMPLEMENTED); @@ -884,7 +804,6 @@ static DBusMessage* handle_dev_encryption_key_size_req(DBusMessage *msg, void *d  static const struct service_data dev_services[] = {  	{ DEV_GET_ADDRESS,		handle_dev_get_address_req,		DEV_GET_ADDRESS_SIGNATURE		}, -	{ DEV_GET_ALIAS,		handle_dev_get_alias_req,		DEV_GET_ALIAS_SIGNATURE			},  	{ DEV_GET_COMPANY,		handle_dev_get_company_req,		DEV_GET_COMPANY_SIGNATURE		},  	{ DEV_GET_DISCOVERABLE_TO,	handle_dev_get_discoverable_to_req,	DEV_GET_DISCOVERABLE_TO_SIGNATURE	},  	{ DEV_GET_FEATURES,		handle_dev_get_features_req,		DEV_GET_FEATURES_SIGNATURE		}, @@ -897,7 +816,6 @@ static const struct service_data dev_services[] = {  	{ DEV_IS_CONNECTABLE,		handle_dev_is_connectable_req,		DEV_IS_CONNECTABLE_SIGNATURE		},  	{ DEV_IS_DISCOVERABLE,		handle_dev_is_discoverable_req,		DEV_IS_DISCOVERABLE_SIGNATURE		}, -	{ DEV_SET_ALIAS,		handle_dev_set_alias_req,		DEV_SET_ALIAS_SIGNATURE			},  	{ DEV_SET_CLASS,		handle_dev_set_class_req,		DEV_SET_CLASS_SIGNATURE			},  	{ DEV_SET_DISCOVERABLE_TO,	handle_dev_set_discoverable_to_req,	DEV_SET_DISCOVERABLE_TO_SIGNATURE	},  	{ DEV_SET_MODE,			handle_dev_set_mode_req,		DEV_SET_MODE_SIGNATURE			}, @@ -911,9 +829,10 @@ static const struct service_data dev_services[] = {  	{ DEV_LAST_SEEN,		handle_dev_last_seen_req,		DEV_LAST_SEEN_SIGNATURE			},  	{ DEV_LAST_USED,		handle_dev_last_used_req,		DEV_LAST_USED_SIGNATURE			}, -	{ DEV_REMOTE_ALIAS,		handle_dev_remote_alias_req,		DEV_REMOTE_ALIAS_SIGNATURE		}, -	{ DEV_REMOTE_NAME,		handle_dev_remote_name_req,		DEV_REMOTE_NAME_SIGNATURE		}, -	{ DEV_REMOTE_VERSION,		handle_dev_remote_version_req,		DEV_REMOTE_VERSION_SIGNATURE		}, +	{ DEV_SET_REMOTE_ALIAS,		handle_dev_set_remote_alias_req,	DEV_SET_REMOTE_ALIAS_SIGNATURE		}, +	{ DEV_GET_REMOTE_ALIAS,		handle_dev_get_remote_alias_req,	DEV_GET_REMOTE_ALIAS_SIGNATURE		}, +	{ DEV_GET_REMOTE_NAME,		handle_dev_get_remote_name_req,		DEV_GET_REMOTE_NAME_SIGNATURE		}, +	{ DEV_GET_REMOTE_VERSION,	handle_dev_get_remote_version_req,	DEV_GET_REMOTE_VERSION_SIGNATURE	},  	{ DEV_CREATE_BONDING,		handle_dev_create_bonding_req,		DEV_CREATE_BONDING_SIGNATURE		},  	{ DEV_LIST_BONDINGS,		handle_dev_list_bondings_req,		DEV_LIST_BONDINGS_SIGNATURE		}, diff --git a/hcid/dbus.c b/hcid/dbus.c index b92e9b77..be348b2c 100644 --- a/hcid/dbus.c +++ b/hcid/dbus.c @@ -643,7 +643,7 @@ void hcid_dbus_remote_name(bdaddr_t *local, bdaddr_t *peer, char *name)  	snprintf(path, sizeof(path), "%s/hci%d", DEVICE_PATH, id);  	message = dbus_message_new_signal(path, DEVICE_INTERFACE, -						DEV_REMOTE_NAME); +						DEV_SIG_REMOTE_NAME_CHANGED);  	if (message == NULL) {  		syslog(LOG_ERR, "Can't allocate D-BUS remote name message");  		goto failed; @@ -669,52 +669,6 @@ failed:  	bt_free(peer_addr);  } -void hcid_dbus_remote_name_failed(bdaddr_t *local, bdaddr_t *peer, uint8_t status) -{ -	DBusMessage *message = NULL; -	char path[MAX_PATH_LENGTH]; -	char *local_addr, *peer_addr; -	bdaddr_t tmp; -	int id; - -	baswap(&tmp, local); local_addr = batostr(&tmp); -	baswap(&tmp, peer); peer_addr = batostr(&tmp); - -	id = hci_devid(local_addr); -	if (id < 0) { -		syslog(LOG_ERR, "No matching device id for %s", local_addr); -		goto failed; -	} - -	snprintf(path, sizeof(path), "%s/hci%d", DEVICE_PATH, id); - -	message = dbus_message_new_signal(path, DEVICE_INTERFACE, -						DEV_SIG_REMOTE_NAME_FAILED); -	if (message == NULL) { -		syslog(LOG_ERR, "Can't allocate D-BUS remote name message"); -		goto failed; -	} - -	dbus_message_append_args(message, -					DBUS_TYPE_STRING, &peer_addr, -					DBUS_TYPE_BYTE, &status, -					DBUS_TYPE_INVALID); - -	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: -	if (message) -		dbus_message_unref(message); - -	bt_free(local_addr); -	bt_free(peer_addr); -} -  void hcid_dbus_conn_complete(bdaddr_t *local, bdaddr_t *peer)  {  } diff --git a/hcid/dbus.h b/hcid/dbus.h index 0be5da36..666bf2de 100644 --- a/hcid/dbus.h +++ b/hcid/dbus.h @@ -109,7 +109,6 @@ int get_default_dev_id(void);      BlueZ D-Bus Device path definitions "/org/bluez/Device"   *========================================================================*/  #define DEV_GET_ADDRESS			"GetAddress" -#define DEV_GET_ALIAS			"GetAlias"  #define DEV_GET_COMPANY			"GetCompany"  #define DEV_GET_DISCOVERABLE_TO		"GetDiscoverableTimeout"  #define DEV_GET_FEATURES		"GetFeatures" @@ -120,7 +119,6 @@ int get_default_dev_id(void);  #define DEV_GET_VERSION			"GetVersion"  #define DEV_IS_CONNECTABLE		"IsConnectable"  #define DEV_IS_DISCOVERABLE		"IsDiscoverable" -#define DEV_SET_ALIAS			"SetAlias"  #define DEV_SET_CLASS			"SetClass"  #define DEV_SET_DISCOVERABLE_TO		"SetDiscoverableTimeout"  #define DEV_SET_MODE			"SetMode" @@ -131,9 +129,10 @@ int get_default_dev_id(void);  #define DEV_DISCOVER_SERVICE		"DiscoverService"  #define DEV_LAST_SEEN			"LastSeen"  #define DEV_LAST_USED			"LastUsed" -#define DEV_REMOTE_ALIAS		"RemoteAlias" -#define DEV_REMOTE_NAME			"RemoteName" -#define DEV_REMOTE_VERSION		"RemoteVersion" +#define DEV_SET_REMOTE_ALIAS		"SetRemoteAlias" +#define DEV_GET_REMOTE_ALIAS		"GetRemoteAlias" +#define DEV_GET_REMOTE_NAME		"GetRemoteName" +#define DEV_GET_REMOTE_VERSION		"GetRemoteVersion"  #define DEV_CREATE_BONDING		"CreateBonding"  #define DEV_LIST_BONDINGS		"ListBondings"  #define DEV_HAS_BONDING_NAME		"HasBonding" @@ -144,8 +143,6 @@ int get_default_dev_id(void);  /*FIXME: maybe this section can be moved to a internal header file */  /* Device service signature */  #define DEV_GET_ADDRESS_SIGNATURE			__END_SIG__ -#define DEV_GET_ALIAS_SIGNATURE				DBUS_TYPE_STRING_AS_STRING \ -							__END_SIG__  #define DEV_GET_COMPANY_SIGNATURE			__END_SIG__  #define DEV_GET_DISCOVERABLE_TO_SIGNATURE		__END_SIG__  #define DEV_GET_FEATURES_SIGNATURE			__END_SIG__ @@ -156,9 +153,6 @@ int get_default_dev_id(void);  #define DEV_GET_VERSION_SIGNATURE			__END_SIG__  #define DEV_IS_CONNECTABLE_SIGNATURE			__END_SIG__  #define DEV_IS_DISCOVERABLE_SIGNATURE			__END_SIG__ -#define DEV_SET_ALIAS_SIGNATURE				DBUS_TYPE_STRING_AS_STRING \ -							DBUS_TYPE_STRING_AS_STRING \ -							__END_SIG__  #define DEV_SET_CLASS_SIGNATURE				DBUS_TYPE_STRING_AS_STRING \  							DBUS_TYPE_STRING_AS_STRING \  							__END_SIG__ @@ -177,11 +171,14 @@ int get_default_dev_id(void);  							__END_SIG__  #define DEV_LAST_USED_SIGNATURE				DBUS_TYPE_STRING_AS_STRING \  							__END_SIG__ -#define DEV_REMOTE_ALIAS_SIGNATURE			DBUS_TYPE_STRING_AS_STRING \ +#define DEV_SET_REMOTE_ALIAS_SIGNATURE			DBUS_TYPE_STRING_AS_STRING \ +							DBUS_TYPE_STRING_AS_STRING \ +							__END_SIG__ +#define DEV_GET_REMOTE_ALIAS_SIGNATURE			DBUS_TYPE_STRING_AS_STRING \  							__END_SIG__ -#define DEV_REMOTE_NAME_SIGNATURE			DBUS_TYPE_STRING_AS_STRING \ +#define DEV_GET_REMOTE_NAME_SIGNATURE			DBUS_TYPE_STRING_AS_STRING \  							__END_SIG__ -#define DEV_REMOTE_VERSION_SIGNATURE			DBUS_TYPE_STRING_AS_STRING \ +#define DEV_GET_REMOTE_VERSION_SIGNATURE		DBUS_TYPE_STRING_AS_STRING \  							__END_SIG__  #define DEV_CREATE_BONDING_SIGNATURE			DBUS_TYPE_STRING_AS_STRING \  							__END_SIG__ @@ -199,11 +196,8 @@ int get_default_dev_id(void);  /* Signals sent in the Manager path */  #define	DEV_SIG_MODE_CHANGED		"ModeChanged"  #define DEV_SIG_NAME_CHANGED		"NameChanged" -#define DEV_SIG_ALIAS_CHANGED		"AliasChanged" -#define DEV_SIG_REMOTE_NAME		"RemoteName" -#define DEV_SIG_REMOTE_NAME_FAILED	"RemoteNameFailed" -#define DEV_SIG_REMOTE_ALIAS		"RemoteAlias" -#define DEV_SIG_REMOTE_VERSION		"RemoteVersion" +#define DEV_SIG_REMOTE_NAME_CHANGED	"RemoteNameChange" +#define DEV_SIG_REMOTE_ALIAS_CHANGED	"RemoteAliasChanged"  #define DEV_SIG_BONDING_CREATED		"BondingCreated"  #define DEV_SIG_BONDING_FAILED		"BondingFailed"  #define DEV_SIG_BONDING_REMOVED		"BondingRemoved" diff --git a/hcid/hcid.h b/hcid/hcid.h index 52e44f32..87afaaa2 100644 --- a/hcid/hcid.h +++ b/hcid/hcid.h @@ -128,7 +128,6 @@ void hcid_dbus_inquiry_start(bdaddr_t *local);  void hcid_dbus_inquiry_complete(bdaddr_t *local);  void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class, int8_t rssi);  void hcid_dbus_remote_name(bdaddr_t *local, bdaddr_t *peer, char *name); -void hcid_dbus_remote_name_failed(bdaddr_t *local, bdaddr_t *peer, uint8_t status);  void hcid_dbus_conn_complete(bdaddr_t *local, bdaddr_t *peer);  void hcid_dbus_disconn_complete(bdaddr_t *local, bdaddr_t *peer, uint8_t reason);  void hcid_dbus_bonding_created_complete(bdaddr_t *local, bdaddr_t *peer, const uint8_t status); @@ -139,7 +138,6 @@ static inline void hcid_dbus_inquiry_start(bdaddr_t *local) {}  static inline void hcid_dbus_inquiry_complete(bdaddr_t *local) {}  static inline void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class, int8_t rssi) {}  static inline void hcid_dbus_remote_name(bdaddr_t *local, bdaddr_t *peer, char *name) {} -static inline void hcid_dbus_remote_name_failed(bdaddr_t *local, bdaddr_t *peer, uint8_t status) {}  static inline void hcid_dbus_conn_complete(bdaddr_t *local, bdaddr_t *peer) {}  static inline void hcid_dbus_disconn_complete(bdaddr_t *local, bdaddr_t *peer, uint8_t reason) {}  static inline void hcid_dbus_bonding_created_complete(bdaddr_t *local, bdaddr_t *peer, const uint8_t status) {} diff --git a/hcid/security.c b/hcid/security.c index 2c76f167..ba00fb80 100644 --- a/hcid/security.c +++ b/hcid/security.c @@ -426,8 +426,7 @@ static inline void remote_name_information(int dev, bdaddr_t *sba, void *ptr)  		memcpy(name, evt->name, 248);  		write_device_name(sba, &dba, name);  		hcid_dbus_remote_name(sba, &dba, name); -	} else -		hcid_dbus_remote_name_failed(sba, &dba, evt->status); +	}  }  static inline void remote_version_information(int dev, bdaddr_t *sba, void *ptr) | 
