diff --git a/profiles/input/device.c b/profiles/input/device.c
index 4310dd1..6c64ff1 100644
--- a/profiles/input/device.c
+++ b/profiles/input/device.c
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
+#include <sys/uio.h>
#include "lib/bluetooth.h"
#include "lib/hidp.h"
{
int fd;
ssize_t len;
- uint8_t msg[size + 1];
+ struct iovec iov[2];
if (!chan) {
error("BT socket not connected");
return false;
}
+ iov[0].iov_base = &hdr;
+ iov[0].iov_len = sizeof(hdr);
+
if (data == NULL)
size = 0;
- msg[0] = hdr;
- if (size > 0)
- memcpy(&msg[1], data, size);
- ++size;
+ iov[1].iov_base = (void *)data;
+ iov[1].iov_len = size;
fd = g_io_channel_unix_get_fd(chan);
- len = write(fd, msg, size);
+ len = writev(fd, iov, 2);
if (len < 0) {
error("BT socket write error: %s (%d)", strerror(errno), errno);
return false;
}
- if ((size_t) len < size) {
+ if ((size_t) len < size + 1) {
error("BT socket write error: partial write (%zd of %zu bytes)",
- len, size);
+ len, size + 1);
return false;
}