X-Git-Url: https://sigrok.org/gitweb/?a=blobdiff_plain;f=src%2Fbt%2Fbt_bluez.c;h=e38727348a0ddaf574fc505e159c47170c1aa847;hb=b4066aa80eb0cfad7e608454ba1ad60e795e0b03;hp=8df950fb2e13ea762e2fc368d7e0e940e529ef6d;hpb=f314d871111bca36171d4abc4e56f403f85f9d3f;p=libsigrok.git diff --git a/src/bt/bt_bluez.c b/src/bt/bt_bluez.c index 8df950fb..e3872734 100644 --- a/src/bt/bt_bluez.c +++ b/src/bt/bt_bluez.c @@ -91,6 +91,7 @@ #define LOG_PREFIX "bt-bluez" /** @endcond */ +#define CONNECT_BLE_TIMEOUT 20 /* Connect timeout in seconds. */ #define STORE_MAC_REVERSE 1 #define ACCEPT_NONSEP_MAC 1 @@ -217,12 +218,12 @@ SR_PRIV const char *sr_bt_adapter_get_address(size_t idx) char addr[20]; rc = hci_devinfo(idx, &info); - sr_dbg("DIAG: hci_devinfo(%zu) => rc %d", idx, rc); + sr_spew("DIAG: hci_devinfo(%zu) => rc %d", idx, rc); if (rc < 0) return NULL; rc = ba2str(&info.bdaddr, addr); - sr_dbg("DIAG: ba2str() => rc %d", rc); + sr_spew("DIAG: ba2str() => rc %d", rc); if (rc < 0) return NULL; @@ -403,7 +404,7 @@ static int sr_bt_desc_open(struct sr_bt_desc *desc, int *id_ref) id = hci_get_route(NULL); } if (id < 0) { - sr_spew("devid failed"); + sr_err("devid failed"); return -1; } desc->devid = id; @@ -668,6 +669,7 @@ SR_PRIV int sr_bt_connect_ble(struct sr_bt_desc *desc) struct sockaddr_l2 sl2; bdaddr_t mac; int s, ret; + gint64 deadline; if (!desc) return -1; @@ -710,6 +712,8 @@ SR_PRIV int sr_bt_connect_ble(struct sr_bt_desc *desc) } } + deadline = g_get_monotonic_time(); + deadline += CONNECT_BLE_TIMEOUT * 1000 * 1000; str2ba(desc->remote_addr, &mac); memcpy(&sl2.l2_bdaddr, &mac, sizeof(sl2.l2_bdaddr)); sl2.l2_bdaddr_type = BDADDR_LE_PUBLIC; @@ -745,6 +749,10 @@ SR_PRIV int sr_bt_connect_ble(struct sr_bt_desc *desc) continue; if (!(fds[0].revents & POLLOUT)) continue; + if (g_get_monotonic_time() >= deadline) { + sr_warn("Connect attempt timed out"); + return SR_ERR_IO; + } } while (1); memset(fds, 0, sizeof(fds)); fds[0].fd = s;