In some conditions, an application is interested in errors happening
on a file descriptor and might be able to resolve the issue in the
callback function.

This patch adds a flag to notify the uloop framework that errors
should be passed to the callback function, instead of silently 
removing the fd from the polling set.

Signed-off-by: Karl Vogel <karl.vo...@gmail.com>
Cc: Felix Fietkau <n...@openwrt.org>
---
 uloop.c |    6 ++++--
 uloop.h |    2 ++
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/uloop.c b/uloop.c
index 0566d80..d293edb 100644
--- a/uloop.c
+++ b/uloop.c
@@ -174,7 +174,8 @@ static int uloop_fetch_events(int timeout)
 
                if (events[n].flags & EV_ERROR) {
                        u->error = true;
-                       uloop_fd_delete(u);
+                       if (!(u->flags & ULOOP_ERROR_CB))
+                               uloop_fd_delete(u);
                }
 
                if(events[n].filter == EVFILT_READ)
@@ -268,7 +269,8 @@ static int uloop_fetch_events(int timeout)
 
                if (events[n].events & (EPOLLERR|EPOLLHUP)) {
                        u->error = true;
-                       uloop_fd_delete(u);
+                       if (!(u->flags & ULOOP_ERROR_CB))
+                               uloop_fd_delete(u);
                }
 
                if(!(events[n].events & 
(EPOLLRDHUP|EPOLLIN|EPOLLOUT|EPOLLERR|EPOLLHUP))) {
diff --git a/uloop.h b/uloop.h
index 98dd818..7564514 100644
--- a/uloop.h
+++ b/uloop.h
@@ -53,6 +53,8 @@ typedef void (*uloop_process_handler)(struct uloop_process 
*c, int ret);
 #define ULOOP_EDGE_DEFER       (1 << 5)
 #endif
 
+#define ULOOP_ERROR_CB         (1 << 6)
+
 struct uloop_fd
 {
        uloop_fd_handler cb;
-- 
1.7.1
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to