diff options
| author | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2008-06-04 09:05:02 +0000 | 
|---|---|---|
| committer | Claudio Takahasi <claudio.takahasi@openbossa.org> | 2008-06-04 09:05:02 +0000 | 
| commit | 1b400b2559c799f260a832ae7a0e63d94fd21428 (patch) | |
| tree | f8040b14cf9e9e088a09d1788fc6a02b7de51723 | |
| parent | 82b164d00e2ee3426ce90d8b70eeec44e810f42d (diff) | |
Changed old Adapter methods to use gdbus
| -rw-r--r-- | hcid/adapter.c | 1133 | ||||
| -rw-r--r-- | hcid/adapter.h | 1 | ||||
| -rw-r--r-- | hcid/dbus-error.c | 7 | ||||
| -rw-r--r-- | hcid/dbus-error.h | 1 | ||||
| -rw-r--r-- | hcid/dbus-hci.c | 176 | ||||
| -rw-r--r-- | hcid/dbus-sdp.c | 75 | ||||
| -rw-r--r-- | hcid/dbus-sdp.h | 14 | 
7 files changed, 691 insertions, 716 deletions
| diff --git a/hcid/adapter.c b/hcid/adapter.c index 95e45053..418b32be 100644 --- a/hcid/adapter.c +++ b/hcid/adapter.c @@ -236,6 +236,24 @@ static inline DBusMessage *in_progress(DBusMessage *msg, const char *str)  	return g_dbus_create_error(msg, ERROR_INTERFACE ".InProgress", str);  } +static inline DBusMessage *not_in_progress(DBusMessage *msg, const char *str) +{ +	return g_dbus_create_error(msg, ERROR_INTERFACE ".NotInProgress", str); +} + +static inline DBusMessage *not_authorized(DBusMessage *msg) +{ +	return g_dbus_create_error(msg, ERROR_INTERFACE ".NotAuthorized", +			"Not authorized"); +} + +static inline DBusMessage *unsupported_major_class(DBusMessage *msg) +{ +	return g_dbus_create_error(msg, +			ERROR_INTERFACE ".UnsupportedMajorClass", +			"Unsupported Major Class"); +} +  int pending_remote_name_cancel(struct adapter *adapter)  {  	struct remote_dev_info *dev, match; @@ -356,8 +374,8 @@ uint8_t str2mode(const char *addr, const char *mode)  		return MODE_UNKNOWN;  } -static DBusHandlerResult adapter_get_info(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_get_info(DBusConnection *conn, +				DBusMessage *msg, void *data)  {  	struct adapter *adapter = data;  	const char *property; @@ -369,11 +387,11 @@ static DBusHandlerResult adapter_get_info(DBusConnection *conn,  	uint8_t cls[3];  	if (check_address(adapter->address) < 0) -		return error_not_ready(conn, msg); +		return adapter_not_ready(msg);  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_iter_init_append(reply, &iter); @@ -436,34 +454,34 @@ static DBusHandlerResult adapter_get_info(DBusConnection *conn,  	dbus_message_iter_close_container(&iter, &dict); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_get_address(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_get_address(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	struct adapter *adapter = data;  	const char *paddr = adapter->address;  	DBusMessage *reply;  	if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (check_address(paddr) < 0) -		return error_not_ready(conn, msg); +		return adapter_not_ready(msg);  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_append_args(reply, DBUS_TYPE_STRING, &paddr,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_get_version(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_get_version(DBusConnection *conn, +				DBusMessage *msg, void *data)  {  	struct adapter *adapter = data;  	DBusMessage *reply; @@ -471,24 +489,24 @@ static DBusHandlerResult adapter_get_version(DBusConnection *conn,  	int err;  	if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	err = get_device_version(adapter->dev_id, str, sizeof(str));  	if (err < 0) -		return error_failed_errno(conn, msg, -err); +		return failed_strerror(msg, -err);  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_append_args(reply, DBUS_TYPE_STRING, &str_ptr,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_get_revision(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_get_revision(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	struct adapter *adapter = data;  	DBusMessage *reply; @@ -496,24 +514,24 @@ static DBusHandlerResult adapter_get_revision(DBusConnection *conn,  	int err;  	if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	err = get_device_revision(adapter->dev_id, str, sizeof(str));  	if (err < 0) -		return error_failed_errno(conn, msg, -err); +		return failed_strerror(msg, -err);  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_append_args(reply, DBUS_TYPE_STRING, &str_ptr,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_get_manufacturer(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_get_manufacturer(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	struct adapter *adapter = data;  	DBusMessage *reply; @@ -521,24 +539,24 @@ static DBusHandlerResult adapter_get_manufacturer(DBusConnection *conn,  	int err;  	if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	err = get_device_manufacturer(adapter->dev_id, str, sizeof(str));  	if (err < 0) -		return error_failed_errno(conn, msg, -err); +		return failed_strerror(msg, -err);  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_append_args(reply, DBUS_TYPE_STRING, &str_ptr,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_get_company(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_get_company(DBusConnection *conn, +				DBusMessage *msg, void *data)  {  	struct adapter *adapter = data;  	DBusMessage *reply; @@ -546,24 +564,24 @@ static DBusHandlerResult adapter_get_company(DBusConnection *conn,  	int err;  	if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	err = get_device_company(adapter->dev_id, str, sizeof(str));  	if (err < 0) -		return error_failed_errno(conn, msg, -err); +		return failed_strerror(msg, -err);  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_append_args(reply, DBUS_TYPE_STRING, &str_ptr,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_list_modes(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_list_modes(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	DBusMessage *reply;  	DBusMessageIter iter; @@ -572,11 +590,11 @@ static DBusHandlerResult adapter_list_modes(DBusConnection *conn,  	int i;  	if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_iter_init_append(reply, &iter);  	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, @@ -587,10 +605,10 @@ static DBusHandlerResult adapter_list_modes(DBusConnection *conn,  	dbus_message_iter_close_container(&iter, &array_iter); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_get_mode(DBusConnection *conn, +static DBusMessage *adapter_get_mode(DBusConnection *conn,  						DBusMessage *msg, void *data)  {  	const struct adapter *adapter = data; @@ -598,18 +616,18 @@ static DBusHandlerResult adapter_get_mode(DBusConnection *conn,  	const char *mode;  	if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	mode = mode2str(adapter->mode);  	dbus_message_append_args(reply, DBUS_TYPE_STRING, &mode,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  }  static DBusMessage *set_mode(DBusConnection *conn, DBusMessage *msg, @@ -800,60 +818,48 @@ static DBusMessage *confirm_mode(DBusConnection *conn, DBusMessage *msg,  	return NULL;  } -static DBusHandlerResult adapter_set_mode(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_set_mode(DBusConnection *conn, +				DBusMessage *msg, void *data)  {  	struct adapter *adapter = data;  	const char *mode; -	DBusMessage *reply;  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &mode,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (!mode) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	adapter->global_mode = str2mode(adapter->address, mode); -	if (adapter->global_mode == adapter->mode) { -		reply = dbus_message_new_method_return(msg); -		if (!reply) -			return DBUS_HANDLER_RESULT_NEED_MEMORY; - -		return send_message_and_unref(conn, reply); -	} +	if (adapter->global_mode == adapter->mode) +		return dbus_message_new_method_return(msg);  	if (adapter->sessions && adapter->global_mode < adapter->mode) -		return send_message_and_unref(conn, -				confirm_mode(conn, msg, mode, data)); +		return confirm_mode(conn, msg, mode, data); -	reply = set_mode(conn, msg, str2mode(adapter->address, mode), data); -	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; - -	return send_message_and_unref(conn, reply); +	return set_mode(conn, msg, str2mode(adapter->address, mode), data);  } -static DBusHandlerResult adapter_get_discoverable_to(DBusConnection *conn, -							DBusMessage *msg, -							void *data) +static DBusMessage *adapter_get_discoverable_to(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	const struct adapter *adapter = data;  	DBusMessage *reply;  	if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_append_args(reply, DBUS_TYPE_UINT32, &adapter->discov_timeout,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  }  static void resolve_paths(DBusMessage *msg, char **old_path, char **new_path) @@ -931,31 +937,25 @@ static DBusMessage *set_discoverable_timeout(DBusConnection *conn,  	return dbus_message_new_method_return(msg);  } -static DBusHandlerResult adapter_set_discoverable_to(DBusConnection *conn, -							DBusMessage *msg, -							void *data) +static DBusMessage *adapter_set_discoverable_to(DBusConnection *conn, +						DBusMessage *msg, void *data)  {  	struct adapter *adapter = data; -	DBusMessage *reply;  	uint32_t timeout;  	if (!adapter->up) -		return error_not_ready(conn, msg); +		return adapter_not_ready(msg);  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_UINT32, &timeout,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); - -	reply = set_discoverable_timeout(conn, msg, timeout, data); -	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return invalid_args(msg); -	return send_message_and_unref(conn, reply); +	return set_discoverable_timeout(conn, msg, timeout, data);  } -static DBusHandlerResult adapter_is_connectable(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_is_connectable(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	const struct adapter *adapter = data;  	DBusMessage *reply; @@ -963,23 +963,23 @@ static DBusHandlerResult adapter_is_connectable(DBusConnection *conn,  	dbus_bool_t connectable = FALSE;  	if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (scan_enable & SCAN_PAGE)  		connectable = TRUE;  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_append_args(reply, DBUS_TYPE_BOOLEAN, &connectable,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_is_discoverable(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_is_discoverable(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	const struct adapter *adapter = data;  	DBusMessage *reply; @@ -987,23 +987,23 @@ static DBusHandlerResult adapter_is_discoverable(DBusConnection *conn,  	dbus_bool_t discoverable = FALSE;  	if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (scan_enable & SCAN_INQUIRY)  		discoverable = TRUE;  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_append_args(reply, DBUS_TYPE_BOOLEAN, &discoverable,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_is_connected(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_is_connected(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	DBusMessage *reply;  	dbus_bool_t connected = FALSE; @@ -1017,10 +1017,10 @@ static DBusHandlerResult adapter_is_connected(DBusConnection *conn,  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &peer_addr,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (check_address(peer_addr) < 0) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	str2ba(peer_addr, &peer_bdaddr); @@ -1030,16 +1030,16 @@ static DBusHandlerResult adapter_is_connected(DBusConnection *conn,  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_append_args(reply, DBUS_TYPE_BOOLEAN, &connected,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_list_connections(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_list_connections(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	DBusMessage *reply;  	DBusMessageIter iter; @@ -1048,11 +1048,11 @@ static DBusHandlerResult adapter_list_connections(DBusConnection *conn,  	GSList *l = adapter->active_conn;  	if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_iter_init_append(reply, &iter);  	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, @@ -1073,38 +1073,38 @@ static DBusHandlerResult adapter_list_connections(DBusConnection *conn,  	dbus_message_iter_close_container(&iter, &array_iter); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_get_major_class(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_get_major_class(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	const struct adapter *adapter = data;  	DBusMessage *reply;  	const char *str_ptr = "computer";  	if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) -		return error_invalid_arguments(conn, msg, NULL); - -	reply = dbus_message_new_method_return(msg); -	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return invalid_args(msg);  	/* FIXME: Currently, only computer major class is supported */  	if ((adapter->class[1] & 0x1f) != 1) -		return error_unsupported_major_class(conn, msg); +		return unsupported_major_class(msg); + +	reply = dbus_message_new_method_return(msg); +	if (!reply) +		return NULL;  	dbus_message_append_args(reply, DBUS_TYPE_STRING, &str_ptr,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_list_minor_classes(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_list_minor_classes(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	const struct adapter *adapter = data; -	DBusMessage *reply = NULL; +	DBusMessage *reply;  	DBusMessageIter iter;  	DBusMessageIter array_iter;  	const char **minor_ptr; @@ -1112,7 +1112,7 @@ static DBusHandlerResult adapter_list_minor_classes(DBusConnection *conn,  	int size, i;  	if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	major_class = adapter->class[1] & 0x1F; @@ -1126,12 +1126,12 @@ static DBusHandlerResult adapter_list_minor_classes(DBusConnection *conn,  		size = sizeof(phone_minor_cls) / sizeof(*phone_minor_cls);  		break;  	default: -		return error_unsupported_major_class(conn, msg); +		return unsupported_major_class(msg);  	}  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_iter_init_append(reply, &iter);  	dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY, @@ -1142,11 +1142,11 @@ static DBusHandlerResult adapter_list_minor_classes(DBusConnection *conn,  	dbus_message_iter_close_container(&iter, &array_iter); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_get_minor_class(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_get_minor_class(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	struct adapter *adapter = data;  	DBusMessage *reply; @@ -1154,15 +1154,11 @@ static DBusHandlerResult adapter_get_minor_class(DBusConnection *conn,  	uint8_t minor_class;  	if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	/* FIXME: Currently, only computer major class is supported */  	if ((adapter->class[1] & 0x1f) != 1) -		return error_unsupported_major_class(conn, msg); - -	reply = dbus_message_new_method_return(msg); -	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return unsupported_major_class(msg);  	minor_class = adapter->class[0] >> 2; @@ -1173,40 +1169,43 @@ static DBusHandlerResult adapter_get_minor_class(DBusConnection *conn,  	str_ptr = computer_minor_cls[minor_class];  failed: +	reply = dbus_message_new_method_return(msg); +	if (!reply) +		return NULL; +  	dbus_message_append_args(reply, DBUS_TYPE_STRING, &str_ptr,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_set_minor_class(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_set_minor_class(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	struct adapter *adapter = data; -	DBusMessage *reply;  	const char *minor;  	uint32_t dev_class = 0xFFFFFFFF;  	int i, dd;  	if (!adapter->up) -		return error_not_ready(conn, msg); +		return adapter_not_ready(msg);  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &minor,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (!minor) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	dd = hci_open_dev(adapter->dev_id);  	if (dd < 0) -		return error_no_such_adapter(conn, msg); +		return no_such_adapter(msg);  	/* Currently, only computer major class is supported */  	if ((adapter->class[1] & 0x1f) != 1) {  		hci_close_dev(dd); -		return error_unsupported_major_class(conn, msg); +		return unsupported_major_class(msg);  	}  	for (i = 0; i < sizeof(computer_minor_cls) / sizeof(*computer_minor_cls); i++)  		if (!strcasecmp(minor, computer_minor_cls[i])) { @@ -1218,7 +1217,7 @@ static DBusHandlerResult adapter_set_minor_class(DBusConnection *conn,  	/* Check if it's a valid minor class */  	if (dev_class == 0xFFFFFFFF) {  		hci_close_dev(dd); -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	}  	/* set the service class and major class  */ @@ -1229,7 +1228,7 @@ static DBusHandlerResult adapter_set_minor_class(DBusConnection *conn,  		error("Can't write class of device on hci%d: %s(%d)",  				adapter->dev_id, strerror(errno), errno);  		hci_close_dev(dd); -		return error_failed_errno(conn, msg, err); +		return failed_strerror(msg, err);  	}  	dbus_connection_emit_signal(conn, dbus_message_get_path(msg), @@ -1237,16 +1236,13 @@ static DBusHandlerResult adapter_set_minor_class(DBusConnection *conn,  					DBUS_TYPE_STRING, &minor,  					DBUS_TYPE_INVALID); -	reply = dbus_message_new_method_return(msg); -  	hci_close_dev(dd); -	return send_message_and_unref(conn, reply); +	return dbus_message_new_method_return(msg);  } -static DBusHandlerResult adapter_get_service_classes(DBusConnection *conn, -							DBusMessage *msg, -							void *data) +static DBusMessage *adapter_get_service_classes(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	struct adapter *adapter = data;  	DBusMessage *reply; @@ -1256,14 +1252,14 @@ static DBusHandlerResult adapter_get_service_classes(DBusConnection *conn,  	int i;  	if (!adapter->up) -		return error_not_ready(conn, msg); +		return adapter_not_ready(msg);  	if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_iter_init_append(reply, &iter); @@ -1280,11 +1276,11 @@ static DBusHandlerResult adapter_get_service_classes(DBusConnection *conn,  	dbus_message_iter_close_container(&iter, &array_iter); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_get_name(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_get_name(DBusConnection *conn, +				DBusMessage *msg, void *data)  {  	struct adapter *adapter = data;  	DBusMessage *reply; @@ -1293,32 +1289,32 @@ static DBusHandlerResult adapter_get_name(DBusConnection *conn,  	bdaddr_t ba;  	if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	str2ba(adapter->address, &ba);  	err = read_local_name(&ba, str);  	if (err < 0) {  		if (!adapter->up) -			return error_not_ready(conn, msg); +			return adapter_not_ready(msg);  		err = get_device_name(adapter->dev_id, str, sizeof(str));  		if (err < 0) -			return error_failed_errno(conn, msg, -err); +			return failed_strerror(msg, -err);  	}  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_append_args(reply, DBUS_TYPE_STRING, &str_ptr,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusMessage *set_name(DBusConnection *conn, DBusMessage *msg, const char *name, -			void *data) +static DBusMessage *set_name(DBusConnection *conn, DBusMessage *msg, +					const char *name, void *data)  {  	struct adapter *adapter = data;  	bdaddr_t bdaddr; @@ -1354,26 +1350,21 @@ done:  	return dbus_message_new_method_return(msg);  } -static DBusHandlerResult adapter_set_name(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_set_name(DBusConnection *conn, +				DBusMessage *msg, void *data)  { -	DBusMessage *reply;  	char *str_ptr;  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &str_ptr,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); - -	reply = set_name(conn, msg, str_ptr, data); -	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return invalid_args(msg); -	return send_message_and_unref(conn, reply); +	return set_name(conn, msg, str_ptr, data);  } -static DBusHandlerResult adapter_get_remote_info(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_get_remote_info(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	struct adapter *adapter = data;  	DBusMessage *reply; @@ -1392,14 +1383,14 @@ static DBusHandlerResult adapter_get_remote_info(DBusConnection *conn,  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &addr_ptr,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (check_address(addr_ptr) < 0) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_iter_init_append(reply, &iter); @@ -1522,44 +1513,41 @@ static DBusHandlerResult adapter_get_remote_info(DBusConnection *conn,  done:  	dbus_message_iter_close_container(&iter, &dict); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_get_remote_svc(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_get_remote_svc(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	return get_remote_svc_rec(conn, msg, data, SDP_FORMAT_BINARY);  } -static DBusHandlerResult adapter_get_remote_svc_xml(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_get_remote_svc_xml(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	return get_remote_svc_rec(conn, msg, data, SDP_FORMAT_XML);  } -static DBusHandlerResult adapter_get_remote_svc_handles(DBusConnection *conn, -							DBusMessage *msg, -							void *data) +static DBusMessage *adapter_get_remote_svc_handles(DBusConnection *conn, +						DBusMessage *msg, void *data)  {  	return get_remote_svc_handles(conn, msg, data);  } -static DBusHandlerResult adapter_get_remote_svc_identifiers(DBusConnection *conn, -								DBusMessage *msg, -								void *data) +static DBusMessage *adapter_get_remote_svc_identifiers(DBusConnection *conn, +						DBusMessage *msg, void *data)  {  	return get_remote_svc_identifiers(conn, msg, data);  } -static DBusHandlerResult adapter_finish_sdp_transact(DBusConnection *conn, -							DBusMessage *msg, -							void *data) +static DBusMessage *adapter_finish_sdp_transact(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	return finish_remote_svc_transact(conn, msg, data);  } -static DBusHandlerResult adapter_get_remote_version(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_get_remote_version(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	struct adapter *adapter = data;  	DBusMessage *reply; @@ -1574,17 +1562,17 @@ static DBusHandlerResult adapter_get_remote_version(DBusConnection *conn,  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &addr_ptr,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (check_address(addr_ptr) < 0) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	create_name(filename, PATH_MAX, STORAGEDIR, adapter->address,  			"manufacturers");  	str = textfile_caseget(filename, addr_ptr);  	if (!str) -		return error_not_available(conn, msg); +		return not_available(msg);  	if (sscanf(str, "%d %d %d", &compid, &ver, &subver) != 3) {  		/* corrupted file data */ @@ -1623,15 +1611,15 @@ failed:  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_append_args(reply, DBUS_TYPE_STRING, &info,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_get_remote_revision(DBusConnection *conn, +static DBusMessage *adapter_get_remote_revision(DBusConnection *conn,  						DBusMessage *msg, void *data)  {  	struct adapter *adapter = data; @@ -1646,21 +1634,21 @@ static DBusHandlerResult adapter_get_remote_revision(DBusConnection *conn,  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &addr_ptr,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (check_address(addr_ptr) < 0) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	create_name(filename, PATH_MAX, STORAGEDIR, adapter->address,  			"manufacturers");  	str = textfile_caseget(filename, addr_ptr);  	if (!str) -		return error_not_available(conn, msg); +		return not_available(msg);  	if (sscanf(str, "%d %d %d", &compid, &ver, &subver) == 3)  		snprintf(info, 16, "HCI 0x%X", subver); @@ -1670,12 +1658,11 @@ static DBusHandlerResult adapter_get_remote_revision(DBusConnection *conn,  	dbus_message_append_args(reply, DBUS_TYPE_STRING, &info,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_get_remote_manufacturer(DBusConnection *conn, -							DBusMessage *msg, -							void *data) +static DBusMessage *adapter_get_remote_manufacturer(DBusConnection *conn, +						DBusMessage *msg, void *data)  {  	struct adapter *adapter = data;  	DBusMessage *reply; @@ -1689,17 +1676,17 @@ static DBusHandlerResult adapter_get_remote_manufacturer(DBusConnection *conn,  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &addr_ptr,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (check_address(addr_ptr) < 0) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	create_name(filename, PATH_MAX, STORAGEDIR, adapter->address,  			"manufacturers");  	str = textfile_caseget(filename, addr_ptr);  	if (!str) -		return error_not_available(conn, msg); +		return not_available(msg);  	if (sscanf(str, "%d %d %d", &compid, &ver, &subver) == 3)  		info = bt_compidtostr(compid); @@ -1708,15 +1695,15 @@ static DBusHandlerResult adapter_get_remote_manufacturer(DBusConnection *conn,  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_append_args(reply, DBUS_TYPE_STRING, &info,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_get_remote_company(DBusConnection *conn, +static DBusMessage *adapter_get_remote_company(DBusConnection *conn,  						DBusMessage *msg, void *data)  {  	DBusMessage *reply; @@ -1726,19 +1713,19 @@ static DBusHandlerResult adapter_get_remote_company(DBusConnection *conn,  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &str_bdaddr,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	str2ba(str_bdaddr, &bdaddr);  	ba2oui(&bdaddr, oui);  	tmp = ouitocomp(oui);  	if (!tmp) -		return error_not_available(conn, msg); +		return not_available(msg);  	reply = dbus_message_new_method_return(msg);  	if (!reply) {  		free(tmp); -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	}  	dbus_message_append_args(reply, DBUS_TYPE_STRING, &tmp, @@ -1746,11 +1733,11 @@ static DBusHandlerResult adapter_get_remote_company(DBusConnection *conn,  	free(tmp); -	return send_message_and_unref(conn, reply); +	return reply;  } -static int get_remote_class(DBusConnection *conn, DBusMessage *msg, void *data, -				uint32_t *class) +static DBusMessage *get_remote_class(DBusConnection *conn, DBusMessage *msg, +						void *data, uint32_t *class)  {  	struct adapter *adapter = data;  	char *addr_peer; @@ -1760,71 +1747,66 @@ static int get_remote_class(DBusConnection *conn, DBusMessage *msg, void *data,  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &addr_peer,  				DBUS_TYPE_INVALID)) { -		error_invalid_arguments(conn, msg, NULL); -		return -1; +		return invalid_args(msg);  	} -	if (check_address(addr_peer) < 0) { -		error_invalid_arguments(conn, msg, NULL); -		return -1; -	} +	if (check_address(addr_peer) < 0) +		return invalid_args(msg);  	str2ba(addr_peer, &peer);  	str2ba(adapter->address, &local);  	ecode = read_remote_class(&local, &peer, class); -	if (ecode < 0) { -		error_not_available(conn, msg); -		return -1; -	} +	if (ecode < 0) +		return not_available(msg); -	return 0; +	return NULL;  } -static DBusHandlerResult adapter_get_remote_major_class(DBusConnection *conn, -							DBusMessage *msg, -							void *data) +static DBusMessage *adapter_get_remote_major_class(DBusConnection *conn, +						DBusMessage *msg, void *data)  {  	DBusMessage *reply;  	const char *major_class;  	uint32_t class; -	if (get_remote_class(conn, msg, data, &class) < 0) -		return DBUS_HANDLER_RESULT_HANDLED; +	reply = get_remote_class(conn, msg, data, &class); +	if (reply) +		return reply;  	major_class = major_class_str(class);  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_append_args(reply, DBUS_TYPE_STRING, &major_class,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_get_remote_minor_class(DBusConnection *conn, -							DBusMessage *msg, -							void *data) +static DBusMessage *adapter_get_remote_minor_class(DBusConnection *conn, +						DBusMessage *msg, void *data)  {  	DBusMessage *reply;  	const char *minor_class;  	uint32_t class; -	if (get_remote_class(conn, msg, data, &class) < 0) -		return DBUS_HANDLER_RESULT_HANDLED; +	reply = get_remote_class(conn, msg, data, &class); +	if (reply) +		return reply;  	minor_class = minor_class_str(class);  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_append_args(reply, DBUS_TYPE_STRING, &minor_class,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  }  static void append_class_string(const char *class, DBusMessageIter *iter) @@ -1832,7 +1814,7 @@ static void append_class_string(const char *class, DBusMessageIter *iter)  	dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &class);  } -static DBusHandlerResult adapter_get_remote_service_cls(DBusConnection *conn, +static DBusMessage *adapter_get_remote_service_cls(DBusConnection *conn,  							DBusMessage *msg,  							void *data)  { @@ -1841,12 +1823,13 @@ static DBusHandlerResult adapter_get_remote_service_cls(DBusConnection *conn,  	GSList *service_classes;  	uint32_t class; -	if (get_remote_class(conn, msg, data, &class) < 0) -		return DBUS_HANDLER_RESULT_HANDLED; +	reply = get_remote_class(conn, msg, data, &class); +	if (reply) +		return reply;  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	service_classes = service_classes_str(class); @@ -1861,30 +1844,31 @@ static DBusHandlerResult adapter_get_remote_service_cls(DBusConnection *conn,  	g_slist_free(service_classes); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_get_remote_class(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_get_remote_class(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	DBusMessage *reply;  	uint32_t class; -	if (get_remote_class(conn, msg, data, &class) < 0) -		return DBUS_HANDLER_RESULT_HANDLED; +	reply = get_remote_class(conn, msg, data, &class); +	if (reply) +		return reply;  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_append_args(reply, DBUS_TYPE_UINT32, &class,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_get_remote_features(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_get_remote_features(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	char filename[PATH_MAX + 1];  	struct adapter *adapter = data; @@ -1898,16 +1882,16 @@ static DBusHandlerResult adapter_get_remote_features(DBusConnection *conn,  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &addr,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (check_address(addr) < 0) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	create_name(filename, PATH_MAX, STORAGEDIR, adapter->address, "features");  	str = textfile_caseget(filename, addr);  	if (!str) -		return error_not_available(conn, msg); +		return not_available(msg);  	memset(features, 0, sizeof(features));  	for (i = 0; i < sizeof(features); i++) { @@ -1922,7 +1906,7 @@ static DBusHandlerResult adapter_get_remote_features(DBusConnection *conn,  	reply = dbus_message_new_method_return(msg);  	if (!reply) {  		free(str); -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	}  	dbus_message_iter_init_append(reply, &iter); @@ -1936,11 +1920,11 @@ static DBusHandlerResult adapter_get_remote_features(DBusConnection *conn,  	free(str); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_get_remote_name(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_get_remote_name(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	char filename[PATH_MAX + 1];  	struct adapter *adapter = data; @@ -1952,10 +1936,10 @@ static DBusHandlerResult adapter_get_remote_name(DBusConnection *conn,  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &peer_addr,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (check_address(peer_addr) < 0) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	/* check if it is in the cache */  	create_name(filename, PATH_MAX, STORAGEDIR, adapter->address, "names"); @@ -1966,7 +1950,7 @@ static DBusHandlerResult adapter_get_remote_name(DBusConnection *conn,  		reply = dbus_message_new_method_return(msg);  		if (!reply) {  			free(str); -			return DBUS_HANDLER_RESULT_NEED_MEMORY; +			return NULL;  		}  		/* send the cached name */ @@ -1974,25 +1958,27 @@ static DBusHandlerResult adapter_get_remote_name(DBusConnection *conn,  						DBUS_TYPE_INVALID);  		free(str); -		return send_message_and_unref(conn, reply); +		return reply;  	}  	if (!adapter->up) -		return error_not_ready(conn, msg); +		return adapter_not_ready(msg);  	/* If the discover process is not running, return an error */  	if (!adapter->discov_active && !adapter->pdiscov_active) -		return error_not_available(conn, msg); +		return not_available(msg);  	/* Queue the request when there is a discovery running */  	str2ba(peer_addr, &peer_bdaddr);  	found_device_add(&adapter->found_devices, &peer_bdaddr, 0, NAME_REQUIRED); -	return error_request_deferred(conn, msg); +        return g_dbus_create_error(msg, +			ERROR_INTERFACE ".RequestDeferred", +			"Request Deferred");  } -static DBusHandlerResult adapter_get_remote_alias(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_get_remote_alias(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	struct adapter *adapter = data;  	DBusMessage *reply; @@ -2003,32 +1989,31 @@ static DBusHandlerResult adapter_get_remote_alias(DBusConnection *conn,  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &addr_ptr,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (check_address(addr_ptr) < 0) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	str2ba(addr_ptr, &bdaddr);  	ecode = get_device_alias(adapter->dev_id, &bdaddr, str, sizeof(str));  	if (ecode < 0) -		return error_not_available(conn, msg); +		return not_available(msg);  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_append_args(reply, DBUS_TYPE_STRING, &str_ptr,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_set_remote_alias(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_set_remote_alias(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	struct adapter *adapter = data; -	DBusMessage *reply;  	char *alias, *addr, *old_path, *new_path;  	bdaddr_t bdaddr;  	int ecode; @@ -2037,22 +2022,18 @@ static DBusHandlerResult adapter_set_remote_alias(DBusConnection *conn,  				DBUS_TYPE_STRING, &addr,  				DBUS_TYPE_STRING, &alias,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if ((strlen(alias) == 0) || (check_address(addr) < 0)) {  		error("Alias change failed: Invalid parameter"); -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	}  	str2ba(addr, &bdaddr);  	ecode = set_device_alias(adapter->dev_id, &bdaddr, alias);  	if (ecode < 0) -		return error_failed_errno(conn, msg, -ecode); - -	reply = dbus_message_new_method_return(msg); -	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return failed_strerror(msg, -ecode);  	resolve_paths(msg, &old_path, &new_path); @@ -2075,14 +2056,14 @@ static DBusHandlerResult adapter_set_remote_alias(DBusConnection *conn,  	g_free(old_path);  	g_free(new_path); -	return send_message_and_unref(conn, reply); + +	return dbus_message_new_method_return(msg);  } -static DBusHandlerResult adapter_clear_remote_alias(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_clear_remote_alias(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	struct adapter *adapter = data; -	DBusMessage *reply;  	char *addr_ptr;  	bdaddr_t bdaddr;  	int ecode, had_alias = 1; @@ -2090,11 +2071,11 @@ static DBusHandlerResult adapter_clear_remote_alias(DBusConnection *conn,  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &addr_ptr,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (check_address(addr_ptr) < 0) {  		error("Alias clear failed: Invalid parameter"); -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	}  	str2ba(addr_ptr, &bdaddr); @@ -2105,11 +2086,7 @@ static DBusHandlerResult adapter_clear_remote_alias(DBusConnection *conn,  	ecode = set_device_alias(adapter->dev_id, &bdaddr, NULL);  	if (ecode < 0) -		return error_failed_errno(conn, msg, -ecode); - -	reply = dbus_message_new_method_return(msg); -	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return failed_strerror(msg, -ecode);  	if (had_alias)  		dbus_connection_emit_signal(conn, dbus_message_get_path(msg), @@ -2118,11 +2095,11 @@ static DBusHandlerResult adapter_clear_remote_alias(DBusConnection *conn,  						DBUS_TYPE_STRING, &addr_ptr,  						DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return dbus_message_new_method_return(msg);  } -static DBusHandlerResult adapter_last_seen(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_last_seen(DBusConnection *conn, +				DBusMessage *msg, void *data)  {  	struct adapter *adapter = data;  	DBusMessage *reply; @@ -2132,22 +2109,22 @@ static DBusHandlerResult adapter_last_seen(DBusConnection *conn,  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &addr_ptr,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (check_address(addr_ptr) < 0) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	create_name(filename, PATH_MAX, STORAGEDIR, adapter->address,  			"lastseen");  	str = textfile_caseget(filename, addr_ptr);  	if (!str) -		return error_not_available(conn, msg); +		return not_available(msg);  	reply = dbus_message_new_method_return(msg);  	if (!reply) {  		free(str); -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	}  	dbus_message_append_args(reply, DBUS_TYPE_STRING, &str, @@ -2155,11 +2132,11 @@ static DBusHandlerResult adapter_last_seen(DBusConnection *conn,  	free(str); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_last_used(DBusConnection *conn, -					DBusMessage *msg, void *data) +static DBusMessage *adapter_last_used(DBusConnection *conn, +				DBusMessage *msg, void *data)  {  	struct adapter *adapter = data;  	DBusMessage *reply; @@ -2169,22 +2146,22 @@ static DBusHandlerResult adapter_last_used(DBusConnection *conn,  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &addr_ptr,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (check_address(addr_ptr) < 0) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	create_name(filename, PATH_MAX, STORAGEDIR, adapter->address,  			"lastused");  	str = textfile_caseget(filename, addr_ptr);  	if (!str) -		return error_not_available(conn, msg); +		return not_available(msg);  	reply = dbus_message_new_method_return(msg);  	if (!reply) {  		free(str); -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	}  	dbus_message_append_args(reply, DBUS_TYPE_STRING, &str, @@ -2192,10 +2169,9 @@ static DBusHandlerResult adapter_last_used(DBusConnection *conn,  	free(str); -	return send_message_and_unref(conn, reply); +	return reply;  } -  gboolean dc_pending_timeout_handler(void *data)  {  	int dd; @@ -2241,7 +2217,7 @@ void dc_pending_timeout_cleanup(struct adapter *adapter)  	adapter->pending_dc = NULL;  } -static DBusHandlerResult adapter_dc_remote_device(DBusConnection *conn, +static DBusMessage *adapter_dc_remote_device(DBusConnection *conn,  						DBusMessage *msg, void *data)  {  	struct adapter *adapter = data; @@ -2250,24 +2226,26 @@ static DBusHandlerResult adapter_dc_remote_device(DBusConnection *conn,  	bdaddr_t peer_bdaddr;  	if (!adapter->up) -		return error_not_ready(conn, msg); +		return adapter_not_ready(msg);  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &peer_addr,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (check_address(peer_addr) < 0) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	str2ba(peer_addr, &peer_bdaddr);  	l = g_slist_find_custom(l, &peer_bdaddr, active_conn_find_by_bdaddr);  	if (!l) -		return error_not_connected(conn, msg); +		return g_dbus_create_error(msg, +				ERROR_INTERFACE ".NotConnected", +				"Device not connected");  	if (adapter->pending_dc) -		return error_disconnect_in_progress(conn, msg); +		return in_progress(msg, "Disconnection in progress");  	adapter->pending_dc = g_new0(struct pending_dc_info, 1); @@ -2280,7 +2258,7 @@ static DBusHandlerResult adapter_dc_remote_device(DBusConnection *conn,  	if (!adapter->pending_dc->timeout_id) {  		g_free(adapter->pending_dc);  		adapter->pending_dc = NULL; -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	}  	adapter->pending_dc->conn = dbus_connection_ref(conn); @@ -2294,7 +2272,7 @@ static DBusHandlerResult adapter_dc_remote_device(DBusConnection *conn,  					DBUS_TYPE_STRING, &peer_addr,  					DBUS_TYPE_INVALID); -	return DBUS_HANDLER_RESULT_HANDLED; +	return NULL;  }  static void reply_authentication_failure(struct bonding_request_info *bonding) @@ -2346,12 +2324,11 @@ struct device *adapter_create_device(DBusConnection *conn,  	return device;  } -static DBusHandlerResult remove_bonding(DBusConnection *conn, DBusMessage *msg, +static DBusMessage *remove_bonding(DBusConnection *conn, DBusMessage *msg,  					const char *address, void *data)  {  	struct adapter *adapter = data;  	struct device *device; -	DBusMessage *reply;  	char path[MAX_PATH_LENGTH], filename[PATH_MAX + 1];  	char *str;  	bdaddr_t src, dst; @@ -2364,7 +2341,7 @@ static DBusHandlerResult remove_bonding(DBusConnection *conn, DBusMessage *msg,  	dev = hci_open_dev(adapter->dev_id);  	if (dev < 0 && msg) -		return error_no_such_adapter(conn, msg); +		return no_such_adapter(msg);  	create_name(filename, PATH_MAX, STORAGEDIR, adapter->address,  			"linkkeys"); @@ -2376,14 +2353,16 @@ static DBusHandlerResult remove_bonding(DBusConnection *conn, DBusMessage *msg,  	if (!paired && msg) {  		hci_close_dev(dev); -		return error_bonding_does_not_exist(conn, msg); +		return g_dbus_create_error(msg, +				ERROR_INTERFACE ".DoesNotExist", +				"Bonding does not exist");  	}  	/* Delete the link key from storage */  	if (textfile_casedel(filename, address) < 0 && msg) {  		hci_close_dev(dev);  		err = errno; -		return error_failed_errno(conn, msg, err); +		return failed_strerror(msg, err);  	}  	/* Delete the link key from the Bluetooth chip */ @@ -2401,7 +2380,7 @@ static DBusHandlerResult remove_bonding(DBusConnection *conn, DBusMessage *msg,  			int err = errno;  			error("Disconnect failed");  			hci_close_dev(dev); -			return error_failed_errno(conn, msg, err); +			return failed_strerror(msg, err);  		}  	} @@ -2431,12 +2410,10 @@ proceed:  	if(!msg)  		goto done; -	reply = dbus_message_new_method_return(msg); - -	return send_message_and_unref(conn, reply); +	return dbus_message_new_method_return(msg);  done: -	return DBUS_HANDLER_RESULT_HANDLED; +	return NULL;  } @@ -2733,56 +2710,53 @@ static DBusMessage *create_bonding(DBusConnection *conn, DBusMessage *msg,  	return NULL;  } -static DBusHandlerResult adapter_create_bonding(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_create_bonding(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	struct adapter *adapter = data;  	char *address;  	if (!adapter->up) -		return error_not_ready(conn, msg); +		return adapter_not_ready(msg);  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &address,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (check_address(address) < 0) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg); -	return send_message_and_unref(conn, -				create_bonding(conn, msg, address, NULL, -						IO_CAPABILITY_INVALID, data)); +	return create_bonding(conn, msg, address, NULL, +				IO_CAPABILITY_INVALID, data);  } - -static DBusHandlerResult adapter_cancel_bonding(DBusConnection *conn, -						DBusMessage *msg, void *data) +static DBusMessage *adapter_cancel_bonding(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	struct adapter *adapter = data; -	DBusMessage *reply;  	const char *address;  	bdaddr_t bdaddr;  	GSList *l;  	struct bonding_request_info *bonding = adapter->bonding;  	if (!adapter->up) -		return error_not_ready(conn, msg); +		return adapter_not_ready(msg);  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &address,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (check_address(address) < 0) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	str2ba(address, &bdaddr);  	if (!bonding || bacmp(&bonding->bdaddr, &bdaddr)) -		return error_bonding_not_in_progress(conn, msg); +		return not_in_progress(msg, "Bonding is not in progress");  	if (strcmp(dbus_message_get_sender(adapter->bonding->msg),  				dbus_message_get_sender(msg))) -		return error_not_authorized(conn, msg); +		return not_authorized(msg);  	adapter->bonding->cancel = 1; @@ -2797,13 +2771,14 @@ static DBusHandlerResult adapter_cancel_bonding(DBusConnection *conn,  			 * cancel the remote passkey: return not authorized.  			 */  			g_io_channel_close(adapter->bonding->io); -			return error_not_authorized(conn, msg); +			return not_authorized(msg);  		} else {  			int dd = hci_open_dev(adapter->dev_id);  			if (dd < 0) { +				int err = errno;  				error("Can't open hci%d: %s (%d)", -					adapter->dev_id, strerror(errno), errno); -				return DBUS_HANDLER_RESULT_HANDLED; +					adapter->dev_id, strerror(err), err); +				return failed_strerror(msg, err);  			}  			hci_send_cmd(dd, OGF_LINK_CTL, OCF_PIN_CODE_NEG_REPLY, @@ -2818,33 +2793,30 @@ static DBusHandlerResult adapter_cancel_bonding(DBusConnection *conn,  	g_io_channel_close(adapter->bonding->io); -	reply = dbus_message_new_method_return(msg); -	send_message_and_unref(conn, reply); - -	return DBUS_HANDLER_RESULT_HANDLED; +	return dbus_message_new_method_return(msg);  } -static DBusHandlerResult adapter_remove_bonding(DBusConnection *conn, +static DBusMessage *adapter_remove_bonding(DBusConnection *conn,  						DBusMessage *msg, void *data)  {  	struct adapter *adapter = data;  	char *address;  	if (!adapter->up) -		return error_not_ready(conn, msg); +		return adapter_not_ready(msg);  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &address,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (check_address(address) < 0) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	return remove_bonding(conn, msg, address, data);  } -static DBusHandlerResult adapter_has_bonding(DBusConnection *conn, +static DBusMessage *adapter_has_bonding(DBusConnection *conn,  						DBusMessage *msg, void *data)  {  	struct adapter *adapter = data; @@ -2856,10 +2828,10 @@ static DBusHandlerResult adapter_has_bonding(DBusConnection *conn,  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &addr_ptr,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (check_address(addr_ptr) < 0) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	create_name(filename, PATH_MAX, STORAGEDIR, adapter->address,  			"linkkeys"); @@ -2876,7 +2848,7 @@ static DBusHandlerResult adapter_has_bonding(DBusConnection *conn,  	dbus_message_append_args(reply, DBUS_TYPE_BOOLEAN, &result,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  }  static void list_bondings_do_append(char *key, char *value, void *data) @@ -2885,7 +2857,7 @@ static void list_bondings_do_append(char *key, char *value, void *data)  	dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &key);  } -static DBusHandlerResult adapter_list_bondings(DBusConnection *conn, +static DBusMessage *adapter_list_bondings(DBusConnection *conn,  						DBusMessage *msg, void *data)  {  	struct adapter *adapter = data; @@ -2895,7 +2867,7 @@ static DBusHandlerResult adapter_list_bondings(DBusConnection *conn,  	char filename[PATH_MAX + 1];  	if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	create_name(filename, PATH_MAX, STORAGEDIR, adapter->address,  			"linkkeys"); @@ -2911,10 +2883,10 @@ static DBusHandlerResult adapter_list_bondings(DBusConnection *conn,  	dbus_message_iter_close_container(&iter, &array_iter); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_get_pin_code_length(DBusConnection *conn, +static DBusMessage *adapter_get_pin_code_length(DBusConnection *conn,  							DBusMessage *msg,  							void *data)  { @@ -2928,10 +2900,10 @@ static DBusHandlerResult adapter_get_pin_code_length(DBusConnection *conn,  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &addr_ptr,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (check_address(addr_ptr) < 0) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	str2ba(adapter->address, &local); @@ -2939,7 +2911,9 @@ static DBusHandlerResult adapter_get_pin_code_length(DBusConnection *conn,  	len = read_pin_length(&local, &peer);  	if (len < 0) -		return error_record_does_not_exist(conn, msg); +		return g_dbus_create_error(msg, +				ERROR_INTERFACE ".DoesNotExist", +				"Record does not exist");  	reply = dbus_message_new_method_return(msg); @@ -2948,10 +2922,10 @@ static DBusHandlerResult adapter_get_pin_code_length(DBusConnection *conn,  	dbus_message_append_args(reply, DBUS_TYPE_BYTE, &length,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_get_encryption_key_size(DBusConnection *conn, +static DBusMessage *adapter_get_encryption_key_size(DBusConnection *conn,  							DBusMessage *msg,  							void *data)  { @@ -2965,16 +2939,16 @@ static DBusHandlerResult adapter_get_encryption_key_size(DBusConnection *conn,  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &addr_ptr,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (check_address(addr_ptr) < 0) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	str2ba(addr_ptr, &bdaddr);  	val = get_encryption_key_size(adapter->dev_id, &bdaddr);  	if (val < 0) -		return error_failed_errno(conn, msg, -val); +		return failed_strerror(msg, -val);  	reply = dbus_message_new_method_return(msg); @@ -2983,7 +2957,7 @@ static DBusHandlerResult adapter_get_encryption_key_size(DBusConnection *conn,  	dbus_message_append_args(reply, DBUS_TYPE_BYTE, &size,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  }  static void periodic_discover_req_exit(void *user_data) @@ -3078,13 +3052,6 @@ static DBusMessage *adapter_start_periodic(DBusConnection *conn,  	return dbus_message_new_method_return(msg);  } -static DBusHandlerResult adapter_start_periodic_old(DBusConnection *conn, -						DBusMessage *msg, void *data) -{ -	return send_message_and_unref(conn, -			adapter_start_periodic(conn, msg, data)); -} -  static DBusMessage *adapter_stop_periodic(DBusConnection *conn,  						DBusMessage *msg, void *data)  { @@ -3121,14 +3088,7 @@ static DBusMessage *adapter_stop_periodic(DBusConnection *conn,  	return dbus_message_new_method_return(msg);  } -static DBusHandlerResult adapter_stop_periodic_old(DBusConnection *conn, -		DBusMessage *msg, void *data) -{ -	return send_message_and_unref(conn, -			adapter_stop_periodic(conn, msg, data)); -} - -static DBusHandlerResult adapter_is_periodic(DBusConnection *conn, +static DBusMessage *adapter_is_periodic(DBusConnection *conn,  						DBusMessage *msg, void *data)  {  	DBusMessage *reply; @@ -3137,30 +3097,24 @@ static DBusHandlerResult adapter_is_periodic(DBusConnection *conn,  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_append_args(reply, DBUS_TYPE_BOOLEAN, &active,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_set_pdiscov_resolve(DBusConnection *conn, -							DBusMessage *msg, -							void *data) +static DBusMessage *adapter_set_pdiscov_resolve(DBusConnection *conn, +						DBusMessage *msg, void *data)  { -	DBusMessage *reply;  	struct adapter *adapter = data;  	dbus_bool_t resolve;  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_BOOLEAN, &resolve,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); - -	reply = dbus_message_new_method_return(msg); -	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return invalid_args(msg);  	debug("SetPeriodicDiscoveryNameResolving(%s)",  			resolve ? "TRUE" : "FALSE"); @@ -3174,10 +3128,10 @@ static DBusHandlerResult adapter_set_pdiscov_resolve(DBusConnection *conn,  			adapter->discov_type &= ~RESOLVE_NAME;  	} -	return send_message_and_unref(conn, reply); +	return dbus_message_new_method_return(msg);  } -static DBusHandlerResult adapter_get_pdiscov_resolve(DBusConnection *conn, +static DBusMessage *adapter_get_pdiscov_resolve(DBusConnection *conn,  							DBusMessage *msg,  							void *data)  { @@ -3186,16 +3140,16 @@ static DBusHandlerResult adapter_get_pdiscov_resolve(DBusConnection *conn,  	dbus_bool_t resolve = adapter->pdiscov_resolve_names;  	if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_append_args(reply, DBUS_TYPE_BOOLEAN, &resolve,  					DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  }  static void discover_devices_req_exit(void *user_data) @@ -3288,13 +3242,6 @@ static DBusMessage *adapter_discover_devices(DBusConnection *conn,  	return dbus_message_new_method_return(msg);  } -static DBusHandlerResult adapter_discover_devices_old(DBusConnection *conn, -					DBusMessage *msg, void *data) -{ -	return send_message_and_unref(conn, -			adapter_discover_devices(conn, msg, data)); -} -  static DBusMessage *adapter_cancel_discovery(DBusConnection *conn,  						DBusMessage *msg, void *data)  { @@ -3337,13 +3284,6 @@ static DBusMessage *adapter_cancel_discovery(DBusConnection *conn,  	return NULL;  } -static DBusHandlerResult adapter_cancel_discovery_old(DBusConnection *conn, -						DBusMessage *msg, void *data) -{ -	return send_message_and_unref(conn, -			adapter_cancel_discovery(conn, msg, data)); -} -  struct remote_device_list_t {  	GSList *list;  	time_t time; @@ -3376,7 +3316,7 @@ static void remote_devices_do_append(void *data, void *user_data)  	dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &data);  } -static DBusHandlerResult adapter_list_remote_devices(DBusConnection *conn, +static DBusMessage *adapter_list_remote_devices(DBusConnection *conn,  							DBusMessage *msg,  							void *data)  { @@ -3388,7 +3328,7 @@ static DBusHandlerResult adapter_list_remote_devices(DBusConnection *conn,  	struct remote_device_list_t param = { NULL, 0 };  	if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	/* Add Bonded devices to the list */  	create_name(filename, PATH_MAX, STORAGEDIR, adapter->address, "linkkeys"); @@ -3416,7 +3356,7 @@ static DBusHandlerResult adapter_list_remote_devices(DBusConnection *conn,  	dbus_message_iter_close_container(&iter, &array_iter); -	return send_message_and_unref(conn, reply); +	return reply;  }  static void append_connected(struct active_conn_info *dev, GSList *list) @@ -3430,9 +3370,8 @@ static void append_connected(struct active_conn_info *dev, GSList *list)  	list = g_slist_append(list, g_strdup(address));  } -static DBusHandlerResult adapter_list_recent_remote_devices(DBusConnection *conn, -								DBusMessage *msg, -								void *data) +static DBusMessage *adapter_list_recent_remote_devices(DBusConnection *conn, +						DBusMessage *msg, void *data)  {  	struct adapter *adapter = data;  	struct tm date; @@ -3447,12 +3386,12 @@ static DBusHandlerResult adapter_list_recent_remote_devices(DBusConnection *conn  	if (!dbus_message_get_args(msg, NULL,  				DBUS_TYPE_STRING, &string,  				DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	/* Date format is "YYYY-MM-DD HH:MM:SS GMT" */  	len = strlen(string);  	if (len && (strptime(string, "%Y-%m-%d %H:%M:%S", &date) == NULL)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	/* Bonded and trusted: mandatory entries(no matter the date/time) */  	create_name(filename, PATH_MAX, STORAGEDIR, adapter->address, "linkkeys"); @@ -3488,16 +3427,14 @@ static DBusHandlerResult adapter_list_recent_remote_devices(DBusConnection *conn  	dbus_message_iter_close_container(&iter, &array_iter); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_set_trusted(DBusConnection *conn, -						DBusMessage *msg, -						void *data) +static DBusMessage *adapter_set_trusted(DBusConnection *conn, +				DBusMessage *msg, void *data)  {  	struct adapter *adapter = data; -	DBusMessage *reply;  	bdaddr_t local;  	const char *address;  	char *old_path, *new_path; @@ -3505,14 +3442,10 @@ static DBusHandlerResult adapter_set_trusted(DBusConnection *conn,  	if (!dbus_message_get_args(msg, NULL,  			DBUS_TYPE_STRING, &address,  			DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (check_address(address) < 0) -		return error_invalid_arguments(conn, msg, NULL); - -	reply = dbus_message_new_method_return(msg); -	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return invalid_args(msg);  	str2ba(adapter->address, &local); @@ -3537,12 +3470,11 @@ static DBusHandlerResult adapter_set_trusted(DBusConnection *conn,  		}  	} -	return send_message_and_unref(conn, reply); +	return dbus_message_new_method_return(msg);  } -static DBusHandlerResult adapter_is_trusted(DBusConnection *conn, -						DBusMessage *msg, -						void *data) +static DBusMessage *adapter_is_trusted(DBusConnection *conn, +				DBusMessage *msg, void *data)  {  	struct adapter *adapter = data;  	DBusMessage *reply; @@ -3553,10 +3485,10 @@ static DBusHandlerResult adapter_is_trusted(DBusConnection *conn,  	if (!dbus_message_get_args(msg, NULL,  			DBUS_TYPE_STRING, &address,  			DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (check_address(address) < 0) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	str2ba(adapter->address, &local); @@ -3564,21 +3496,19 @@ static DBusHandlerResult adapter_is_trusted(DBusConnection *conn,  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	dbus_message_append_args(reply,  				DBUS_TYPE_BOOLEAN, &trusted,  				DBUS_TYPE_INVALID); -	return send_message_and_unref(conn, reply); +	return reply;  } -static DBusHandlerResult adapter_remove_trust(DBusConnection *conn, -						DBusMessage *msg, -						void *data) +static DBusMessage *adapter_remove_trust(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	struct adapter *adapter = data; -	DBusMessage *reply;  	const char *address;  	bdaddr_t local;  	char *old_path, *new_path; @@ -3586,14 +3516,10 @@ static DBusHandlerResult adapter_remove_trust(DBusConnection *conn,  	if (!dbus_message_get_args(msg, NULL,  			DBUS_TYPE_STRING, &address,  			DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (check_address(address) < 0) -		return error_invalid_arguments(conn, msg, NULL); - -	reply = dbus_message_new_method_return(msg); -	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return invalid_args(msg);  	str2ba(adapter->address, &local); @@ -3618,10 +3544,10 @@ static DBusHandlerResult adapter_remove_trust(DBusConnection *conn,  		}  	} -	return send_message_and_unref(conn, reply); +	return dbus_message_new_method_return(msg);  } -static DBusHandlerResult adapter_list_trusts(DBusConnection *conn, +static DBusMessage *adapter_list_trusts(DBusConnection *conn,  						DBusMessage *msg,  						void *data)  { @@ -3634,7 +3560,7 @@ static DBusHandlerResult adapter_list_trusts(DBusConnection *conn,  	reply = dbus_message_new_method_return(msg);  	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return NULL;  	str2ba(adapter->address, &local); @@ -3654,7 +3580,7 @@ static DBusHandlerResult adapter_list_trusts(DBusConnection *conn,  	g_slist_foreach(trusts, (GFunc) g_free, NULL);  	g_slist_free(trusts); -	return send_message_and_unref(conn, reply); +	return reply;  }  static DBusMessage *get_properties(DBusConnection *conn, @@ -4280,150 +4206,149 @@ static GDBusMethodTable adapter_methods[] = {  	{ "AddServiceRecord",	"s",	"u",	add_service_record	},  	{ "UpdateServiceRecord","us",	"",	update_service_record	},  	{ "RemoveServiceRecord","u",	"",	remove_service_record	}, -	{ NULL,			NULL,	NULL,	NULL			} +	{ }  };  /* Deprecated */ -static DBusMethodVTable old_adapter_methods[] = { -	{ "GetInfo",				adapter_get_info, -		"",	"a{sv}"	}, -	{ "GetAddress",				adapter_get_address, -		"",	"s"	}, -	{ "GetVersion",				adapter_get_version, -		"",	"s"	}, -	{ "GetRevision",			adapter_get_revision, -		"",	"s"	}, -	{ "GetManufacturer",			adapter_get_manufacturer, -		"",	"s"	}, -	{ "GetCompany",				adapter_get_company, -		"",	"s"	}, -	{ "ListAvailableModes",			adapter_list_modes, -		"",	"as"	}, -	{ "GetMode",				adapter_get_mode, -		"",	"s"	}, -	{ "SetMode",				adapter_set_mode, -		"s",	""	}, -	{ "GetDiscoverableTimeout",		adapter_get_discoverable_to, -		"",	"u"	}, -	{ "SetDiscoverableTimeout",		adapter_set_discoverable_to, -		"u",	""	}, -	{ "IsConnectable",			adapter_is_connectable, -		"",	"b"	}, -	{ "IsDiscoverable",			adapter_is_discoverable, -		"",	"b"	}, -	{ "IsConnected",			adapter_is_connected, -		"s",	"b"	}, -	{ "ListConnections",			adapter_list_connections, -		"",	"as"	}, -	{ "GetMajorClass",			adapter_get_major_class, -		"",	"s"	}, -	{ "ListAvailableMinorClasses",		adapter_list_minor_classes, -		"",	"as"	}, -	{ "GetMinorClass",			adapter_get_minor_class, -		"",	"s"	}, -	{ "SetMinorClass",			adapter_set_minor_class, -		"s",	""	}, -	{ "GetServiceClasses",			adapter_get_service_classes, -		"",	"as"	}, -	{ "GetName",				adapter_get_name, -		"",	"s"	}, -	{ "SetName",				adapter_set_name, -		"s",	""	}, - -	{ "GetRemoteInfo",			adapter_get_remote_info, -		"s",	"a{sv}"	}, -	{ "GetRemoteServiceRecord",		adapter_get_remote_svc, -		"su",	"ay"	}, -	{ "GetRemoteServiceRecordAsXML",	adapter_get_remote_svc_xml, -		"su",	"s"	}, -	{ "GetRemoteServiceHandles",		adapter_get_remote_svc_handles, -		"ss",	"au"	}, -	{ "GetRemoteServiceIdentifiers",	adapter_get_remote_svc_identifiers, -		"s",	"as"	}, -	{ "FinishRemoteServiceTransaction",	adapter_finish_sdp_transact, -		"s",	""	}, - -	{ "GetRemoteVersion",			adapter_get_remote_version, -		"s",	"s"	}, -	{ "GetRemoteRevision",			adapter_get_remote_revision, -		"s",	"s"	}, -	{ "GetRemoteManufacturer",		adapter_get_remote_manufacturer, -		"s",	"s"	}, -	{ "GetRemoteCompany",			adapter_get_remote_company, -		"s",	"s"	}, -	{ "GetRemoteMajorClass",		adapter_get_remote_major_class, -		"s",	"s"	}, -	{ "GetRemoteMinorClass",		adapter_get_remote_minor_class, -		"s",	"s"	}, -	{ "GetRemoteServiceClasses",		adapter_get_remote_service_cls, -		"s",	"as"	}, -	{ "GetRemoteClass",			adapter_get_remote_class, -		"s",	"u"	}, -	{ "GetRemoteFeatures",			adapter_get_remote_features, -		"s",	"ay"	}, -	{ "GetRemoteName",			adapter_get_remote_name, -		"s",	"s"	}, -	{ "GetRemoteAlias",			adapter_get_remote_alias, -		"s",	"s"	}, -	{ "SetRemoteAlias",			adapter_set_remote_alias, -		"ss",	""	}, -	{ "ClearRemoteAlias",			adapter_clear_remote_alias, -		"s",	""	}, - -	{ "LastSeen",				adapter_last_seen, -		"s",	"s"	}, -	{ "LastUsed",				adapter_last_used, -		"s",	"s"	}, - -	{ "DisconnectRemoteDevice",		adapter_dc_remote_device, -		"s",	""	}, - -	{ "CreateBonding",			adapter_create_bonding, -		"s",	""	}, -	{ "CancelBondingProcess",		adapter_cancel_bonding, -		"s",	""	}, -	{ "RemoveBonding",			adapter_remove_bonding, -		"s",	""	}, -	{ "HasBonding",				adapter_has_bonding, -		"s",	"b"	}, -	{ "ListBondings",			adapter_list_bondings, -		"",	"as"	}, -	{ "GetPinCodeLength",			adapter_get_pin_code_length, -		"s",	"y"	}, -	{ "GetEncryptionKeySize",		adapter_get_encryption_key_size, -		"s",	"y"	}, - -	{ "StartPeriodicDiscovery",		adapter_start_periodic_old, -		"",	""	}, -	{ "StopPeriodicDiscovery",		adapter_stop_periodic_old, -		"",	""	}, -	{ "IsPeriodicDiscovery",		adapter_is_periodic, -		"",	"b"	}, -	{ "SetPeriodicDiscoveryNameResolving",	adapter_set_pdiscov_resolve, -		"b",	""	}, -	{ "GetPeriodicDiscoveryNameResolving",	adapter_get_pdiscov_resolve, -		"",	"b"	}, -	{ "DiscoverDevices",			adapter_discover_devices_old, -		"",	""	}, -	{ "CancelDiscovery",			adapter_cancel_discovery_old, -		"",	""	}, -	{ "DiscoverDevicesWithoutNameResolving",	adapter_discover_devices_old, -		"",	""	}, -	{ "ListRemoteDevices",			adapter_list_remote_devices, -		"",	"as"	}, -	{ "ListRecentRemoteDevices",		adapter_list_recent_remote_devices, -		"s",	"as"	}, - -	{ "SetTrusted",				adapter_set_trusted, -		"s",	""	}, -	{ "IsTrusted",				adapter_is_trusted, -		"s",	"b"	}, -	{ "RemoveTrust",			adapter_remove_trust, -		"s",	""	}, -	{ "ListTrusts",				adapter_list_trusts, -		"",	"as"	}, - -	{ NULL, NULL, NULL, NULL } +static GDBusMethodTable old_adapter_methods[] = { +	{ "GetInfo",			"",	"a{sv}", +						adapter_get_info		}, +	{ "GetAddress",			"",	"s", +						adapter_get_address		}, +	{ "GetVersion",			"",	"s", +						adapter_get_version		}, +	{ "GetRevision",		"",	"s", +						adapter_get_revision		}, +	{ "GetManufacturer",		"",	"s", +						adapter_get_manufacturer	}, +	{ "GetCompany",			"",	"s", +						adapter_get_company		}, +	{ "ListAvailableModes",		"",	"as", +						adapter_list_modes		}, +	{ "GetMode",			"",	"s", +						adapter_get_mode		}, +	{ "SetMode",			"s",	"", +						adapter_set_mode		}, +	{ "GetDiscoverableTimeout",	"",	"u", +						adapter_get_discoverable_to	}, +	{ "SetDiscoverableTimeout",	"u",	"", +						adapter_set_discoverable_to	}, +	{ "IsConnectable",		"",	"b", +						adapter_is_connectable		}, +	{ "IsDiscoverable",		"",	"b", +						adapter_is_discoverable		}, +	{ "IsConnected",		"s",	"b", +						adapter_is_connected		}, +	{ "ListConnections",		"",	"as", +						adapter_list_connections	}, +	{ "GetMajorClass",		"",	"s", +						adapter_get_major_class		}, +	{ "ListAvailableMinorClasses",	"",	"as", +						adapter_list_minor_classes	}, +	{ "GetMinorClass",		"",	"s", +						adapter_get_minor_class		}, +	{ "SetMinorClass",		"s",	"", +						adapter_set_minor_class		}, +	{ "GetServiceClasses",		"",	"as", +						adapter_get_service_classes	}, +	{ "GetName",			"",	"s", +						adapter_get_name		}, +	{ "SetName",			"s",	"", +						adapter_set_name		}, + +	{ "GetRemoteInfo",			"s",	"a{sv}", +						adapter_get_remote_info		}, +	{ "GetRemoteServiceRecord",		"su",	"ay", +		adapter_get_remote_svc,		G_DBUS_METHOD_FLAG_ASYNC	}, +	{ "GetRemoteServiceRecordAsXML",	"su",	"s", +		adapter_get_remote_svc_xml,	G_DBUS_METHOD_FLAG_ASYNC	}, +	{ "GetRemoteServiceHandles",		"ss",	"au", +		adapter_get_remote_svc_handles,	G_DBUS_METHOD_FLAG_ASYNC	}, +	{ "GetRemoteServiceIdentifiers",	"s",	"as", +		adapter_get_remote_svc_identifiers, G_DBUS_METHOD_FLAG_ASYNC	}, +	{ "FinishRemoteServiceTransaction",	"s",	"", +						adapter_finish_sdp_transact	}, +	{ "GetRemoteVersion",			"s",	"s", +						adapter_get_remote_version	}, +	{ "GetRemoteRevision",			"s",	"s", +						adapter_get_remote_revision	}, +	{ "GetRemoteManufacturer",		"s",	"s", +						adapter_get_remote_manufacturer	}, +	{ "GetRemoteCompany",			"s",	"s", +						adapter_get_remote_company	}, +	{ "GetRemoteMajorClass",		"s",	"s", +						adapter_get_remote_major_class	}, +	{ "GetRemoteMinorClass",		"s",	"s", +						adapter_get_remote_minor_class	}, +	{ "GetRemoteServiceClasses",		"s",	"as", +						adapter_get_remote_service_cls	}, +	{ "GetRemoteClass",			"s",	"u", +						adapter_get_remote_class	}, +	{ "GetRemoteFeatures",			"s",	"ay", +						adapter_get_remote_features	}, +	{ "GetRemoteName",			"s",	"s", +						adapter_get_remote_name		}, +	{ "GetRemoteAlias",			"s",	"s", +						adapter_get_remote_alias	}, +	{ "SetRemoteAlias",			"ss",	"", +						adapter_set_remote_alias	}, +	{ "ClearRemoteAlias",			"s",	"", +						adapter_clear_remote_alias	}, + +	{ "LastSeen",		"s",	"s", +						adapter_last_seen		}, +	{ "LastUsed",		"s",	"s", +						adapter_last_used		}, + +	{ "DisconnectRemoteDevice",	"s",	"", +			adapter_dc_remote_device,	G_DBUS_METHOD_FLAG_ASYNC}, + +	{ "CreateBonding",		"s",	"", +			adapter_create_bonding,		G_DBUS_METHOD_FLAG_ASYNC}, +	{ "CancelBondingProcess",	"s",	"", +						adapter_cancel_bonding		}, +	{ "RemoveBonding",		"s",	"", +						adapter_remove_bonding		}, +	{ "HasBonding",			"s",	"b", +						adapter_has_bonding		}, +	{ "ListBondings",		"",	"as", +						adapter_list_bondings		}, +	{ "GetPinCodeLength",		"s",	"y", +						adapter_get_pin_code_length	}, +	{ "GetEncryptionKeySize",	"s",	"y", +						adapter_get_encryption_key_size	}, + +	{ "StartPeriodicDiscovery",	"",	"", +						adapter_start_periodic		}, +	{ "StopPeriodicDiscovery",	"",	"", +						adapter_stop_periodic		}, +	{ "IsPeriodicDiscovery",	"",	"b", +						adapter_is_periodic		}, +	{ "SetPeriodicDiscoveryNameResolving",	"b",	"", +						adapter_set_pdiscov_resolve	}, +	{ "GetPeriodicDiscoveryNameResolving",	"",	"b", +						adapter_get_pdiscov_resolve	}, +	{ "DiscoverDevices",			"",	"", +						adapter_discover_devices	}, +	{ "CancelDiscovery",			"",	"", +			adapter_cancel_discovery, G_DBUS_METHOD_FLAG_ASYNC	}, +	{ "DiscoverDevicesWithoutNameResolving","",	"", +						adapter_discover_devices	}, +	{ "ListRemoteDevices",			"",	"as", +						adapter_list_remote_devices	}, +	{ "ListRecentRemoteDevices",		"s",	"as", +						adapter_list_recent_remote_devices}, + +	{ "SetTrusted",		"s",	"", +						adapter_set_trusted		}, +	{ "IsTrusted",		"s",	"b", +						adapter_is_trusted		}, +	{ "RemoveTrust",	"s",	"", +						adapter_remove_trust		}, +	{ "ListTrusts",		"",	"as", +						adapter_list_trusts		}, + +	{ }  };  /* BlueZ 4.X */ @@ -4435,11 +4360,11 @@ static GDBusSignalTable adapter_signals[] = {  	{ "DeviceFound",		"sa{sv}"	},  	{ "PropertyChanged",		"sv"		},  	{ "DeviceDisappeared",		"s"		}, -	{ NULL,				NULL		} +	{ }  };  /* Deprecated */ -static DBusSignalVTable old_adapter_signals[] = { +static GDBusSignalTable old_adapter_signals[] = {  	{ "DiscoveryStarted",			""	},  	{ "DiscoveryCompleted",			""	},  	{ "ModeChanged",			"s"	}, @@ -4464,17 +4389,19 @@ static DBusSignalVTable old_adapter_signals[] = {  	{ "BondingRemoved",			"s"	},  	{ "TrustAdded",				"s"	},  	{ "TrustRemoved",			"s"	}, -	{ NULL, NULL } +	{ }  }; -dbus_bool_t adapter_init(DBusConnection *conn, const char *path, struct adapter *adapter) +dbus_bool_t adapter_init(DBusConnection *conn, +		const char *path, struct adapter *adapter)  {  	if (hcid_dbus_use_experimental())  		g_dbus_register_interface(conn, path + ADAPTER_PATH_INDEX,  				ADAPTER_INTERFACE, adapter_methods,  				adapter_signals, NULL, adapter, NULL); -	return dbus_connection_register_interface(conn, +	return g_dbus_register_interface(conn,  			path, ADAPTER_INTERFACE, -			old_adapter_methods, old_adapter_signals, NULL); +			old_adapter_methods, old_adapter_signals, +			NULL, adapter, NULL);  } diff --git a/hcid/adapter.h b/hcid/adapter.h index 1666e659..7808609a 100644 --- a/hcid/adapter.h +++ b/hcid/adapter.h @@ -85,6 +85,7 @@ struct pending_dc_info {  struct adapter {  	uint16_t dev_id;  	int up; +	char *path;			/* adapter object path */  	char address[18];		/* adapter Bluetooth Address */  	guint timeout_id;		/* discoverable timeout id */  	uint32_t discov_timeout;	/* discoverable time(msec) */ diff --git a/hcid/dbus-error.c b/hcid/dbus-error.c index 3a31a320..077c24c1 100644 --- a/hcid/dbus-error.c +++ b/hcid/dbus-error.c @@ -73,13 +73,6 @@ DBusHandlerResult error_no_such_service(DBusConnection *conn, DBusMessage *msg)  							"No such service"));  } -DBusHandlerResult error_request_deferred(DBusConnection *conn, DBusMessage *msg) -{ -	return send_message_and_unref(conn, -		dbus_message_new_error(msg, ERROR_INTERFACE ".RequestDeferred", -							"Request Deferred")); -} -  DBusHandlerResult error_unsupported_major_class(DBusConnection *conn, DBusMessage *msg)  {  	return send_message_and_unref(conn, diff --git a/hcid/dbus-error.h b/hcid/dbus-error.h index a3f67e3a..9c394d84 100644 --- a/hcid/dbus-error.h +++ b/hcid/dbus-error.h @@ -31,7 +31,6 @@ DBusHandlerResult error_not_authorized(DBusConnection *conn, DBusMessage *msg);  DBusHandlerResult error_rejected(DBusConnection *conn, DBusMessage *msg);  DBusHandlerResult error_no_such_adapter(DBusConnection *conn, DBusMessage *msg);  DBusHandlerResult error_no_such_service(DBusConnection *conn, DBusMessage *msg); -DBusHandlerResult error_request_deferred(DBusConnection *conn, DBusMessage *msg);  /* Used only for hcid device audit feature */  DBusHandlerResult error_not_in_progress(DBusConnection *conn, DBusMessage *msg, const char *str);  DBusHandlerResult error_unsupported_major_class(DBusConnection *conn, DBusMessage *msg); diff --git a/hcid/dbus-hci.c b/hcid/dbus-hci.c index 1b7c9cfa..50e6b37d 100644 --- a/hcid/dbus-hci.c +++ b/hcid/dbus-hci.c @@ -60,6 +60,15 @@  #include "dbus-hci.h"  static DBusConnection *connection = NULL; +static GSList *adapters = NULL; + +gint find_adapter(gconstpointer a, gconstpointer b) +{ +	const struct adapter *adapter = a; +	const char *path = b; + +	return strcmp(adapter->path, path); +}  void bonding_request_free(struct bonding_request_info *bonding)  { @@ -403,17 +412,18 @@ static void reply_pending_requests(const char *path, struct adapter *adapter)  int unregister_adapter_path(const char *path)  {  	struct adapter *adapter = NULL; +	GSList *l;  	info("Unregister path: %s", path);  	__remove_servers(path); -	dbus_connection_get_object_user_data(connection, path, -						(void *) &adapter); - -	if (!adapter) +	l = g_slist_find_custom(adapters, path, find_adapter); +	if (!l)  		goto unreg; +	adapter = l->data; +  	/* check pending requests */  	reply_pending_requests(path, adapter); @@ -482,17 +492,20 @@ int unregister_adapter_path(const char *path)  		g_slist_free(adapter->devices);  	} +	adapters = g_slist_remove(adapters, adapter); + +	g_free(adapter->path);  	g_free(adapter);  unreg: -	if (!dbus_connection_destroy_object_path(connection, path)) { +	if (!g_dbus_unregister_all_interfaces(connection, path)) {  		error("D-Bus failed to unregister %s object", path);  		return -1;  	}  	if (hcid_dbus_use_experimental()) {  		const char *ptr = path + ADAPTER_PATH_INDEX; -		dbus_connection_destroy_object_path(connection, ptr); +		g_dbus_unregister_all_interfaces(connection, ptr);  	}  	return 0; @@ -523,27 +536,13 @@ int hcid_dbus_register_device(uint16_t id)  	adapter->dev_id = id;  	adapter->pdiscov_resolve_names = 1; -	if (!dbus_connection_create_object_path(connection, -					path, adapter, NULL)) { -		error("D-Bus failed to register %s object", path); +	if (!adapter_init(connection, path, adapter)) { +		error("Adapter interface init failed");  		g_free(adapter);  		return -1;  	} -	if (hcid_dbus_use_experimental()) { -		if (!dbus_connection_create_object_path(connection, -					ptr, adapter, NULL)) { -			error("D-Bus failed to register %s object", ptr); -			dbus_connection_destroy_object_path(connection, path); -			g_free(adapter); -			return -1; -		} -	} - -	if (!adapter_init(connection, path, adapter)) { -		error("Adapter interface init failed"); -		goto failed; -	} +	adapter->path  = g_strdup(path);  	if (!security_init(connection, path)) {  		error("Security interface init failed"); @@ -568,11 +567,14 @@ int hcid_dbus_register_device(uint16_t id)  	__probe_servers(path); +	adapters = g_slist_append(adapters, adapter); +  	return 0;  failed: -	dbus_connection_destroy_object_path(connection, path); -	dbus_connection_destroy_object_path(connection, ptr); +	g_dbus_unregister_interface(connection, path, ADAPTER_INTERFACE); +	g_dbus_unregister_interface(connection, ptr, ADAPTER_INTERFACE); +	g_free(adapter->path);  	g_free(adapter);  	return -1; @@ -687,6 +689,7 @@ int hcid_dbus_start_device(uint16_t id)  	struct hci_conn_info *ci;  	const char *mode;  	int i, err, dd = -1, ret = -1; +	GSList *l;  	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); @@ -698,12 +701,14 @@ int hcid_dbus_start_device(uint16_t id)  	if (hci_test_bit(HCI_RAW, &di.flags))  		return -1; -	if (!dbus_connection_get_object_user_data(connection, path, -							(void *) &adapter)) { +	l = g_slist_find_custom(adapters, path, find_adapter); +	if (!l) {  		error("Getting %s path data failed!", path);  		return -1;  	} +	adapter = l->data; +  	if (hci_test_bit(HCI_INQUIRY, &di.flags))  		adapter->discov_active = 1;  	else @@ -814,14 +819,18 @@ int hcid_dbus_stop_device(uint16_t id)  	char path[MAX_PATH_LENGTH];  	struct adapter *adapter;  	const char *mode = "off"; +	GSList *l;  	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); -	if (!dbus_connection_get_object_user_data(connection, path, -							(void *) &adapter)) { +	l = g_slist_find_custom(adapters, path, find_adapter); +	if (!l) {  		error("Getting %s path data failed!", path);  		return -1;  	} + +	adapter = l->data; +  	/* cancel pending timeout */  	if (adapter->timeout_id) {  		g_source_remove(adapter->timeout_id); @@ -910,6 +919,7 @@ void hcid_dbus_pending_pin_req_add(bdaddr_t *sba, bdaddr_t *dba)  	struct adapter *adapter;  	struct pending_pin_info *info;  	int id; +	GSList *l;  	ba2str(sba, addr); @@ -921,12 +931,14 @@ void hcid_dbus_pending_pin_req_add(bdaddr_t *sba, bdaddr_t *dba)  	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); -	if (!dbus_connection_get_object_user_data(connection, path, -							(void *) &adapter)) { +	l = g_slist_find_custom(adapters, path, find_adapter); +	if (!l) {  		error("Getting %s path data failed!", path);  		return;  	} +	adapter = l->data; +  	info = g_new0(struct pending_pin_info, 1);  	bacpy(&info->bdaddr, dba); @@ -983,6 +995,7 @@ int hcid_dbus_request_pin(int dev, bdaddr_t *sba, struct hci_conn_info *ci)  	struct device *device;  	struct agent *agent;  	int id; +	GSList *l;  	ba2str(sba, addr); @@ -997,12 +1010,14 @@ int hcid_dbus_request_pin(int dev, bdaddr_t *sba, struct hci_conn_info *ci)  	snprintf(path, sizeof(path), "/hci%d", id); -	if (!dbus_connection_get_object_user_data(connection, path, -							(void *) &adapter)) { +	l = g_slist_find_custom(adapters, path, find_adapter); +	if (!l) {  		error("Getting %s path data failed!", path);  		goto old_fallback;  	} +	adapter = l->data; +  	ba2str(&ci->bdaddr, addr);  	device = adapter_find_device(adapter, addr); @@ -1070,12 +1085,14 @@ void hcid_dbus_bonding_process_complete(bdaddr_t *local, bdaddr_t *peer,  	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id);  	/* create the authentication reply */ -	if (!dbus_connection_get_object_user_data(connection, path, -							(void *) &adapter)) { +	l = g_slist_find_custom(adapters, path, find_adapter); +	if (!l) {  		error("Getting %s path data failed!", path);  		return;  	} +	adapter = l->data; +  	if (status)  		cancel_passkey_agent_requests(adapter->passkey_agents, path,  						peer); @@ -1157,6 +1174,7 @@ void hcid_dbus_inquiry_start(bdaddr_t *local)  	char path[MAX_PATH_LENGTH], local_addr[18];  	const char *ptr = path + ADAPTER_PATH_INDEX;  	int id; +	GSList *l;  	ba2str(local, local_addr); @@ -1168,8 +1186,9 @@ void hcid_dbus_inquiry_start(bdaddr_t *local)  	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); -	if (dbus_connection_get_object_user_data(connection, path, -							(void *) &adapter)) { +	l = g_slist_find_custom(adapters, path, find_adapter); +	if (l) { +		adapter = l->data;  		adapter->discov_active = 1;  		/*  		 * Cancel pending remote name request and clean the device list @@ -1342,13 +1361,14 @@ void hcid_dbus_inquiry_complete(bdaddr_t *local)  	}  	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); - -	if (!dbus_connection_get_object_user_data(connection, path, -							(void *) &adapter)) { +	l = g_slist_find_custom(adapters, path, find_adapter); +	if (!l) {  		error("Getting %s path data failed!", path);  		return;  	} +	adapter = l->data; +  	/* Out of range verification */  	if (adapter->pdiscov_active && !adapter->discov_active) {  		send_out_of_range(path, adapter->oor_devices); @@ -1438,6 +1458,7 @@ void hcid_dbus_periodic_inquiry_start(bdaddr_t *local, uint8_t status)  	struct adapter *adapter;  	char path[MAX_PATH_LENGTH], local_addr[18];  	int id; +	GSList *l;  	/* Don't send the signal if the cmd failed */  	if (status) @@ -1452,8 +1473,9 @@ void hcid_dbus_periodic_inquiry_start(bdaddr_t *local, uint8_t status)  	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); -	if (dbus_connection_get_object_user_data(connection, path, -							(void *) &adapter)) { +	l = g_slist_find_custom(adapters, path, find_adapter); +	if (l) { +		adapter = l->data;  		adapter->pdiscov_active = 1;  		/* Disable name resolution for non D-Bus clients */ @@ -1481,6 +1503,7 @@ void hcid_dbus_periodic_inquiry_exit(bdaddr_t *local, uint8_t status)  	char path[MAX_PATH_LENGTH], local_addr[18];  	const char *ptr = path + ADAPTER_PATH_INDEX;  	int id; +	GSList *l;  	/* Don't send the signal if the cmd failed */  	if (status) @@ -1495,13 +1518,14 @@ void hcid_dbus_periodic_inquiry_exit(bdaddr_t *local, uint8_t status)  	}  	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); - -	if (!dbus_connection_get_object_user_data(connection, path, -							(void *) &adapter)) { +	l = g_slist_find_custom(adapters, path, find_adapter); +	if (!l) {  		error("Getting %s path data failed!", path);  		return;  	} +	adapter = l->data; +  	/* reset the discover type to be able to handle D-Bus and non D-Bus  	 * requests */  	adapter->pdiscov_active = 0; @@ -1623,13 +1647,14 @@ void hcid_dbus_inquiry_result(bdaddr_t *local, bdaddr_t *peer, uint32_t class,  	}  	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); - -	if (!dbus_connection_get_object_user_data(connection, path, -							(void *) &adapter)) { +	l = g_slist_find_custom(adapters, path, find_adapter); +	if (!l) {  		error("Getting %s path data failed!", path);  		return;  	} +	adapter = l->data; +  	write_remote_class(local, peer, class);  	if (data) @@ -1765,13 +1790,14 @@ void hcid_dbus_remote_class(bdaddr_t *local, bdaddr_t *peer, uint32_t class)  		struct adapter *adapter;  		GSList *l; -		snprintf(path, sizeof(path), "hci%d", id); +		snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); -		dbus_connection_get_object_user_data(connection, path, -							(void *) &adapter); -		if (!adapter) +		l = g_slist_find_custom(adapters, path, find_adapter); +		if (!l)  			return; +		adapter = l->data; +  		l = g_slist_find_custom(adapter->devices, paddr,  				(GCompareFunc) device_address_cmp);  		if (!l) @@ -1791,6 +1817,7 @@ void hcid_dbus_remote_name(bdaddr_t *local, bdaddr_t *peer, uint8_t status,  	char path[MAX_PATH_LENGTH], local_addr[18], peer_addr[18];  	const char *paddr = peer_addr;  	int id; +	GSList *l;  	ba2str(local, local_addr);  	ba2str(peer, peer_addr); @@ -1802,13 +1829,14 @@ void hcid_dbus_remote_name(bdaddr_t *local, bdaddr_t *peer, uint8_t status,  	}  	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); - -	if (!dbus_connection_get_object_user_data(connection, path, -							(void *) &adapter)) { +	l = g_slist_find_custom(adapters, path, find_adapter); +	if (!l) {  		error("Getting %s path data failed!", path);  		return;  	} +	adapter = l->data; +  	if (status)  		dbus_connection_emit_signal(connection, path,  						ADAPTER_INTERFACE, @@ -1893,6 +1921,7 @@ void hcid_dbus_conn_complete(bdaddr_t *local, uint8_t status, uint16_t handle,  	const char *paddr = peer_addr;  	struct adapter *adapter;  	int id; +	GSList *l;  	ba2str(local, local_addr);  	ba2str(peer, peer_addr); @@ -1904,16 +1933,15 @@ void hcid_dbus_conn_complete(bdaddr_t *local, uint8_t status, uint16_t handle,  	}  	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); - -	if (!dbus_connection_get_object_user_data(connection, path, -							(void *) &adapter)) { +	l = g_slist_find_custom(adapters, path, find_adapter); +	if (!l) {  		error("Getting %s path data failed!", path);  		return;  	} -	if (status) { -		GSList *l; +	adapter = l->data; +	if (status) {  		cancel_passkey_agent_requests(adapter->passkey_agents, path,  						peer);  		release_passkey_agents(adapter, peer); @@ -1980,13 +2008,14 @@ void hcid_dbus_disconn_complete(bdaddr_t *local, uint8_t status,  	}  	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); - -	if (!dbus_connection_get_object_user_data(connection, path, -							(void *) &adapter)) { +	l = g_slist_find_custom(adapters, path, find_adapter); +	if (!l) {  		error("Getting %s path data failed!", path);  		return;  	} +	adapter = l->data; +  	l = g_slist_find_custom(adapter->active_conn, &handle,  				active_conn_find_by_handle); @@ -2232,6 +2261,7 @@ void hcid_dbus_setscan_enable_complete(bdaddr_t *local)  	read_scan_enable_rp rp;  	struct hci_request rq;  	int id, dd = -1; +	GSList *l;  	ba2str(local, local_addr);  	id = hci_devid(local_addr); @@ -2267,12 +2297,14 @@ void hcid_dbus_setscan_enable_complete(bdaddr_t *local)  		goto failed;  	} -	if (!dbus_connection_get_object_user_data(connection, path, -							(void *) &adapter)) { +	l = g_slist_find_custom(adapters, path, find_adapter); +	if (!l) {  		error("Getting %s path data failed!", path);  		goto failed;  	} +	adapter = l->data; +  	if (adapter->timeout_id) {  		g_source_remove(adapter->timeout_id);  		adapter->timeout_id = 0; @@ -2292,6 +2324,7 @@ void hcid_dbus_write_class_complete(bdaddr_t *local)  	char path[MAX_PATH_LENGTH], local_addr[18];  	int id, dd;  	uint8_t cls[3]; +	GSList *l;  	ba2str(local, local_addr);  	id = hci_devid(local_addr); @@ -2301,12 +2334,14 @@ void hcid_dbus_write_class_complete(bdaddr_t *local)  	}  	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); -	if (!dbus_connection_get_object_user_data(connection, path, -							(void *) &adapter)) { +	l = g_slist_find_custom(adapters, path, find_adapter); +	if (!l) {  		error("Getting %s path data failed!", path);  		return;  	} +	adapter = l->data; +  	dd = hci_open_dev(id);  	if (dd < 0) {  		error("HCI device open failed: hci%d", id); @@ -2381,13 +2416,14 @@ void hcid_dbus_pin_code_reply(bdaddr_t *local, void *ptr)  	}  	snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id); - -	if (!dbus_connection_get_object_user_data(connection, path, -							(void *) &adapter)) { +	l = g_slist_find_custom(adapters, path, find_adapter); +	if (!l) {  		error("Getting %s path data failed!", path);  		return;  	} +	adapter = l->data; +  	l = g_slist_find_custom(adapter->pin_reqs, &ret->bdaddr, pin_req_cmp);  	if (l) {  		struct pending_pin_info *p = l->data; diff --git a/hcid/dbus-sdp.c b/hcid/dbus-sdp.c index 2a0aa583..2af53b27 100644 --- a/hcid/dbus-sdp.c +++ b/hcid/dbus-sdp.c @@ -98,6 +98,29 @@ struct cached_session {  static GSList *cached_sessions = NULL; +static inline DBusMessage *invalid_args(DBusMessage *msg) +{ +	return g_dbus_create_error(msg, ERROR_INTERFACE ".InvalidArguments", +			"Invalid arguments in method call"); +} + +static inline DBusMessage *in_progress(DBusMessage *msg, const char *str) +{ +	return g_dbus_create_error(msg, ERROR_INTERFACE ".InProgress", str); +} + +static inline DBusMessage *adapter_not_ready(DBusMessage *msg) +{ +	return g_dbus_create_error(msg, ERROR_INTERFACE ".NotReady", +			"Adapter is not ready"); +} + +static inline DBusMessage *failed_strerror(DBusMessage *msg, int err) +{ +	return g_dbus_create_error(msg, ERROR_INTERFACE ".Failed", +			strerror(err)); +} +  static gboolean session_timeout(gpointer user_data)  {  	struct cached_session *s = user_data; @@ -997,7 +1020,7 @@ static int remote_svc_rec_conn_xml_cb(struct transaction_context *ctxt)  	return 0;  } -DBusHandlerResult get_remote_svc_rec(DBusConnection *conn, DBusMessage *msg, +DBusMessage *get_remote_svc_rec(DBusConnection *conn, DBusMessage *msg,  				void *data, sdp_format_t format)  {  	struct adapter *adapter = data; @@ -1007,16 +1030,16 @@ DBusHandlerResult get_remote_svc_rec(DBusConnection *conn, DBusMessage *msg,  	connect_cb_t *cb;  	if (!adapter->up) -		return error_not_ready(conn, msg); +		return adapter_not_ready(msg);  	if (!dbus_message_get_args(msg, NULL,  			DBUS_TYPE_STRING, &dst,  			DBUS_TYPE_UINT32, &handle,  			DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (find_pending_connect(dst)) -		return error_service_search_in_progress(conn, msg); +		return in_progress(msg, "Service search in progress");  	cb = remote_svc_rec_conn_cb;  	if (format == SDP_FORMAT_XML) @@ -1025,10 +1048,10 @@ DBusHandlerResult get_remote_svc_rec(DBusConnection *conn, DBusMessage *msg,  	if (!connect_request(conn, msg, adapter->dev_id,  				dst, cb, &err)) {  		error("Search request failed: %s (%d)", strerror(err), err); -		return error_failed_errno(conn, msg, err); +		return failed_strerror(msg, err);  	} -	return DBUS_HANDLER_RESULT_HANDLED; +	return NULL;  }  static int remote_svc_handles_conn_cb(struct transaction_context *ctxt) @@ -1072,7 +1095,8 @@ static int remote_svc_identifiers_conn_cb(struct transaction_context *ctxt)  	return service_search_attr(ctxt, PUBLIC_BROWSE_GROUP);  } -DBusHandlerResult get_remote_svc_handles(DBusConnection *conn, DBusMessage *msg, void *data) +DBusMessage *get_remote_svc_handles(DBusConnection *conn, +				DBusMessage *msg, void *data)  {  	struct adapter *adapter = data;  	const char *dst, *svc; @@ -1080,77 +1104,72 @@ DBusHandlerResult get_remote_svc_handles(DBusConnection *conn, DBusMessage *msg,  	uuid_t uuid;  	if (!adapter->up) -		return error_not_ready(conn, msg); +		return adapter_not_ready(msg);  	if (!dbus_message_get_args(msg, NULL,  			DBUS_TYPE_STRING, &dst,  			DBUS_TYPE_STRING, &svc,  			DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (strlen(svc) > 0) {  		/* Check if it is a service name string */  		if (str2uuid(&uuid, svc) < 0) {  			error("Invalid service class name"); -			return error_invalid_arguments(conn, msg, NULL); +			return invalid_args(msg);  		}  	}  	if (find_pending_connect(dst)) -		return error_service_search_in_progress(conn, msg); +		return in_progress(msg, "Service search in progress");  	if (!connect_request(conn, msg, adapter->dev_id,  				dst, remote_svc_handles_conn_cb, &err)) {  		error("Search request failed: %s (%d)", strerror(err), err); -		return error_failed_errno(conn, msg, err); +		return failed_strerror(msg, err);  	} -	return DBUS_HANDLER_RESULT_HANDLED; +	return NULL;  } -DBusHandlerResult get_remote_svc_identifiers(DBusConnection *conn, DBusMessage *msg, void *data) +DBusMessage *get_remote_svc_identifiers(DBusConnection *conn, DBusMessage *msg, void *data)  {  	struct adapter *adapter = data;  	const char *dst;  	int err;  	if (!adapter->up) -		return error_not_ready(conn, msg); +		return adapter_not_ready(msg);  	if (!dbus_message_get_args(msg, NULL,  			DBUS_TYPE_STRING, &dst,  			DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); +		return invalid_args(msg);  	if (find_pending_connect(dst)) -		return error_service_search_in_progress(conn, msg); +		return in_progress(msg, "Service search in progress");  	if (!connect_request(conn, msg, adapter->dev_id,  				dst, remote_svc_identifiers_conn_cb, &err)) {  		error("Search request failed: %s (%d)", strerror(err), err); -		return error_failed_errno(conn, msg, err); +		return failed_strerror(msg, err);  	} -	return DBUS_HANDLER_RESULT_HANDLED; +	return NULL;  } -DBusHandlerResult finish_remote_svc_transact(DBusConnection *conn, -						DBusMessage *msg, void *data) +DBusMessage *finish_remote_svc_transact(DBusConnection *conn, +					DBusMessage *msg, void *data)  {  	struct cached_session *s;  	const char *address;  	struct adapter *adapter = data; -	DBusMessage *reply;  	bdaddr_t sba, dba;  	if (!dbus_message_get_args(msg, NULL,  			DBUS_TYPE_STRING, &address,  			DBUS_TYPE_INVALID)) -		return error_invalid_arguments(conn, msg, NULL); - -	reply = dbus_message_new_method_return(msg); -	if (!reply) -		return DBUS_HANDLER_RESULT_NEED_MEMORY; +		return invalid_args(msg);  	str2ba(adapter->address, &sba);  	str2ba(address, &dba); @@ -1162,5 +1181,5 @@ DBusHandlerResult finish_remote_svc_transact(DBusConnection *conn,  		g_free(s);  	} -	return send_message_and_unref(conn, reply); +	return dbus_message_new_method_return(msg);  } diff --git a/hcid/dbus-sdp.h b/hcid/dbus-sdp.h index a5a14c05..2a49db41 100644 --- a/hcid/dbus-sdp.h +++ b/hcid/dbus-sdp.h @@ -27,16 +27,16 @@ typedef enum {  	SDP_FORMAT_BINARY  } sdp_format_t; -DBusHandlerResult get_remote_svc_handles(DBusConnection *conn, -						DBusMessage *msg, void *data); +DBusMessage *get_remote_svc_handles(DBusConnection *conn, +				DBusMessage *msg, void *data); -DBusHandlerResult get_remote_svc_identifiers(DBusConnection *conn, -						DBusMessage *msg, void *data); +DBusMessage *get_remote_svc_identifiers(DBusConnection *conn, +					DBusMessage *msg, void *data); -DBusHandlerResult get_remote_svc_rec(DBusConnection *conn, DBusMessage *msg, +DBusMessage *get_remote_svc_rec(DBusConnection *conn, DBusMessage *msg,  					void *data, sdp_format_t format); -DBusHandlerResult finish_remote_svc_transact(DBusConnection *conn, -						DBusMessage *msg, void *data); +DBusMessage *finish_remote_svc_transact(DBusConnection *conn, +					DBusMessage *msg, void *data);  uint16_t sdp_str2svclass(const char *str); | 
