summaryrefslogtreecommitdiffstats
path: root/hcid/dbus-adapter.c
diff options
context:
space:
mode:
authorClaudio Takahasi <claudio.takahasi@openbossa.org>2006-08-18 18:29:40 +0000
committerClaudio Takahasi <claudio.takahasi@openbossa.org>2006-08-18 18:29:40 +0000
commit3dec6f11d625a351bae0aada4160f3d2de429cdd (patch)
treed77a073813bf7f34fc18dcaea812f94cd46d41e1 /hcid/dbus-adapter.c
parent58887f9452b222cfb28bf8c5c11d13bd5de95efb (diff)
Fixed SetMode when the adapter is DOWN
Diffstat (limited to 'hcid/dbus-adapter.c')
-rw-r--r--hcid/dbus-adapter.c68
1 files changed, 61 insertions, 7 deletions
diff --git a/hcid/dbus-adapter.c b/hcid/dbus-adapter.c
index 4b1b0a63..3c4ce652 100644
--- a/hcid/dbus-adapter.c
+++ b/hcid/dbus-adapter.c
@@ -406,6 +406,26 @@ static DBusHandlerResult handle_dev_set_mode_req(DBusConnection *conn, DBusMessa
if (dd < 0)
return error_no_such_adapter(conn, msg);
+ if (!dbus_data->up) {
+ bdaddr_t local;
+
+ str2ba(dbus_data->address, &local);
+ /* The new value will be loaded when the adapter comes UP */
+ write_device_mode(&local, scan_mode);
+
+ /* Start HCI device */
+ if (ioctl(dd, HCIDEVUP, dbus_data->dev_id) == 0)
+ goto done; /* on success */
+
+ if (errno != EALREADY) {
+ error("Can't init device hci%d: %s (%d)\n",
+ dbus_data->dev_id, strerror(errno), errno);
+
+ hci_close_dev(dd);
+ return error_failed(conn, msg, errno);
+ }
+ }
+
/* Check if the new requested mode is different from the current */
if (current_mode != hci_mode) {
struct hci_request rq;
@@ -433,6 +453,7 @@ static DBusHandlerResult handle_dev_set_mode_req(DBusConnection *conn, DBusMessa
}
}
+done:
hci_close_dev(dd);
reply = dbus_message_new_method_return(msg);
@@ -468,6 +489,9 @@ static DBusHandlerResult handle_dev_set_discoverable_to_req(DBusConnection *conn
uint32_t timeout;
bdaddr_t bdaddr;
+ if (!dbus_data->up)
+ return error_not_ready(conn, msg);
+
dbus_error_init(&err);
dbus_message_get_args(msg, &err,
DBUS_TYPE_UINT32, &timeout,
@@ -654,6 +678,9 @@ static DBusHandlerResult handle_dev_list_minor_classes_req(DBusConnection *conn,
uint8_t major_class;
int dd, size, i;
+ if (!dbus_data->up)
+ return error_not_ready(conn, msg);
+
if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING))
return error_invalid_arguments(conn, msg);
@@ -709,6 +736,9 @@ static DBusHandlerResult handle_dev_get_minor_class_req(DBusConnection *conn, DB
uint8_t minor_class;
int dd;
+ if (!dbus_data->up)
+ return error_not_ready(conn, msg);
+
if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING))
return error_invalid_arguments(conn, msg);
@@ -759,6 +789,9 @@ static DBusHandlerResult handle_dev_set_minor_class_req(DBusConnection *conn, DB
uint32_t dev_class = 0xFFFFFFFF;
int i, dd;
+ if (!dbus_data->up)
+ return error_not_ready(conn, msg);
+
dbus_error_init(&err);
dbus_message_get_args(msg, &err,
DBUS_TYPE_STRING, &minor,
@@ -841,6 +874,9 @@ static DBusHandlerResult handle_dev_get_service_classes_req(DBusConnection *conn
uint8_t cls[3];
int dd, i;
+ if (!dbus_data->up)
+ return error_not_ready(conn, msg);
+
if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING))
return error_invalid_arguments(conn, msg);
@@ -916,6 +952,9 @@ static DBusHandlerResult handle_dev_set_name_req(DBusConnection *conn, DBusMessa
char *str_ptr;
int ecode;
+ if (!dbus_data->up)
+ return error_not_ready(conn, msg);
+
dbus_error_init(&err);
dbus_message_get_args(msg, &err,
DBUS_TYPE_STRING, &str_ptr,
@@ -1342,6 +1381,9 @@ static DBusHandlerResult handle_dev_get_remote_name_req(DBusConnection *conn, DB
return send_reply_and_unref(conn, reply);
}
+ if (!dbus_data->up)
+ return error_not_ready(conn, msg);
+
/* put the request name in the queue to resolve name */
str2ba(peer_addr, &peer_bdaddr);
disc_device_append(&dbus_data->disc_devices, &peer_bdaddr, NAME_PENDING, RESOLVE_NAME);
@@ -1605,6 +1647,9 @@ static DBusHandlerResult handle_dev_disconnect_remote_device_req(DBusConnection
int dd;
struct active_conn_info *dev;
+ if (!dbus_data->up)
+ return error_not_ready(conn, msg);
+
dbus_error_init(&err);
dbus_message_get_args(msg, &err,
DBUS_TYPE_STRING, &peer_addr,
@@ -1663,6 +1708,9 @@ static DBusHandlerResult handle_dev_create_bonding_req(DBusConnection *conn, DBu
bdaddr_t peer_bdaddr;
int dd, disconnect;
+ if (!dbus_data->up)
+ return error_not_ready(conn, msg);
+
dbus_error_init(&err);
dbus_message_get_args(msg, &err,
DBUS_TYPE_STRING, &peer_addr,
@@ -1779,6 +1827,9 @@ static DBusHandlerResult handle_dev_cancel_bonding_req(DBusConnection *conn, DBu
const char *peer_addr;
int dd = -1;
+ if (!dbus_data->up)
+ return error_not_ready(conn, msg);
+
dbus_error_init(&err);
dbus_message_get_args(msg, &err,
DBUS_TYPE_STRING, &peer_addr,
@@ -1882,6 +1933,9 @@ static DBusHandlerResult handle_dev_remove_bonding_req(DBusConnection *conn, DBu
bdaddr_t bdaddr;
int dd;
+ if (!dbus_data->up)
+ return error_not_ready(conn, msg);
+
dbus_error_init(&err);
dbus_message_get_args(msg, &err,
DBUS_TYPE_STRING, &addr_ptr,
@@ -2119,6 +2173,9 @@ static DBusHandlerResult handle_dev_discover_devices_req(DBusConnection *conn, D
uint32_t lap = 0x9e8b33;
int dd;
+ if (!dbus_data->up)
+ return error_not_ready(conn, msg);
+
if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING))
return error_invalid_arguments(conn, msg);
@@ -2187,6 +2244,9 @@ static DBusHandlerResult handle_dev_cancel_discovery_req(DBusConnection *conn, D
uint8_t status = 0x00;
int dd = -1;
+ if (!dbus_data->up)
+ return error_not_ready(conn, msg);
+
if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING))
return error_invalid_arguments(conn, msg);
@@ -2382,7 +2442,6 @@ static struct service_data dev_services[] = {
DBusHandlerResult msg_func_device(DBusConnection *conn, DBusMessage *msg, void *data)
{
- const struct hci_dbus_data *pdata = data;
const char *iface, *name;
iface = dbus_message_get_interface(msg);
@@ -2391,12 +2450,7 @@ DBusHandlerResult msg_func_device(DBusConnection *conn, DBusMessage *msg, void *
if (!strcmp(DBUS_INTERFACE_INTROSPECTABLE, iface) &&
!strcmp("Introspect", name)) {
return simple_introspect(conn, msg, data);
- }
-
- if (!pdata->up)
- return error_not_ready(conn, msg);
- else
- if (!strcmp(ADAPTER_INTERFACE, iface)) {
+ } else if (!strcmp(ADAPTER_INTERFACE, iface)) {
service_handler_func_t handler;
handler = find_service_handler(dev_services, msg);