Index: python3.8.git/Modules/socketmodule.c =================================================================== --- python3.8.git.orig/Modules/socketmodule.c +++ python3.8.git/Modules/socketmodule.c @@ -281,6 +281,10 @@ http://cvsweb.netbsd.org/bsdweb.cgi/src/ #include #endif +#ifdef HAVE_SYS_SOCKIO_H +#include +#endif + #ifdef HAVE_NET_IF_H #include #endif @@ -1983,11 +1987,15 @@ getsockaddrarg(PySocketSockObject *s, Py } #endif /* USE_BLUETOOTH */ -#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 const char *interfaceName; int protoNumber; int hatype = 0; @@ -2017,6 +2025,15 @@ getsockaddrarg(PySocketSockObject *s, Py } 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) { @@ -2024,6 +2041,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"); @@ -2040,7 +2058,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.8.git/configure.ac =================================================================== --- python3.8.git.orig/configure.ac +++ python3.8.git/configure.ac @@ -2126,6 +2126,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 \