X-Git-Url: https://git.distorted.org.uk/~mdw/secnet/blobdiff_plain/46d06c3918b0080af7e87db986612e23bde4a341..c72aa74324481a2ee642b1739baec10eb616cbca:/util.c diff --git a/util.c b/util.c index 0215f25..12e5208 100644 --- a/util.c +++ b/util.c @@ -227,6 +227,14 @@ void phase_hooks_init(void) LIST_INIT(&hooks[i]); } +void clear_phase_hooks(uint32_t phase) +{ + struct phase_hook *h, *htmp; + LIST_FOREACH_SAFE(h, &hooks[phase], entry, htmp) + free(h); + LIST_INIT(&hooks[phase]); +} + bool_t add_hook(uint32_t phase, hook_fn *fn, void *state) { struct phase_hook *h; @@ -613,6 +621,17 @@ int iaddr_socklen(const union iaddr *ia) } } +const char *pollbadbit(int revents) +{ +#define BADBIT(b) \ + if ((revents & b)) return #b + BADBIT(POLLERR); + BADBIT(POLLHUP); + /* POLLNVAL is handled by the event loop - see afterpoll_fn comment */ +#undef BADBIT + return 0; +} + enum async_linebuf_result async_linebuf_read(struct pollfd *pfd, struct buffer_if *buf, const char **emsg_out) @@ -620,12 +639,9 @@ async_linebuf_read(struct pollfd *pfd, struct buffer_if *buf, int revents=pfd->revents; #define BAD(m) do{ *emsg_out=(m); return async_linebuf_broken; }while(0) -#define BADBIT(b) \ - if (!(revents & b)) ; else BAD(#b) - BADBIT(POLLERR); - BADBIT(POLLHUP); - /* POLLNVAL is handled by the event loop - see afterpoll_fn comment */ -#undef BADBIT + + const char *badbit=pollbadbit(revents); + if (badbit) BAD(badbit); if (!(revents & POLLIN)) return async_linebuf_nothing;