summaryrefslogtreecommitdiff
path: root/monitor/hcidump.c
diff options
context:
space:
mode:
Diffstat (limited to 'monitor/hcidump.c')
-rw-r--r--monitor/hcidump.c24
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;
}
}