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"
|
#include "nmrpd.h"
|
||||||
|
|
||||||
#if defined(NMRPFLASH_WINDOWS)
|
#if defined(NMRPFLASH_WINDOWS)
|
||||||
#define NMRPFLASH_NETALIAS_PREFIX "net"
|
|
||||||
#define WPCAP
|
#define WPCAP
|
||||||
#include <pcap.h>
|
#include <pcap.h>
|
||||||
#else
|
#else
|
||||||
|
|
@ -425,42 +424,54 @@ static bool intf_get_info(const char *intf, uint8_t *hwaddr, DWORD *index)
|
||||||
return found;
|
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];
|
static char buf[128];
|
||||||
pcap_if_t *devs, *dev;
|
|
||||||
unsigned i = 0, dev_num = 0;
|
|
||||||
|
|
||||||
if (intf[0] == '\\') {
|
if (intf[0] == '\\') {
|
||||||
return intf;
|
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) {
|
do {
|
||||||
return NULL;
|
NET_IFINDEX index;
|
||||||
}
|
DWORD err;
|
||||||
|
NET_LUID luid;
|
||||||
|
GUID guid;
|
||||||
|
|
||||||
for (dev = devs; dev; dev = dev->next, ++i) {
|
index = if_nametoindex(intf);
|
||||||
if (i == dev_num) {
|
if (!index) {
|
||||||
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';
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
pcap_freealldevs(devs);
|
err = ConvertInterfaceIndexToLuid(index, &luid);
|
||||||
|
if (err != NO_ERROR) {
|
||||||
|
if (verbosity) {
|
||||||
|
win_perror2("ConvertInterfaceIndexToLuid", err);
|
||||||
|
}
|
||||||
|
|
||||||
if (!dev) {
|
break;
|
||||||
fprintf(stderr, "Interface alias not found.\n");
|
}
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
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)
|
static const char *intf_get_pretty_name(const char *intf)
|
||||||
|
|
@ -516,10 +527,12 @@ bool ethsock_is_unplugged(struct ethsock *sock)
|
||||||
{
|
{
|
||||||
#ifdef NMRPFLASH_WINDOWS
|
#ifdef NMRPFLASH_WINDOWS
|
||||||
MIB_IF_ROW2 row;
|
MIB_IF_ROW2 row;
|
||||||
|
DWORD err;
|
||||||
|
|
||||||
memset(&row, 0, sizeof(row));
|
memset(&row, 0, sizeof(row));
|
||||||
row.InterfaceIndex = sock->index;
|
row.InterfaceIndex = sock->index;
|
||||||
|
|
||||||
DWORD err = GetIfEntry2(&row);
|
err = GetIfEntry2(&row);
|
||||||
if (err != NO_ERROR) {
|
if (err != NO_ERROR) {
|
||||||
win_perror2("GetIfEntry2", err);
|
win_perror2("GetIfEntry2", err);
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -529,9 +542,6 @@ bool ethsock_is_unplugged(struct ethsock *sock)
|
||||||
#else
|
#else
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ethsock *ethsock_create(const char *intf, uint16_t protocol)
|
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;
|
int err;
|
||||||
|
|
||||||
#ifdef NMRPFLASH_WINDOWS
|
#ifdef NMRPFLASH_WINDOWS
|
||||||
intf = intf_alias_to_wpcap(intf);
|
intf = intf_name_to_wpcap(intf);
|
||||||
if (!intf) {
|
if (!intf) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
@ -868,7 +878,8 @@ int ethsock_list_all(void)
|
||||||
pretty = intf_get_pretty_name(dev->name);
|
pretty = intf_get_pretty_name(dev->name);
|
||||||
|
|
||||||
if (!verbosity) {
|
if (!verbosity) {
|
||||||
printf("%s%-2u", NMRPFLASH_NETALIAS_PREFIX, dev_num);
|
char buf[IF_MAX_STRING_SIZE];
|
||||||
|
printf("%-15s", if_indextoname(dev->index, buf));
|
||||||
} else {
|
} else {
|
||||||
printf("%s", dev->name);
|
printf("%s", dev->name);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue