Don't reinvent the wheel.

This commit is contained in:
Joseph C. Lehner 2021-06-06 14:00:01 +02:00
parent f7261b35b8
commit 560b018233

View file

@ -89,6 +89,25 @@ static int x_pcap_findalldevs(pcap_if_t **devs)
return 0; return 0;
} }
static bool intf_get_pcap_flags(const char *intf, bpf_u_int32 *flags)
{
pcap_if_t *devs, *dev;
if (x_pcap_findalldevs(&devs) == 0) {
for (dev = devs; dev; dev = dev->next) {
if (!strcmp(intf, dev->name)) {
*flags = dev->flags;
break;
}
}
pcap_freealldevs(devs);
return dev != NULL;
}
return false;
}
#ifndef NMRPFLASH_WINDOWS #ifndef NMRPFLASH_WINDOWS
static int systemf(const char *fmt, ...) static int systemf(const char *fmt, ...)
{ {
@ -548,59 +567,24 @@ inline uint8_t *ethsock_get_hwaddr(struct ethsock *sock)
bool ethsock_is_wifi(struct ethsock *sock) bool ethsock_is_wifi(struct ethsock *sock)
{ {
#if defined(NMRPFLASH_WINDOWS) bpf_u_int32 flags;
MIB_IF_ROW2 row;
if (intf_get_if_row(sock->index, &row)) { if (!intf_get_pcap_flags(sock->intf, &flags)) {
return row.Type == IF_TYPE_IEEE80211; return false;
} }
return false; return flags & PCAP_IF_WIRELESS;
#else
return false;
#endif
} }
bool ethsock_is_unplugged(struct ethsock *sock) bool ethsock_is_unplugged(struct ethsock *sock)
{ {
#if defined(NMRPFLASH_LINUX) bpf_u_int32 flags;
return !intf_sys_read(sock->intf, "carrier", true);
#elif defined(NMRPFLASH_WINDOWS)
MIB_IF_ROW2 row;
if (intf_get_if_row(sock->index, &row)) { if (!intf_get_pcap_flags(sock->intf, &flags)) {
return row.InterfaceAndOperStatusFlags.NotMediaConnected;
}
return false;
#elif defined(NMRPFLASH_BSD)
struct ifmediareq ifm;
int fd;
fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0) {
if (verbosity) {
perror("socket");
}
return false; return false;
} }
memset(&ifm, 0, sizeof(ifm)); return flags & PCAP_IF_CONNECTION_STATUS_DISCONNECTED;
strncpy(ifm.ifm_name, sock->intf, sizeof(ifm.ifm_name));
if (ioctl(fd, SIOCGIFMEDIA, &ifm) < 0) {
if (verbosity) {
perror("ioctl(SIOCGIFMEDIA)");
}
goto out;
}
out:
close(fd);
return (ifm.ifm_status & IFM_AVALID) && !(ifm.ifm_status & IFM_ACTIVE);
#else
return false;
#endif
} }
struct ethsock *ethsock_create(const char *intf, uint16_t protocol) struct ethsock *ethsock_create(const char *intf, uint16_t protocol)