From 979656094d07bdbca4b7a24f701db3c1bd5059bf Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Sun, 19 Nov 2017 13:52:55 +0100 Subject: [PATCH] add ability to remove sockets from EthernetHandleSet --- src/hal/ethernet/bsd/ethernet_bsd.c | 14 ++++++++++++++ src/hal/ethernet/linux/ethernet_linux.c | 14 ++++++++++++++ src/hal/ethernet/win32/ethernet_win32.c | 16 ++++++++++++++++ src/hal/inc/hal_ethernet.h | 9 +++++++++ 4 files changed, 53 insertions(+) diff --git a/src/hal/ethernet/bsd/ethernet_bsd.c b/src/hal/ethernet/bsd/ethernet_bsd.c index 51ac3901..3fe7fbca 100644 --- a/src/hal/ethernet/bsd/ethernet_bsd.c +++ b/src/hal/ethernet/bsd/ethernet_bsd.c @@ -77,6 +77,20 @@ EthernetHandleSet_addSocket(EthernetHandleSet self, const EthernetSocket sock) } } +void +EthernetHandleSet_removeSocket(EthernetHandleSet self, const EthernetSocket sock) +{ + if ((self != NULL) && (sock != NULL)) { + for (unsigned i = 0; i < self->nhandles; i++) { + if (self->handles[i].fd == sock->bpf) { + memmove(&self->handles[i], &self->handles[i+1], sizeof(struct pollfd) * (self->nhandles - i - 1)); + self->nhandles--; + return; + } + } + } +} + int EthernetHandleSet_waitReady(EthernetHandleSet self, unsigned int timeoutMs) { diff --git a/src/hal/ethernet/linux/ethernet_linux.c b/src/hal/ethernet/linux/ethernet_linux.c index 5de14d34..2bd069e8 100644 --- a/src/hal/ethernet/linux/ethernet_linux.c +++ b/src/hal/ethernet/linux/ethernet_linux.c @@ -71,6 +71,20 @@ EthernetHandleSet_addSocket(EthernetHandleSet self, const EthernetSocket sock) } } +void +EthernetHandleSet_removeSocket(EthernetHandleSet self, const EthernetSocket sock) +{ + if ((self != NULL) && (sock != NULL)) { + for (unsigned i = 0; i < self->nhandles; i++) { + if (self->handles[i].fd == sock->rawSocket) { + memmove(&self->handles[i], &self->handles[i+1], sizeof(struct pollfd) * (self->nhandles - i - 1)); + self->nhandles--; + return; + } + } + } +} + int EthernetHandleSet_waitReady(EthernetHandleSet self, unsigned int timeoutMs) { diff --git a/src/hal/ethernet/win32/ethernet_win32.c b/src/hal/ethernet/win32/ethernet_win32.c index e7e91100..9fb87716 100644 --- a/src/hal/ethernet/win32/ethernet_win32.c +++ b/src/hal/ethernet/win32/ethernet_win32.c @@ -145,6 +145,22 @@ EthernetHandleSet_addSocket(EthernetHandleSet self, const EthernetSocket sock) } } +void +EthernetHandleSet_removeSocket(EthernetHandleSet self, const EthernetSocket sock) +{ + if ((self != NULL) && (sock != NULL)) { + HANDLE h = pcap_getevent(socket->rawSocket); + + for (unsigned i = 0; i < self->nhandles; i++) { + if (self->handles[i] == h) { + memmove(&self->handles[i], &self->handles[i+1], sizeof(HANDLE) * (self->nhandles - i - 1)); + self->nhandles--; + return; + } + } + } +} + int EthernetHandleSet_waitReady(EthernetHandleSet self, unsigned int timeoutMs) { diff --git a/src/hal/inc/hal_ethernet.h b/src/hal/inc/hal_ethernet.h index dd9e7ea4..4efb3670 100644 --- a/src/hal/inc/hal_ethernet.h +++ b/src/hal/inc/hal_ethernet.h @@ -68,6 +68,15 @@ EthernetHandleSet_new(void); void EthernetHandleSet_addSocket(EthernetHandleSet self, const EthernetSocket sock); +/** + * \brief remove a socket from an existing handle set + * + * \param self the HandleSet instance + * \param sock the socket to add + */ +void +EthernetHandleSet_removeSocket(EthernetHandleSet self, const EthernetSocket sock); + /** * \brief wait for a socket to become ready *