struct hciemu *hciemu_new(enum hciemu_type type) { struct hciemu *hciemu; hciemu = new0(struct hciemu, 1); if (!hciemu) return NULL; switch (type) { case HCIEMU_TYPE_BREDRLE: hciemu->btdev_type = BTDEV_TYPE_BREDRLE; break; case HCIEMU_TYPE_BREDR: hciemu->btdev_type = BTDEV_TYPE_BREDR; break; case HCIEMU_TYPE_LE: hciemu->btdev_type = BTDEV_TYPE_LE; break; case HCIEMU_TYPE_LEGACY: hciemu->btdev_type = BTDEV_TYPE_BREDR20; break; default: return NULL; } hciemu->post_command_hooks = queue_new(); if (!hciemu->post_command_hooks) { free(hciemu); return NULL; } if (!create_vhci(hciemu)) { queue_destroy(hciemu->post_command_hooks, NULL); free(hciemu); return NULL; } if (!create_stack(hciemu)) { g_source_remove(hciemu->master_source); btdev_destroy(hciemu->master_dev); queue_destroy(hciemu->post_command_hooks, NULL); free(hciemu); return NULL; } g_idle_add(start_stack, hciemu); return hciemu_ref(hciemu); }
struct hciemu *hciemu_new(enum hciemu_type type) { struct hciemu *hciemu; hciemu = g_try_new0(struct hciemu, 1); if (!hciemu) return NULL; switch (type) { case HCIEMU_TYPE_BREDRLE: hciemu->btdev_type = BTDEV_TYPE_BREDRLE; break; case HCIEMU_TYPE_BREDR: hciemu->btdev_type = BTDEV_TYPE_BREDR; break; case HCIEMU_TYPE_LE: hciemu->btdev_type = BTDEV_TYPE_LE; break; default: return NULL; } if (!create_vhci(hciemu)) { g_free(hciemu); return NULL; } if (!create_stack(hciemu)) { g_source_remove(hciemu->master_source); btdev_destroy(hciemu->master_dev); g_free(hciemu); return NULL; } g_idle_add(start_stack, hciemu); return hciemu_ref(hciemu); }