Windows fixes
This commit is contained in:
		
							parent
							
								
									48a02f28c0
								
							
						
					
					
						commit
						129f30da7c
					
				
					 2 changed files with 39 additions and 4 deletions
				
			
		
							
								
								
									
										41
									
								
								ethsock.c
									
										
									
									
									
								
							
							
						
						
									
										41
									
								
								ethsock.c
									
										
									
									
									
								
							|  | @ -37,8 +37,13 @@ | |||
| struct ethsock | ||||
| { | ||||
| 	pcap_t *pcap; | ||||
| #ifndef NMRPFLASH_WINDOWS | ||||
| 	struct timeval timeout; | ||||
| 	int fd; | ||||
| #else | ||||
| 	DWORD timeout; | ||||
| 	HANDLE handle; | ||||
| #endif | ||||
| 	uint8_t hwaddr[6]; | ||||
| }; | ||||
| 
 | ||||
|  | @ -87,7 +92,7 @@ static bool get_hwaddr(uint8_t *hwaddr, const char *intf) | |||
| 	bool found = false; | ||||
| 
 | ||||
| 	if ((ret = GetAdaptersInfo(NULL, &bufLen)) != ERROR_BUFFER_OVERFLOW) { | ||||
| 		fprintf(stderr, "GetAdaptersInfo: error %d.\n", ret); | ||||
| 		fprintf(stderr, "GetAdaptersInfo: error %d.\n", (int)ret); | ||||
| 		return false; | ||||
| 	} | ||||
| 
 | ||||
|  | @ -97,7 +102,7 @@ static bool get_hwaddr(uint8_t *hwaddr, const char *intf) | |||
| 		return false; | ||||
| 	} | ||||
| 
 | ||||
| 	if ((ret = GetAdaptersInfo(adapters, bufLen) == NO_ERROR)) { | ||||
| 	if ((ret = GetAdaptersInfo(adapters, &bufLen) == NO_ERROR)) { | ||||
| 		for (adapter = adapters; adapter; adapter = adapter->Next) { | ||||
| 			if (adapter->Type != MIB_IF_TYPE_ETHERNET) { | ||||
| 				continue; | ||||
|  | @ -115,7 +120,7 @@ static bool get_hwaddr(uint8_t *hwaddr, const char *intf) | |||
| 			} | ||||
| 		} | ||||
| 	} else { | ||||
| 		fprintf(stderr, "GetAdaptersInfo: error %d.\n", ret); | ||||
| 		fprintf(stderr, "GetAdaptersInfo: error %d.\n", (int)ret); | ||||
| 	} | ||||
| 
 | ||||
| 	free(adapters); | ||||
|  | @ -165,14 +170,22 @@ struct ethsock *ethsock_create(const char *intf, uint16_t protocol) | |||
| 		goto cleanup_malloc; | ||||
| 	} | ||||
| 
 | ||||
| #ifndef NMRPFLASH_WINDOWS | ||||
| 	sock->fd = pcap_get_selectable_fd(sock->pcap); | ||||
| 	if (sock->fd == -1) { | ||||
| 		fprintf(stderr, "No selectable file descriptor available.\n"); | ||||
| 		goto cleanup_pcap; | ||||
| 	} | ||||
| #else | ||||
| 	sock->handle = pcap_getevent(sock->pcap); | ||||
| 	if (!sock->handle) { | ||||
| 		fprintf(stderr, "No event handle available.\n"); | ||||
| 		goto cleanup_pcap; | ||||
| 	} | ||||
| #endif | ||||
| 
 | ||||
| 	snprintf(buf, sizeof(buf), "ether proto %04x", protocol); | ||||
| 	err = pcap_compile(sock->pcap, &fp, buf, 0, PCAP_NETMASK_UNKNOWN); | ||||
| 	err = pcap_compile(sock->pcap, &fp, buf, 0, 0); | ||||
| 	if (err) { | ||||
| 		pcap_perror(sock->pcap, "pcap_compile"); | ||||
| 		goto cleanup_pcap; | ||||
|  | @ -197,8 +210,13 @@ ssize_t ethsock_recv(struct ethsock *sock, void *buf, size_t len) | |||
| 	struct pcap_pkthdr* hdr; | ||||
| 	const u_char *capbuf; | ||||
| 	int status; | ||||
| #ifndef NMRPFLASH_WINDOWS | ||||
| 	fd_set fds; | ||||
| #else | ||||
| 	DWORD ret; | ||||
| #endif | ||||
| 
 | ||||
| #ifndef NMRPFLASH_WINDOWS | ||||
| 	if (sock->timeout.tv_sec || sock->timeout.tv_usec) { | ||||
| 		FD_ZERO(&fds); | ||||
| 		FD_SET(sock->fd, &fds); | ||||
|  | @ -211,6 +229,17 @@ ssize_t ethsock_recv(struct ethsock *sock, void *buf, size_t len) | |||
| 			return 0; | ||||
| 		} | ||||
| 	} | ||||
| #else | ||||
| 	if (sock->timeout) { | ||||
| 		ret = WaitForSingleObject(sock->handle, sock->timeout); | ||||
| 		if (ret == WAIT_TIMEOUT) { | ||||
| 			return 0; | ||||
| 		} else if (ret != WAIT_OBJECT_0) { | ||||
| 			fprintf(stderr, "WaitForSingleObject: returned %d\n", (int)ret); | ||||
| 			return -1; | ||||
| 		}		 | ||||
| 	} | ||||
| #endif | ||||
| 
 | ||||
| 	status = pcap_next_ex(sock->pcap, &hdr, &capbuf); | ||||
| 	switch (status) { | ||||
|  | @ -256,8 +285,12 @@ int ethsock_close(struct ethsock *sock) | |||
| 
 | ||||
| int ethsock_set_timeout(struct ethsock *sock, unsigned msec) | ||||
| { | ||||
| #ifndef NMRPFLASH_WINDOWS | ||||
| 	sock->timeout.tv_sec = msec / 1000; | ||||
| 	sock->timeout.tv_usec = (msec % 1000) * 1000; | ||||
| #else | ||||
| 	sock->timeout = msec; | ||||
| #endif | ||||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										2
									
								
								main.c
									
										
									
									
									
								
							
							
						
						
									
										2
									
								
								main.c
									
										
									
									
									
								
							|  | @ -128,10 +128,12 @@ int main(int argc, char **argv) | |||
| 		return 1; | ||||
| 	} | ||||
| 
 | ||||
| #ifndef NMRPFLASH_WINDOWS | ||||
| 	if (geteuid() != 0) { | ||||
| 		fprintf(stderr, "This program must be run as root!\n"); | ||||
| 		return 1; | ||||
| 	} | ||||
| #endif | ||||
| 
 | ||||
| 	return nmrp_do(&args); | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue