X-Git-Url: https://tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=src%2Fraw_socket_device.c;h=a5cd835c26294583f5e3fd23b91185a3cad76bf9;hp=b9671e3e512b891522b9a8d5e950e4e109861e8e;hb=5eb72b73d3cd842e71e525413a46a55644ac3583;hpb=6289859ab365dc1c0d420323174418b316b14502 diff --git a/src/raw_socket_device.c b/src/raw_socket_device.c index b9671e3e..a5cd835c 100644 --- a/src/raw_socket_device.c +++ b/src/raw_socket_device.c @@ -32,12 +32,12 @@ #include "route.h" #include "xalloc.h" +#if defined(PF_PACKET) && defined(ETH_P_ALL) && defined(AF_PACKET) && defined(SIOCGIFINDEX) static char *device_info; static uint64_t device_total_in = 0; static uint64_t device_total_out = 0; -#if defined(PF_SOCKET) && defined(ETH_P_ALL) && defined(AF_PACKET) static bool setup_device(void) { struct ifreq ifr; struct sockaddr_ll sa; @@ -62,20 +62,21 @@ static bool setup_device(void) { memset(&ifr, 0, sizeof(ifr)); strncpy(ifr.ifr_ifrn.ifrn_name, iface, IFNAMSIZ); + ifr.ifr_ifrn.ifrn_name[IFNAMSIZ - 1] = 0; + if(ioctl(device_fd, SIOCGIFINDEX, &ifr)) { close(device_fd); - logger(LOG_ERR, "Can't find interface %s: %s", iface, - strerror(errno)); + logger(LOG_ERR, "Can't find interface %s: %s", ifr.ifr_ifrn.ifrn_name, strerror(errno)); return false; } - memset(&sa, '0', sizeof(sa)); + memset(&sa, 0, sizeof(sa)); sa.sll_family = AF_PACKET; sa.sll_protocol = htons(ETH_P_ALL); sa.sll_ifindex = ifr.ifr_ifindex; if(bind(device_fd, (struct sockaddr *) &sa, (socklen_t) sizeof(sa))) { - logger(LOG_ERR, "Could not bind %s to %s: %s", device, iface, strerror(errno)); + logger(LOG_ERR, "Could not bind %s to %s: %s", device, ifr.ifr_ifrn.ifrn_name, strerror(errno)); return false; }