Don't reinvent the wheel.
This commit is contained in:
		
							parent
							
								
									f7261b35b8
								
							
						
					
					
						commit
						560b018233
					
				
					 1 changed files with 26 additions and 42 deletions
				
			
		
							
								
								
									
										68
									
								
								ethsock.c
									
										
									
									
									
								
							
							
						
						
									
										68
									
								
								ethsock.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -89,6 +89,25 @@ static int x_pcap_findalldevs(pcap_if_t **devs)
 | 
			
		|||
	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
 | 
			
		||||
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)
 | 
			
		||||
{
 | 
			
		||||
#if defined(NMRPFLASH_WINDOWS)
 | 
			
		||||
	MIB_IF_ROW2 row;
 | 
			
		||||
	bpf_u_int32 flags;
 | 
			
		||||
 | 
			
		||||
	if (intf_get_if_row(sock->index, &row)) {
 | 
			
		||||
		return row.Type == IF_TYPE_IEEE80211;
 | 
			
		||||
	if (!intf_get_pcap_flags(sock->intf, &flags)) {
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return false;
 | 
			
		||||
#else
 | 
			
		||||
	return false;
 | 
			
		||||
#endif
 | 
			
		||||
	return flags & PCAP_IF_WIRELESS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ethsock_is_unplugged(struct ethsock *sock)
 | 
			
		||||
{
 | 
			
		||||
#if defined(NMRPFLASH_LINUX)
 | 
			
		||||
	return !intf_sys_read(sock->intf, "carrier", true);
 | 
			
		||||
#elif defined(NMRPFLASH_WINDOWS)
 | 
			
		||||
	MIB_IF_ROW2 row;
 | 
			
		||||
	bpf_u_int32 flags;
 | 
			
		||||
 | 
			
		||||
	if (intf_get_if_row(sock->index, &row)) {
 | 
			
		||||
		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");
 | 
			
		||||
		}
 | 
			
		||||
	if (!intf_get_pcap_flags(sock->intf, &flags)) {
 | 
			
		||||
		return false;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	memset(&ifm, 0, sizeof(ifm));
 | 
			
		||||
	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
 | 
			
		||||
	return flags & PCAP_IF_CONNECTION_STATUS_DISCONNECTED;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct ethsock *ethsock_create(const char *intf, uint16_t protocol)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue