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