Windows: use ANSI interface names instead of net%d aliases
This commit is contained in:
parent
99f50229d8
commit
3bf364af06
1 changed files with 41 additions and 30 deletions
71
ethsock.c
71
ethsock.c
|
|
@ -27,7 +27,6 @@
|
|||
#include "nmrpd.h"
|
||||
|
||||
#if defined(NMRPFLASH_WINDOWS)
|
||||
#define NMRPFLASH_NETALIAS_PREFIX "net"
|
||||
#define WPCAP
|
||||
#include <pcap.h>
|
||||
#else
|
||||
|
|
@ -425,42 +424,54 @@ static bool intf_get_info(const char *intf, uint8_t *hwaddr, DWORD *index)
|
|||
return found;
|
||||
}
|
||||
|
||||
static const char *intf_alias_to_wpcap(const char *intf)
|
||||
static const char *intf_name_to_wpcap(const char *intf)
|
||||
{
|
||||
static char buf[128];
|
||||
pcap_if_t *devs, *dev;
|
||||
unsigned i = 0, dev_num = 0;
|
||||
|
||||
if (intf[0] == '\\') {
|
||||
return intf;
|
||||
} else if (sscanf(intf, NMRPFLASH_NETALIAS_PREFIX "%u", &dev_num) != 1) {
|
||||
fprintf(stderr, "Invalid interface alias.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (x_pcap_findalldevs(&devs) != 0) {
|
||||
return NULL;
|
||||
}
|
||||
do {
|
||||
NET_IFINDEX index;
|
||||
DWORD err;
|
||||
NET_LUID luid;
|
||||
GUID guid;
|
||||
|
||||
for (dev = devs; dev; dev = dev->next, ++i) {
|
||||
if (i == dev_num) {
|
||||
if (verbosity) {
|
||||
printf("%s%u: %s\n", NMRPFLASH_NETALIAS_PREFIX, i, dev->name);
|
||||
}
|
||||
strncpy(buf, dev->name, sizeof(buf) - 1);
|
||||
buf[sizeof(buf) - 1] = '\0';
|
||||
index = if_nametoindex(intf);
|
||||
if (!index) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
pcap_freealldevs(devs);
|
||||
err = ConvertInterfaceIndexToLuid(index, &luid);
|
||||
if (err != NO_ERROR) {
|
||||
if (verbosity) {
|
||||
win_perror2("ConvertInterfaceIndexToLuid", err);
|
||||
}
|
||||
|
||||
if (!dev) {
|
||||
fprintf(stderr, "Interface alias not found.\n");
|
||||
return NULL;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return buf;
|
||||
err = ConvertInterfaceLuidToGuid(&luid, &guid);
|
||||
if (err != NO_ERROR) {
|
||||
if (verbosity) {
|
||||
win_perror2("ConvertInterfaceLuidToGuid", err);
|
||||
}
|
||||
}
|
||||
|
||||
snprintf(buf, sizeof(buf),
|
||||
"\\Device\\NPF{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
|
||||
guid.Data1, guid.Data2, guid.Data3,
|
||||
guid.Data4[0], guid.Data4[1], guid.Data4[2],
|
||||
guid.Data4[3], guid.Data4[4], guid.Data4[5],
|
||||
guid.Data4[6], guid.Data4[7]);
|
||||
|
||||
return buf;
|
||||
|
||||
} while (false);
|
||||
|
||||
fprintf(stderr, "Invalid interface name.\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static const char *intf_get_pretty_name(const char *intf)
|
||||
|
|
@ -516,10 +527,12 @@ bool ethsock_is_unplugged(struct ethsock *sock)
|
|||
{
|
||||
#ifdef NMRPFLASH_WINDOWS
|
||||
MIB_IF_ROW2 row;
|
||||
DWORD err;
|
||||
|
||||
memset(&row, 0, sizeof(row));
|
||||
row.InterfaceIndex = sock->index;
|
||||
|
||||
DWORD err = GetIfEntry2(&row);
|
||||
err = GetIfEntry2(&row);
|
||||
if (err != NO_ERROR) {
|
||||
win_perror2("GetIfEntry2", err);
|
||||
return false;
|
||||
|
|
@ -529,9 +542,6 @@ bool ethsock_is_unplugged(struct ethsock *sock)
|
|||
#else
|
||||
return false;
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
struct ethsock *ethsock_create(const char *intf, uint16_t protocol)
|
||||
|
|
@ -543,7 +553,7 @@ struct ethsock *ethsock_create(const char *intf, uint16_t protocol)
|
|||
int err;
|
||||
|
||||
#ifdef NMRPFLASH_WINDOWS
|
||||
intf = intf_alias_to_wpcap(intf);
|
||||
intf = intf_name_to_wpcap(intf);
|
||||
if (!intf) {
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -868,7 +878,8 @@ int ethsock_list_all(void)
|
|||
pretty = intf_get_pretty_name(dev->name);
|
||||
|
||||
if (!verbosity) {
|
||||
printf("%s%-2u", NMRPFLASH_NETALIAS_PREFIX, dev_num);
|
||||
char buf[IF_MAX_STRING_SIZE];
|
||||
printf("%-15s", if_indextoname(dev->index, buf));
|
||||
} else {
|
||||
printf("%s", dev->name);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue