From: Roy Marples Date: Mon, 10 Nov 2025 20:00:20 +0000 (+0000) Subject: eloop: exit all eloops when stopping on signals X-Git-Tag: v10.3.0~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9c69fb33d070fed3082e36b8d28ecd09c501ece3;p=thirdparty%2Fdhcpcd.git eloop: exit all eloops when stopping on signals --- diff --git a/src/dhcpcd.c b/src/dhcpcd.c index 5fdd7c1c..474debdd 100644 --- a/src/dhcpcd.c +++ b/src/dhcpcd.c @@ -1523,7 +1523,7 @@ dhcpcd_signal_cb(int sig, void *arg) dhcpcd_exiting = true; if (!(ctx->options & DHCPCD_TEST)) stop_all_interfaces(ctx, opts); - eloop_exit(ctx->eloop, exit_code); + eloop_exitall(exit_code); dhcpcd_exiting = false; } #endif diff --git a/src/eloop.c b/src/eloop.c index e53fc106..25da518b 100644 --- a/src/eloop.c +++ b/src/eloop.c @@ -120,6 +120,7 @@ struct eloop_timeout { }; struct eloop { + TAILQ_ENTRY(eloop) next; TAILQ_HEAD(event_head, eloop_event) events; size_t nevents; struct event_head free_events; @@ -152,6 +153,8 @@ struct eloop { bool events_invalid; }; +TAILQ_HEAD(eloop_head, eloop) eloops = TAILQ_HEAD_INITIALIZER(eloops); + #ifdef HAVE_REALLOCARRAY #define eloop_realloca reallocarray #else @@ -572,6 +575,17 @@ eloop_exit(struct eloop *eloop, int code) eloop->exitnow = true; } +void +eloop_exitall(int code) +{ + struct eloop *eloop; + + TAILQ_FOREACH(eloop, &eloops, next) { + eloop->exitcode = code; + eloop->exitnow = true; + } +} + #if defined(USE_KQUEUE) || defined(USE_EPOLL) static int eloop_open(struct eloop *eloop) @@ -580,6 +594,8 @@ eloop_open(struct eloop *eloop) #if defined(HAVE_KQUEUE1) fd = kqueue1(O_CLOEXEC); +#elif defined(KQUEUE_CLOEXEC) + fd = kqueuex(KQUEUE_CLOEXEC); #elif defined(USE_KQUEUE) int flags; @@ -850,6 +866,7 @@ eloop_new(void) } #endif + TAILQ_INSERT_TAIL(&eloops, eloop, next); return eloop; } @@ -886,6 +903,7 @@ eloop_free(struct eloop *eloop) close(eloop->fd); #endif free(eloop->fds); + TAILQ_REMOVE(&eloops, eloop, next); free(eloop); } diff --git a/src/eloop.h b/src/eloop.h index cbd88ec9..b342c37d 100644 --- a/src/eloop.h +++ b/src/eloop.h @@ -97,6 +97,7 @@ struct eloop *eloop_new(void); struct eloop *eloop_new_with_signals(struct eloop *); void eloop_free(struct eloop *); void eloop_exit(struct eloop *, int); +void eloop_exitall(int); int eloop_forked(struct eloop *, unsigned short); int eloop_start(struct eloop *);