static void search_cb(sdp_list_t *recs, int err, gpointer user_data) { DBG(""); struct conn_mcl_data *conn_data = user_data; GError *gerr = NULL; bdaddr_t dst; uint16_t ccpsm; if (!conn_data->dev->mcap_adapter->mi) { g_set_error(&gerr, MCAP_ERROR, MCAP_CONNECTION_ERROR, "Mcap instance released"); goto fail; } if (err || !recs) { g_set_error(&gerr, MCAP_ERROR, MCAP_CONNECTION_ERROR, "Error getting remote SDP records"); goto fail; } if (!get_ccpsm(recs, &ccpsm)) { g_set_error(&gerr, MCAP_ERROR, MCAP_CONNECTION_ERROR, "Can't get remote PSM for control channel"); goto fail; } conn_data = con_mcl_data_ref(conn_data); device_get_address(conn_data->dev->dev, &dst,NULL); if (!mcap_create_mcl(conn_data->dev->mcap_adapter->mi, &dst, ccpsm, create_mcl_cb, conn_data, destroy_con_mcl_data, &gerr)) { con_mcl_data_unref(conn_data); goto fail; } return; fail: conn_data->func(conn_data->data, gerr); g_error_free(gerr); }
int main(int argc, char *argv[]) { GError *err = NULL; bdaddr_t src, dst; int opt; char bdastr[18]; hci_devba(0, &src); bacpy(&dst, BDADDR_ANY); mloop = g_main_loop_new(NULL, FALSE); if (!mloop) { printf("Cannot create main loop\n"); exit(1); } while ((opt = getopt_long(argc, argv, "+i:c:C:D:e:f:dghunab", main_options, NULL)) != EOF) { switch (opt) { case 'i': if (!strncmp(optarg, "hci", 3)) hci_devba(atoi(optarg + 3), &src); else str2ba(optarg, &src); break; case 'c': control_mode = MODE_CONNECT; str2ba(optarg, &dst); break; case 'd': data_mode = MODE_CONNECT; break; case 'a': mdl_disconnect = TRUE; break; case 'b': mcl_disconnect = TRUE; break; case 'e': mcl_disconnect_timeout = atoi(optarg); break; case 'f': mdl_disconnect_timeout = atoi(optarg); break; case 'g': send_synccap_req = TRUE; break; case 'u': mdl_conn_req_result = MCAP_RESOURCE_UNAVAILABLE; break; case 'n': no_close = TRUE; break; case 'C': ccpsm = atoi(optarg); break; case 'D': dcpsm = atoi(optarg); break; case 'h': default: usage(); exit(0); } } mcap = mcap_create_instance(&src, BT_IO_SEC_MEDIUM, ccpsm, dcpsm, mcl_connected, mcl_reconnected, mcl_disconnected, mcl_uncached, NULL, /* CSP is not used right now */ NULL, &err); if (!mcap) { printf("MCAP instance creation failed %s\n", err->message); g_error_free(err); exit(1); } mcap_enable_csp(mcap); switch (control_mode) { case MODE_CONNECT: ba2str(&dst, bdastr); printf("Connecting to %s\n", bdastr); mcap_create_mcl(mcap, &dst, ccpsm, create_mcl_cb, NULL, NULL, &err); if (err) { printf("MCAP create error %s\n", err->message); g_error_free(err); exit(1); } break; case MODE_LISTEN: printf("Listening for control channel connection\n"); break; case MODE_NONE: default: goto done; } g_main_loop_run(mloop); done: printf("Done\n"); if (mcap) mcap_instance_unref(mcap); g_main_loop_unref(mloop); return 0; }