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;
 | 
						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)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue