summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2005-07-03 10:08:26 +0000
committerMarcel Holtmann <marcel@holtmann.org>2005-07-03 10:08:26 +0000
commita32c06bc2990f56420782e8966aa5de08b61d505 (patch)
tree16f945f9a0dc59cc95b7a705504120476bab2c8e
parentef24c2a9db8b95032e4d87b730dcffdf1b9901a4 (diff)
Update reading of local Bluetooth clock
-rw-r--r--tools/hcitool.12
-rw-r--r--tools/hcitool.c51
2 files changed, 31 insertions, 22 deletions
diff --git a/tools/hcitool.1 b/tools/hcitool.1
index d863e7d1..01ef03a8 100644
--- a/tools/hcitool.1
+++ b/tools/hcitool.1
@@ -175,7 +175,7 @@ Change the connection link key for the device with Bluetooth address
Read the clock offset for the device with Bluetooth address
.IR bdaddr .
.TP
-.BI clock " <bdaddr> [which clock]"
+.BI clock " [bdaddr] [which clock]"
Read the clock for the device with Bluetooth address
.IR bdaddr .
The clock can be
diff --git a/tools/hcitool.c b/tools/hcitool.c
index e6561feb..7f0cc23a 100644
--- a/tools/hcitool.c
+++ b/tools/hcitool.c
@@ -1900,14 +1900,14 @@ static struct option clock_options[] = {
static char *clock_help =
"Usage:\n"
- "\tclock <bdaddr> [which clock]\n";
+ "\tclock [bdaddr] [which clock]\n";
static void cmd_clock(int dev_id, int argc, char **argv)
{
struct hci_conn_info_req *cr;
bdaddr_t bdaddr;
uint8_t which;
- uint32_t clock;
+ uint32_t handle, clock;
uint16_t accuracy;
int opt, dd;
@@ -1921,12 +1921,13 @@ static void cmd_clock(int dev_id, int argc, char **argv)
argc -= optind;
argv += optind;
- if (argc < 1) {
- printf(clock_help);
- return;
- }
+ if (argc > 0)
+ str2ba(argv[0], &bdaddr);
+ else
+ bacpy(&bdaddr, BDADDR_ANY);
- str2ba(argv[0], &bdaddr);
+ if (!bacmp(&bdaddr, BDADDR_ANY))
+ dev_id = hci_get_route(NULL);
if (dev_id < 0) {
dev_id = hci_for_each_dev(HCI_UP, find_conn, (long) &bdaddr);
@@ -1942,22 +1943,31 @@ static void cmd_clock(int dev_id, int argc, char **argv)
exit(1);
}
- cr = malloc(sizeof(*cr) + sizeof(struct hci_conn_info));
- if (!cr) {
- perror("Can't allocate memory");
- exit(1);
- }
+ if (bacmp(&bdaddr, BDADDR_ANY)) {
+ cr = malloc(sizeof(*cr) + sizeof(struct hci_conn_info));
+ if (!cr) {
+ perror("Can't allocate memory");
+ exit(1);
+ }
- bacpy(&cr->bdaddr, &bdaddr);
- cr->type = ACL_LINK;
- if (ioctl(dd, HCIGETCONNINFO, (unsigned long) cr) < 0) {
- perror("Get connection info failed");
- exit(1);
- }
+ bacpy(&cr->bdaddr, &bdaddr);
+ cr->type = ACL_LINK;
+ if (ioctl(dd, HCIGETCONNINFO, (unsigned long) cr) < 0) {
+ perror("Get connection info failed");
+ free(cr);
+ exit(1);
+ }
+
+ handle = htobs(cr->conn_info->handle);
+ which = (argc > 1) ? atoi(argv[1]) : 0x01;
- which = (argc > 1) ? atoi(argv[1]) : 0x01;
+ free(cr);
+ } else {
+ handle = 0x00;
+ which = 0x00;
+ }
- if (hci_read_clock(dd, htobs(cr->conn_info->handle), which, &clock, &accuracy, 1000) < 0) {
+ if (hci_read_clock(dd, handle, which, &clock, &accuracy, 1000) < 0) {
perror("Reading clock failed");
exit(1);
}
@@ -1968,7 +1978,6 @@ static void cmd_clock(int dev_id, int argc, char **argv)
printf("Accuracy: %.2f msec\n", (float) accuracy * 0.3125);
close(dd);
- free(cr);
}
static struct {