Index: python3.5-3.5.4/Modules/socketmodule.c =================================================================== --- python3.5-3.5.4.orig/Modules/socketmodule.c +++ python3.5-3.5.4/Modules/socketmodule.c @@ -280,6 +280,10 @@ http://cvsweb.netbsd.org/bsdweb.cgi/src/ #include #endif +#ifdef HAVE_SYS_SOCKIO_H +#include +#endif + #ifdef HAVE_NET_IF_H #include #endif @@ -1723,11 +1727,15 @@ getsockaddrarg(PySocketSockObject *s, Py } #endif -#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX) +#if defined(HAVE_NETPACKET_PACKET_H) case AF_PACKET: { struct sockaddr_ll* addr; +#ifdef SIOCGLIFINDEX + struct lifreq lifr; +#else struct ifreq ifr; +#endif char *interfaceName; int protoNumber; int hatype = 0; @@ -1746,6 +1754,15 @@ getsockaddrarg(PySocketSockObject *s, Py &protoNumber, &pkttype, &hatype, &haddr)) return 0; +#ifdef SIOCGLIFINDEX + strncpy(lifr.lifr_name, interfaceName, sizeof(lifr.lifr_name)); + lifr.lifr_name[(sizeof(lifr.lifr_name))-1] = '\0'; + if (ioctl(s->sock_fd, SIOCGLIFINDEX, &lifr) < 0) { + s->errorhandler(); + PyBuffer_Release(&haddr); + return 0; + } +#else strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name)); ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0'; if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) { @@ -1753,6 +1770,7 @@ getsockaddrarg(PySocketSockObject *s, Py PyBuffer_Release(&haddr); return 0; } +#endif if (haddr.buf && haddr.len > 8) { PyErr_SetString(PyExc_ValueError, "Hardware address must be 8 bytes or less"); @@ -1769,7 +1787,11 @@ getsockaddrarg(PySocketSockObject *s, Py addr = (struct sockaddr_ll*)addr_ret; addr->sll_family = AF_PACKET; addr->sll_protocol = htons((short)protoNumber); +#ifdef SIOCGLIFINDEX + addr->sll_ifindex = lifr.lifr_index; +#else addr->sll_ifindex = ifr.ifr_ifindex; +#endif addr->sll_pkttype = pkttype; addr->sll_hatype = hatype; if (haddr.buf) { Index: python3.5-3.5.4/configure.ac =================================================================== --- python3.5-3.5.4.orig/configure.ac +++ python3.5-3.5.4/configure.ac @@ -1952,6 +1952,7 @@ poll.h sys/devpoll.h sys/epoll.h sys/pol sys/audioio.h sys/xattr.h sys/bsdtty.h sys/event.h sys/file.h sys/ioctl.h \ sys/kern_control.h sys/loadavg.h sys/lock.h sys/mkdev.h sys/modem.h \ sys/param.h sys/random.h sys/select.h sys/sendfile.h sys/socket.h sys/statvfs.h \ +sys/sockio.h \ sys/stat.h sys/syscall.h sys/sys_domain.h sys/termio.h sys/time.h \ sys/times.h sys/types.h sys/uio.h sys/un.h sys/utsname.h sys/wait.h pty.h \ libutil.h sys/resource.h netpacket/packet.h sysexits.h bluetooth.h \