Author: emax
Date: Thu May 14 17:10:19 2009
New Revision: 192113
URL: http://svn.freebsd.org/changeset/base/192113

Log:
  Avoid floating point arithmetic while calculating iquiry length.
  
  Submitted by: Iain Hibbert < plunky -at- rya-online -dot- net >
  MFC after:    1 week

Modified:
  head/lib/libbluetooth/hci.c

Modified: head/lib/libbluetooth/hci.c
==============================================================================
--- head/lib/libbluetooth/hci.c Thu May 14 17:04:58 2009        (r192112)
+++ head/lib/libbluetooth/hci.c Thu May 14 17:10:19 2009        (r192113)
@@ -410,7 +410,6 @@ bt_devinquiry(char const *devname, time_
        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_
        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
+        */
+
+       if (length <= 0)
+               length = 5;
+       else if (length == 1)
+               length = 2;
+       else if (length > 62)
+               length = 62;
 
-       to = (time_t)((double) cp->inquiry_length * 1.28) + 1;
+       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_
 
 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);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to