diff options
Diffstat (limited to 'monitor/hcidump.c')
-rw-r--r-- | monitor/hcidump.c | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/monitor/hcidump.c b/monitor/hcidump.c index 373d2f55..9881bb33 100644 --- a/monitor/hcidump.c +++ b/monitor/hcidump.c @@ -62,7 +62,7 @@ static int open_hci_dev(uint16_t index) struct hci_filter flt; int fd, opt = 1; - fd = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI); + fd = socket(AF_BLUETOOTH, SOCK_RAW | SOCK_CLOEXEC, BTPROTO_HCI); if (fd < 0) { perror("Failed to open channel"); return -1; @@ -108,7 +108,7 @@ static int open_hci_dev(uint16_t index) static void device_callback(int fd, uint32_t events, void *user_data) { struct hcidump_data *data = user_data; - unsigned char buf[HCI_MAX_FRAME_SIZE]; + unsigned char buf[HCI_MAX_FRAME_SIZE * 2]; unsigned char control[64]; struct msghdr msg; struct iovec iov; @@ -130,7 +130,8 @@ static void device_callback(int fd, uint32_t events, void *user_data) while (1) { struct cmsghdr *cmsg; struct timeval *tv = NULL; - int *dir = NULL; + struct timeval ctv; + int dir = -1; ssize_t len; len = recvmsg(fd, &msg, MSG_DONTWAIT); @@ -144,15 +145,16 @@ static void device_callback(int fd, uint32_t events, void *user_data) switch (cmsg->cmsg_type) { case HCI_DATA_DIR: - dir = (int *) CMSG_DATA(cmsg); + memcpy(&dir, CMSG_DATA(cmsg), sizeof(dir)); break; case HCI_CMSG_TSTAMP: - tv = (struct timeval *) CMSG_DATA(cmsg); + memcpy(&ctv, CMSG_DATA(cmsg), sizeof(ctv)); + tv = &ctv; break; } } - if (!dir || len < 1) + if (dir < 0 || len < 1) continue; switch (buf[0]) { @@ -163,11 +165,11 @@ static void device_callback(int fd, uint32_t events, void *user_data) packet_hci_event(tv, data->index, buf + 1, len - 1); break; case HCI_ACLDATA_PKT: - packet_hci_acldata(tv, data->index, !!(*dir), + packet_hci_acldata(tv, data->index, !!dir, buf + 1, len - 1); break; case HCI_SCODATA_PKT: - packet_hci_scodata(tv, data->index, !!(*dir), + packet_hci_scodata(tv, data->index, !!dir, buf + 1, len - 1); break; } @@ -263,7 +265,7 @@ static int open_stack_internal(void) struct hci_filter flt; int fd, opt = 1; - fd = socket(AF_BLUETOOTH, SOCK_RAW, BTPROTO_HCI); + fd = socket(AF_BLUETOOTH, SOCK_RAW | SOCK_CLOEXEC, BTPROTO_HCI); if (fd < 0) { perror("Failed to open channel"); return -1; @@ -314,6 +316,7 @@ static void stack_internal_callback(int fd, uint32_t events, void *user_data) evt_stack_internal *si; evt_si_device *sd; struct timeval *tv = NULL; + struct timeval ctv; uint8_t type = 0xff, bus = 0xff; char str[18], name[8] = ""; bdaddr_t bdaddr; @@ -345,7 +348,8 @@ static void stack_internal_callback(int fd, uint32_t events, void *user_data) switch (cmsg->cmsg_type) { case HCI_CMSG_TSTAMP: - tv = (struct timeval *) CMSG_DATA(cmsg); + memcpy(&ctv, CMSG_DATA(cmsg), sizeof(ctv)); + tv = &ctv; break; } } |