summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--hcid/dbus-adapter.c8
-rw-r--r--hcid/dbus-error.c6
-rw-r--r--hcid/dbus.c143
-rw-r--r--hcid/dbus.h2
-rw-r--r--hcid/hcid.h2
-rw-r--r--hcid/main.c7
6 files changed, 102 insertions, 66 deletions
diff --git a/hcid/dbus-adapter.c b/hcid/dbus-adapter.c
index bec28be2..02cc85c9 100644
--- a/hcid/dbus-adapter.c
+++ b/hcid/dbus-adapter.c
@@ -2382,6 +2382,7 @@ 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);
@@ -2390,7 +2391,12 @@ DBusHandlerResult msg_func_device(DBusConnection *conn, DBusMessage *msg, void *
if (!strcmp(DBUS_INTERFACE_INTROSPECTABLE, iface) &&
!strcmp("Introspect", name)) {
return simple_introspect(conn, msg, data);
- } else if (!strcmp(ADAPTER_INTERFACE, iface)) {
+ }
+
+ if (!pdata->up)
+ return error_not_ready(conn, msg);
+ else
+ if (!strcmp(ADAPTER_INTERFACE, iface)) {
service_handler_func_t handler;
handler = find_service_handler(dev_services, msg);
diff --git a/hcid/dbus-error.c b/hcid/dbus-error.c
index 8b75efeb..079cedf6 100644
--- a/hcid/dbus-error.c
+++ b/hcid/dbus-error.c
@@ -41,6 +41,12 @@ DBusHandlerResult error_failed(DBusConnection *conn, DBusMessage *msg, int err)
dbus_message_new_error(msg, ERROR_INTERFACE ".Failed", str));
}
+DBusHandlerResult error_not_ready(DBusConnection *conn, DBusMessage *msg)
+{
+ return send_reply_and_unref(conn,
+ dbus_message_new_error(msg, ERROR_INTERFACE ".NotReady", "Adapter is not ready"));
+}
+
DBusHandlerResult error_invalid_arguments(DBusConnection *conn, DBusMessage *msg)
{
return send_reply_and_unref(conn,
diff --git a/hcid/dbus.c b/hcid/dbus.c
index 3a6c8e53..9fd5e3b6 100644
--- a/hcid/dbus.c
+++ b/hcid/dbus.c
@@ -361,9 +361,6 @@ static int register_dbus_path(const char *path, uint16_t dev_id,
memset(data, 0, sizeof(struct hci_dbus_data));
data->dev_id = dev_id;
- data->mode = SCAN_DISABLED;
- data->discoverable_timeout = get_discoverable_timeout(dev_id);
- data->discover_type = WITHOUT_NAME_RESOLVING; /* default discover type */
if (fallback) {
if (!dbus_connection_register_fallback(connection, path, pvtable, data)) {
@@ -432,6 +429,74 @@ int hcid_dbus_register_device(uint16_t id)
char path[MAX_PATH_LENGTH];
char *pptr = path;
DBusMessage *message = NULL;
+
+ snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id);
+
+ if (register_dbus_path(path, id, &obj_dev_vtable, FALSE) < 0)
+ return -1;
+
+ /*
+ * Send the adapter added signal
+ */
+ message = dbus_message_new_signal(BASE_PATH, MANAGER_INTERFACE,
+ "AdapterAdded");
+ if (message == NULL) {
+ error("Can't allocate D-Bus message");
+ dbus_connection_unregister_object_path(connection, path);
+ return -1;
+ }
+
+ dbus_message_append_args(message,
+ DBUS_TYPE_STRING, &pptr,
+ DBUS_TYPE_INVALID);
+
+ send_reply_and_unref(connection, message);
+
+ return 0;
+}
+
+int hcid_dbus_unregister_device(uint16_t id)
+{
+ DBusMessage *message;
+ char path[MAX_PATH_LENGTH];
+ char *pptr = path;
+ int ret;
+
+ snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id);
+
+ message = dbus_message_new_signal(BASE_PATH, MANAGER_INTERFACE,
+ "AdapterRemoved");
+ if (message == NULL) {
+ error("Can't allocate D-Bus message");
+ goto failed;
+ }
+
+ dbus_message_append_args(message,
+ DBUS_TYPE_STRING, &pptr,
+ DBUS_TYPE_INVALID);
+
+ if (!dbus_connection_send(connection, message, NULL)) {
+ error("Can't send D-Bus added device message");
+ goto failed;
+ }
+
+ dbus_connection_flush(connection);
+
+failed:
+ if (message)
+ dbus_message_unref(message);
+
+ ret = unregister_dbus_path(path);
+
+ if (ret == 0 && default_dev == id)
+ default_dev = hci_get_route(NULL);
+
+ return ret;
+}
+
+int hcid_dbus_start_device(uint16_t id)
+{
+ char path[MAX_PATH_LENGTH];
int i, err, dd = -1, ret = -1;
read_scan_enable_rp rp;
struct hci_dev_info di;
@@ -441,9 +506,8 @@ int hcid_dbus_register_device(uint16_t id)
struct hci_conn_info *ci;
snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id);
- if (register_dbus_path(path, id, &obj_dev_vtable, FALSE) < 0)
- return -1;
+ /* FIXME: check dupplicated code - configure_device() */
if (hci_devinfo(id, &di) < 0) {
error("Getting device info failed: hci%d", id);
return -1;
@@ -480,6 +544,9 @@ int hcid_dbus_register_device(uint16_t id)
}
pdata->mode = rp.enable; /* Keep the current scan status */
+ pdata->up = 1;
+ pdata->discoverable_timeout = get_discoverable_timeout(id);
+ pdata->discover_type = WITHOUT_NAME_RESOLVING; /* default discover type */
/*
* Get the adapter Bluetooth address
@@ -488,28 +555,6 @@ int hcid_dbus_register_device(uint16_t id)
if (err < 0)
goto failed;
- /*
- * Send the adapter added signal
- */
- message = dbus_message_new_signal(BASE_PATH, MANAGER_INTERFACE,
- "AdapterAdded");
- if (message == NULL) {
- error("Can't allocate D-Bus message");
- goto failed;
- }
-
- /*FIXME: append a friendly name instead of device path */
- dbus_message_append_args(message,
- DBUS_TYPE_STRING, &pptr,
- DBUS_TYPE_INVALID);
-
- if (!dbus_connection_send(connection, message, NULL)) {
- error("Can't send D-BUS adapter added message");
- goto failed;
- }
-
- dbus_connection_flush(connection);
-
/*
* retrieve the active connections: address the scenario where
* the are active connections before the daemon've started
@@ -535,12 +580,6 @@ int hcid_dbus_register_device(uint16_t id)
ret = 0;
failed:
- if (ret < 0)
- dbus_connection_unregister_object_path(connection, path);
-
- if (message)
- dbus_message_unref(message);
-
if (ret == 0 && default_dev < 0)
default_dev = id;
@@ -553,46 +592,24 @@ failed:
return ret;
}
-int hcid_dbus_unregister_device(uint16_t id)
+int hcid_dbus_stop_device(uint16_t id)
{
- DBusMessage *message;
char path[MAX_PATH_LENGTH];
- char *pptr = path;
- int ret;
+ struct hci_dbus_data* pdata;
snprintf(path, sizeof(path), "%s/hci%d", BASE_PATH, id);
- message = dbus_message_new_signal(BASE_PATH, MANAGER_INTERFACE,
- "AdapterRemoved");
- if (message == NULL) {
- error("Can't allocate D-Bus message");
- goto failed;
- }
-
- /*FIXME: append a friendly name instead of device path */
- dbus_message_append_args(message,
- DBUS_TYPE_STRING, &pptr,
- DBUS_TYPE_INVALID);
-
- if (!dbus_connection_send(connection, message, NULL)) {
- error("Can't send D-Bus added device message");
- goto failed;
+ if (!dbus_connection_get_object_path_data(connection, path, (void *) &pdata)) {
+ error("Getting %s path data failed!", path);
+ return -1;
}
- dbus_connection_flush(connection);
-
-failed:
- if (message)
- dbus_message_unref(message);
-
- ret = unregister_dbus_path(path);
-
- if (ret == 0 && default_dev == id)
- default_dev = hci_get_route(NULL);
+ pdata->up = 0;
- return ret;
+ return 0;
}
+
int pending_bonding_cmp(const void *p1, const void *p2)
{
const bdaddr_t *peer1 = p1;
diff --git a/hcid/dbus.h b/hcid/dbus.h
index 5c775871..4052b9c8 100644
--- a/hcid/dbus.h
+++ b/hcid/dbus.h
@@ -97,6 +97,7 @@ struct active_conn_info {
struct hci_dbus_data {
uint16_t dev_id;
+ int up;
char address[18]; /* adapter Bluetooth Address */
uint32_t timeout_id; /* discoverable timeout id */
uint32_t discoverable_timeout; /* discoverable time(msec) */
@@ -134,6 +135,7 @@ DBusMessage *dev_signal_factory(const int devid, const char *prop_name, const in
int get_default_dev_id(void);
DBusHandlerResult error_failed(DBusConnection *conn, DBusMessage *msg, int err);
+DBusHandlerResult error_not_ready(DBusConnection *conn, DBusMessage *msg);
DBusHandlerResult error_invalid_arguments(DBusConnection *conn, DBusMessage *msg);
DBusHandlerResult error_unknown_method(DBusConnection *conn, DBusMessage *msg);
DBusHandlerResult error_not_authorized(DBusConnection *conn, DBusMessage *msg);
diff --git a/hcid/hcid.h b/hcid/hcid.h
index 6f5b493e..76c80906 100644
--- a/hcid/hcid.h
+++ b/hcid/hcid.h
@@ -146,6 +146,8 @@ void hcid_dbus_set_experimental();
int hcid_dbus_use_experimental();
int hcid_dbus_register_device(uint16_t id);
int hcid_dbus_unregister_device(uint16_t id);
+int hcid_dbus_start_device(uint16_t id);
+int hcid_dbus_stop_device(uint16_t id);
void hcid_dbus_pending_bonding_add(bdaddr_t *sba, bdaddr_t *dba);
void hcid_dbus_request_pin(int dev, bdaddr_t *sba, struct hci_conn_info *ci);
diff --git a/hcid/main.c b/hcid/main.c
index 6f96343e..3aea1a89 100644
--- a/hcid/main.c
+++ b/hcid/main.c
@@ -490,6 +490,7 @@ static void init_all_devices(int ctl)
start_device(dr->dev_id);
hcid_dbus_register_device(dr->dev_id);
+ hcid_dbus_start_device(dr->dev_id);
}
free(dl);
@@ -532,10 +533,12 @@ static inline void device_event(GIOChannel *chan, evt_stack_internal *si)
if (hcid.auto_init)
init_device(sd->dev_id);
add_device(sd->dev_id);
+ hcid_dbus_register_device(sd->dev_id);
break;
case HCI_DEV_UNREG:
info("HCI dev %d unregistered", sd->dev_id);
+ hcid_dbus_unregister_device(sd->dev_id);
remove_device(sd->dev_id);
break;
@@ -546,12 +549,12 @@ static inline void device_event(GIOChannel *chan, evt_stack_internal *si)
if (hcid.security)
start_security_manager(sd->dev_id);
start_device(sd->dev_id);
- hcid_dbus_register_device(sd->dev_id);
+ hcid_dbus_start_device(sd->dev_id);
break;
case HCI_DEV_DOWN:
info("HCI dev %d down", sd->dev_id);
- hcid_dbus_unregister_device(sd->dev_id);
+ hcid_dbus_stop_device(sd->dev_id);
if (hcid.security)
stop_security_manager(sd->dev_id);
stop_device(sd->dev_id);