diff options
-rw-r--r-- | hcid/device.c | 50 | ||||
-rw-r--r-- | hcid/main.c | 59 |
2 files changed, 61 insertions, 48 deletions
diff --git a/hcid/device.c b/hcid/device.c index 5c3518dd..883d6feb 100644 --- a/hcid/device.c +++ b/hcid/device.c @@ -99,6 +99,29 @@ void init_devices(void) memset(devices + i, 0, sizeof(struct hci_dev)); } +static int device_read_bdaddr(uint16_t dev_id, bdaddr_t *bdaddr) +{ + int dd; + + dd = hci_open_dev(dev_id); + if (dd < 0) { + error("Can't open device hci%d", + dev_id, strerror(errno), errno); + return -errno; + } + + if (hci_read_bd_addr(dd, bdaddr, 2000) < 0) { + error("Can't read address for hci%d: %s (%d)", + dev_id, strerror(errno), errno); + hci_close_dev(dd); + return -errno; + } + + hci_close_dev(dd); + + return 0; +} + int add_device(uint16_t dev_id) { struct hci_dev *dev; @@ -118,7 +141,13 @@ int add_device(uint16_t dev_id) dev->ignore = 1; } - bacpy(&dev->bdaddr, &di.bdaddr); + if (bacmp(&di.bdaddr, BDADDR_ANY)) + bacpy(&dev->bdaddr, &di.bdaddr); + else { + int ret = device_read_bdaddr(dev_id, &dev->bdaddr); + if (ret < 0) + return ret; + } memcpy(dev->features, di.features, 8); info("Device hci%d has been added", dev_id); @@ -238,7 +267,6 @@ int stop_device(uint16_t dev_id) int get_device_address(uint16_t dev_id, char *address, size_t size) { struct hci_dev *dev; - int dd; ASSERT_DEV_ID; @@ -247,24 +275,6 @@ int get_device_address(uint16_t dev_id, char *address, size_t size) dev = &devices[dev_id]; - if (bacmp(&dev->bdaddr, BDADDR_ANY)) - return ba2str(&dev->bdaddr, address); - - dd = hci_open_dev(dev_id); - if (dd < 0) { - error("Can't open device hci%d", - dev_id, strerror(errno), errno); - return -errno; - } - - if (hci_read_bd_addr(dd, &dev->bdaddr, 2000) < 0) { - error("Can't read address for hci%d: %s (%d)", - dev_id, strerror(errno), errno); - return -errno; - } - - hci_close_dev(dd); - return ba2str(&dev->bdaddr, address); } diff --git a/hcid/main.c b/hcid/main.c index be71c3ad..b15634fe 100644 --- a/hcid/main.c +++ b/hcid/main.c @@ -276,6 +276,8 @@ static void configure_device(int hdev) if (hci_test_bit(HCI_RAW, &di.flags)) exit(0); + memset(&dr, 0, sizeof(dr)); + dr.dev_id = hdev; device_opts = get_device_opts(s, hdev); @@ -447,6 +449,24 @@ static void init_device(int hdev) exit(0); } +static void device_devreg_setup(int dev_id) +{ + if (hcid.auto_init) + init_device(dev_id); + hcid_dbus_register_device(dev_id); +} + +static void device_devup_setup(int dev_id) +{ + add_device(dev_id); + if (hcid.auto_init) + configure_device(dev_id); + if (hcid.security) + start_security_manager(dev_id); + start_device(dev_id); + hcid_dbus_start_device(dev_id); +} + static void init_all_devices(int ctl) { struct hci_dev_list_req *dl; @@ -471,21 +491,12 @@ static void init_all_devices(int ctl) } for (i = 0; i < dl->dev_num; i++, dr++) { - if (hcid.auto_init) - init_device(dr->dev_id); - - add_device(dr->dev_id); - - if (hcid.auto_init && hci_test_bit(HCI_UP, &dr->dev_opt)) - configure_device(dr->dev_id); - - if (hcid.security && hci_test_bit(HCI_UP, &dr->dev_opt)) - start_security_manager(dr->dev_id); - - start_device(dr->dev_id); - - hcid_dbus_register_device(dr->dev_id); - hcid_dbus_start_device(dr->dev_id); + info("HCI dev %d registered", dr->dev_id); + device_devreg_setup(dr->dev_id); + if (hci_test_bit(HCI_UP, &dr->dev_opt)) { + info("HCI dev %d already up", dr->dev_id); + device_devup_setup(dr->dev_id); + } } free(dl); @@ -525,10 +536,7 @@ static inline void device_event(GIOChannel *chan, evt_stack_internal *si) switch (sd->event) { case HCI_DEV_REG: info("HCI dev %d registered", sd->dev_id); - if (hcid.auto_init) - init_device(sd->dev_id); - add_device(sd->dev_id); - hcid_dbus_register_device(sd->dev_id); + device_devreg_setup(sd->dev_id); break; case HCI_DEV_UNREG: @@ -539,12 +547,7 @@ static inline void device_event(GIOChannel *chan, evt_stack_internal *si) case HCI_DEV_UP: info("HCI dev %d up", sd->dev_id); - if (hcid.auto_init) - configure_device(sd->dev_id); - if (hcid.security) - start_security_manager(sd->dev_id); - start_device(sd->dev_id); - hcid_dbus_start_device(sd->dev_id); + device_devup_setup(sd->dev_id); break; case HCI_DEV_DOWN: @@ -712,13 +715,13 @@ int main(int argc, char *argv[]) /* Create event loop */ event_loop = g_main_new(FALSE); - /* Initialize already connected devices */ - init_all_devices(hcid.sock); - ctl_io = g_io_channel_unix_new(hcid.sock); g_io_add_watch(ctl_io, G_IO_IN, io_stack_event, NULL); + /* Initialize already connected devices */ + init_all_devices(hcid.sock); + if (sdp) start_sdp_server(); |