void mcap_mcl_unref(struct mcap_mcl *mcl) { mcl->ref--; DBG("mcap_mcl_unref(%p): ref=%d", mcl, mcl->ref); if (mcl->ref > 0) return; mcap_mcl_release(mcl); mcap_instance_unref(mcl->mi); g_free(mcl->cb); g_free(mcl); }
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; }