])
AC_CHECK_HEADERS([bluetooth/bluetooth.h], [
+ AC_CHECK_MEMBERS([struct sockaddr_hci.hci_channel],,,
+ [#include <bluetooth/bluetooth.h>
+ #include <bluetooth/hci.h>])
AC_CHECK_MEMBERS([struct sockaddr_l2.l2_bdaddr_type],,,
[#include <bluetooth/bluetooth.h>
#include <bluetooth/l2cap.h>])
};
switch (addrlen) {
+ case offsetofend(struct sockaddr_hci, hci_dev):
case sizeof(struct sockaddr_hci): {
const struct sockaddr_hci *const hci = buf;
- tprintf("hci_dev=htobs(%hu), hci_channel=",
- btohs(hci->hci_dev));
- printxval(hci_channels, hci->hci_channel, "HCI_CHANNEL_???");
+ tprintf("hci_dev=htobs(%hu)", btohs(hci->hci_dev));
+
+ /*
+ * hci_channel field has been introduced
+ * Linux commit in v2.6.38-rc1~476^2~14^2~3^2~43^2~9.
+ */
+ if (addrlen == sizeof(struct sockaddr_hci)) {
+ tprints(", hci_channel=");
+ printxval(hci_channels, hci->hci_channel,
+ "HCI_CHANNEL_???");
+ }
+
break;
}
case sizeof(struct sockaddr_sco): {
TAIL_ALLOC_OBJECT_VAR_PTR(struct sockaddr_hci, hci);
hci->hci_family = AF_BLUETOOTH;
hci->hci_dev = htobs(h_port);
+# ifdef HAVE_STRUCT_SOCKADDR_HCI_HCI_CHANNEL
hci->hci_channel = HCI_CHANNEL_RAW;
+# endif
unsigned int len = sizeof(*hci);
- int ret = connect(-1, (void *) hci, len);
+
+ int ret = connect(-1, (void *) hci, 4);
+ printf("connect(-1, {sa_family=AF_BLUETOOTH, hci_dev=htobs(%hu)"
+ "}, 4) = %d EBADF (%m)\n",
+ h_port, ret);
+
+ ret = connect(-1, (void *) hci, len);
printf("connect(-1, {sa_family=AF_BLUETOOTH, hci_dev=htobs(%hu)"
- ", hci_channel=HCI_CHANNEL_RAW}, %u) = %d EBADF (%m)\n",
+# ifdef HAVE_STRUCT_SOCKADDR_HCI_HCI_CHANNEL
+ ", hci_channel=HCI_CHANNEL_RAW"
+# endif
+ "}, %u) = %d EBADF (%m)\n",
h_port, len, ret);
}
" = %d EBADF (%m)\n", len, ret);
u.sa->sa_family = AF_BLUETOOTH;
- ++len;
ret = connect(-1, (void *) u.st, len);
- printf("connect(-1, {sa_family=AF_BLUETOOTH, sa_data=\"00\"}, %u)"
+ printf("connect(-1, {sa_family=AF_BLUETOOTH, sa_data=\"0\"}, %u)"
" = %d EBADF (%m)\n", len, ret);
}