diff options
author | emax <emax@FreeBSD.org> | 2009-05-14 17:10:19 +0000 |
---|---|---|
committer | emax <emax@FreeBSD.org> | 2009-05-14 17:10:19 +0000 |
commit | b8aa665b4a6150092ef1acac35dac70302c2795d (patch) | |
tree | 937c69a1e96912c61641ff47e55f163b9fa5a7f3 /lib/libbluetooth | |
parent | 7b55e64dac3829426422f0f756726f4cc2506dc8 (diff) | |
download | FreeBSD-src-b8aa665b4a6150092ef1acac35dac70302c2795d.zip FreeBSD-src-b8aa665b4a6150092ef1acac35dac70302c2795d.tar.gz |
Avoid floating point arithmetic while calculating iquiry length.
Submitted by: Iain Hibbert < plunky -at- rya-online -dot- net >
MFC after: 1 week
Diffstat (limited to 'lib/libbluetooth')
-rw-r--r-- | lib/libbluetooth/hci.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/lib/libbluetooth/hci.c b/lib/libbluetooth/hci.c index 74c3e63..1ae6ff9 100644 --- a/lib/libbluetooth/hci.c +++ b/lib/libbluetooth/hci.c @@ -410,7 +410,6 @@ bt_devinquiry(char const *devname, time_t length, int num_rsp, ng_hci_inquiry_response *ir; struct bt_devinquiry *i; int s, n; - time_t to; if (ii == NULL) { errno = EINVAL; @@ -452,16 +451,20 @@ bt_devinquiry(char const *devname, time_t length, int num_rsp, cp->lap[1] = 0x8b; cp->lap[2] = 0x9e; - /* Calculate inquire length in 1.28 second units */ - to = (time_t) ((double) length / 1.28); - if (to <= 0) - cp->inquiry_length = 4; /* 5.12 seconds */ - else if (to > 254) - cp->inquiry_length = 255; /* 326.40 seconds */ - else - cp->inquiry_length = to + 1; + /* + * Calculate inquire length in 1.28 second units + * v2.x specification says that 1.28 -> 61.44 seconds + * range is acceptable + */ - to = (time_t)((double) cp->inquiry_length * 1.28) + 1; + if (length <= 0) + length = 5; + else if (length == 1) + length = 2; + else if (length > 62) + length = 62; + + cp->inquiry_length = (uint8_t)((length * 100) / 128); if (num_rsp <= 0 || num_rsp > 255) num_rsp = 8; @@ -484,7 +487,7 @@ bt_devinquiry(char const *devname, time_t length, int num_rsp, wait_for_more: - n = bt_devrecv(s, buf, sizeof(buf), to); + n = bt_devrecv(s, buf, sizeof(buf), length); if (n < 0) { free(i); bt_devclose(s); |