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