List only ethernet interfaces

This commit is contained in:
Joseph C. Lehner 2016-01-31 18:42:12 +02:00
parent ab84533c00
commit d712601254

View file

@ -76,10 +76,6 @@ static bool get_hwaddr(uint8_t *hwaddr, const char *interface)
} }
} }
if (!found) {
fprintf(stderr, "Failed to get MAC address of interface %s.\n", interface);
}
freeifaddrs(ifas); freeifaddrs(ifas);
return found; return found;
} }
@ -109,12 +105,14 @@ static bool get_hwaddr(uint8_t *hwaddr, const char *interface)
} }
if (!strcmp(adapter->AdapterName, interface)) { if (!strcmp(adapter->AdapterName, interface)) {
for (i = 0; i != MIN(adapter->AddressLength, 6); ++i) { if (adapter->AddressLength == 6) {
hwaddr[i] = adapter->Address[i]; for (i = 0; i != 6; ++i) {
} hwaddr[i] = adapter->Address[i];
}
found = true; found = true;
break; break;
}
} }
} }
} else { } else {
@ -145,10 +143,6 @@ struct ethsock *ethsock_create(const char *interface, uint16_t protocol)
return NULL; return NULL;
} }
if (!get_hwaddr(sock->hwaddr, interface)) {
goto cleanup_malloc;
}
buf[0] = '\0'; buf[0] = '\0';
sock->pcap = pcap_open_live(interface, BUFSIZ, 1, 1, buf); sock->pcap = pcap_open_live(interface, BUFSIZ, 1, 1, buf);
@ -162,10 +156,16 @@ struct ethsock *ethsock_create(const char *interface, uint16_t protocol)
} }
if (pcap_datalink(sock->pcap) != DLT_EN10MB) { if (pcap_datalink(sock->pcap) != DLT_EN10MB) {
fprintf(stderr, "Interface %s not supported.\n", interface); fprintf(stderr, "Interface %s is not an ethernet interface.\n",
interface);
goto cleanup_pcap; goto cleanup_pcap;
} }
if (!get_hwaddr(sock->hwaddr, interface)) {
fprintf(stderr, "Failed to get MAC address of interface.\n");
goto cleanup_malloc;
}
sock->fd = pcap_get_selectable_fd(sock->pcap); sock->fd = pcap_get_selectable_fd(sock->pcap);
if (sock->fd == -1) { if (sock->fd == -1) {
fprintf(stderr, "No selectable file descriptor available.\n"); fprintf(stderr, "No selectable file descriptor available.\n");
@ -262,10 +262,26 @@ int ethsock_set_timeout(struct ethsock *sock, unsigned msec)
return 0; return 0;
} }
static bool is_ethernet(const char *interface)
{
pcap_t *pcap;
char errbuf[PCAP_ERRBUF_SIZE];
bool ret = false;
if ((pcap = pcap_create(interface, errbuf))) {
if (pcap_activate(pcap) == 0) {
ret = (pcap_datalink(pcap) == DLT_EN10MB);
}
pcap_close(pcap);
}
return ret;
}
int ethsock_list_all(void) int ethsock_list_all(void)
{ {
pcap_if_t *devs, *dev; pcap_if_t *devs, *dev;
uint8_t hwaddr[8]; uint8_t hwaddr[6];
char errbuf[PCAP_ERRBUF_SIZE]; char errbuf[PCAP_ERRBUF_SIZE];
if (pcap_findalldevs(&devs, errbuf) != 0) { if (pcap_findalldevs(&devs, errbuf) != 0) {
@ -273,15 +289,26 @@ int ethsock_list_all(void)
return -1; return -1;
} }
memset(hwaddr, 0, 6);
for (dev = devs; dev; dev = dev->next) { for (dev = devs; dev; dev = dev->next) {
get_hwaddr(hwaddr, dev->name); if (dev->flags & PCAP_IF_LOOPBACK) {
printf("%02x:%02x:%02x:%02x:%02x:%02x %s", continue;
hwaddr[0], hwaddr[1], hwaddr[2], }
hwaddr[3], hwaddr[4], hwaddr[5],
dev->name); if (!is_ethernet(dev->name)) {
continue;
}
if (!get_hwaddr(hwaddr, dev->name)) {
continue;
}
printf("%s %02x:%02x:%02x:%02x:%02x:%02x", dev->name, hwaddr[0],
hwaddr[1], hwaddr[2], hwaddr[3], hwaddr[4], hwaddr[5]);
if (dev->description) { if (dev->description) {
printf(" (%s)\n", dev->description); printf(" (%s)\n", dev->description);
} else { } else {
printf("\n"); printf("\n");
} }