static int mgmt_set_powered(int index, gboolean powered) { DBG("index %d powered %d", index, powered); return mgmt_set_mode(index, MGMT_OP_SET_POWERED, powered); }
static void read_info_complete(int sk, void *buf, size_t len) { struct mgmt_rp_read_info *rp = buf; struct controller_info *info; struct btd_adapter *adapter; uint8_t mode; uint16_t index; char addr[18]; if (len < sizeof(*rp)) { error("Too small read info complete event"); return; } index = btohs(bt_get_unaligned(&rp->index)); if (index > max_index) { error("Unexpected index %u in read info complete", index); return; } mgmt_set_mode(index, MGMT_OP_SET_SERVICE_CACHE, 1); info = &controllers[index]; info->type = rp->type; info->enabled = rp->powered; info->connectable = rp->connectable; info->discoverable = rp->discoverable; info->pairable = rp->pairable; info->sec_mode = rp->sec_mode; bacpy(&info->bdaddr, &rp->bdaddr); memcpy(info->dev_class, rp->dev_class, 3); memcpy(info->features, rp->features, 8); info->manufacturer = btohs(bt_get_unaligned(&rp->manufacturer)); info->hci_ver = rp->hci_ver; info->hci_rev = btohs(bt_get_unaligned(&rp->hci_rev)); ba2str(&info->bdaddr, addr); DBG("hci%u type %u addr %s", index, info->type, addr); DBG("hci%u class 0x%02x%02x%02x", index, info->dev_class[2], info->dev_class[1], info->dev_class[0]); DBG("hci%u manufacturer %d HCI ver %d:%d", index, info->manufacturer, info->hci_ver, info->hci_rev); DBG("hci%u enabled %u discoverable %u pairable %u sec_mode %u", index, info->enabled, info->discoverable, info->pairable, info->sec_mode); adapter = btd_manager_register_adapter(index); if (adapter == NULL) { error("mgmtops: unable to register adapter"); return; } btd_adapter_get_mode(adapter, &mode, NULL, NULL); if (mode == MODE_OFF) { mgmt_set_powered(index, FALSE); return; } if (info->enabled) mgmt_update_powered(index, TRUE); else mgmt_set_powered(index, TRUE); btd_adapter_unref(adapter); }
static int mgmt_set_pairable(int index, gboolean pairable) { DBG("index %d pairable %d", index, pairable); return mgmt_set_mode(index, MGMT_OP_SET_PAIRABLE, pairable); }
static int mgmt_set_discoverable(int index, gboolean discoverable) { DBG("index %d discoverable %d", index, discoverable); return mgmt_set_mode(index, MGMT_OP_SET_DISCOVERABLE, discoverable); }
static int mgmt_set_connectable(int index, gboolean connectable) { DBG("index %d connectable %d", index, connectable); return mgmt_set_mode(index, MGMT_OP_SET_CONNECTABLE, connectable); }
static int mgmt_disable_cod_cache(int index) { DBG("index %d", index); return mgmt_set_mode(index, MGMT_OP_SET_SERVICE_CACHE, 0); }
int bt_mgmt_adapter_init(uint16_t index) { int sk; if((sk = mgmt_create()) < 0) { fprintf(stderr, "can't open a management socket\n"); return -1; } step = E_SET_POWERED; if(mgmt_set_mode(sk, index, MGMT_OP_SET_POWERED, TRUE) < 0) { fprintf(stderr, "set_powered failed\n"); close(sk); return -1; } if(mgmt_read_evt(sk, index) < 0) { close(sk); return -1; } step = E_SET_LOCAL_NAME; if(mgmt_set_local_name(sk, index) < 0) { fprintf(stderr, "set_local_name failed\n"); close(sk); return -1; } if(mgmt_read_evt(sk, index) < 0) { close(sk); return -1; } step = E_SET_CONNECTABLE; if(mgmt_set_mode(sk, index, MGMT_OP_SET_CONNECTABLE, TRUE) < 0) { fprintf(stderr, "set_connectable failed\n"); close(sk); return -1; } if(mgmt_read_evt(sk, index) < 0) { close(sk); return -1; } step = E_LOAD_LINK_KEYS; bdaddr_t bdaddrs[2]; unsigned char keys[2][16]; if(read_link_keys(index, 2, bdaddrs, keys) < 0) { fprintf(stderr, "read_link_keys failed\n"); close(sk); return -1; } if(mgmt_load_link_keys(sk, index, 2, bdaddrs, keys) < 0) { fprintf(stderr, "load_link_keys failed\n"); close(sk); return -1; } if(mgmt_read_evt(sk, index) < 0) { close(sk); return -1; } close(sk); return 0; }