diff options
| author | Marcel Holtmann <marcel@holtmann.org> | 2006-02-09 15:56:37 +0000 | 
|---|---|---|
| committer | Marcel Holtmann <marcel@holtmann.org> | 2006-02-09 15:56:37 +0000 | 
| commit | 2210fda2d9ff2d751fc1ba97e03f6006e4802690 (patch) | |
| tree | f1a65f3a6d325604c1ebe07535b329100f284617 /hcid/dbus.c | |
| parent | 0722d48e5cd78d94fc66e27de13a726ad81d3425 (diff) | |
Read remote name from cache first before sending a request
Diffstat (limited to 'hcid/dbus.c')
| -rw-r--r-- | hcid/dbus.c | 104 | 
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); | 
