]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
eloop: exit all eloops when stopping on signals
authorRoy Marples <roy@marples.name>
Mon, 10 Nov 2025 20:00:20 +0000 (20:00 +0000)
committerRoy Marples <roy@marples.name>
Mon, 10 Nov 2025 20:00:20 +0000 (20:00 +0000)
src/dhcpcd.c
src/eloop.c
src/eloop.h

index 5fdd7c1c400557bd0d4fde56db2572c7a50f3607..474debddc34c3f230cf8eb8de293a149e9fb53de 100644 (file)
@@ -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
index e53fc106eae700649659e035c310b6e88af5e323..25da518b75b9b55b37aa77139389c6ab27bc0399 100644 (file)
@@ -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);
 }
 
index cbd88ec93263f102ea2e2b4be3ddfbd89d821b14..b342c37db6065d62dd068156e8986f3030c7e902 100644 (file)
@@ -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 *);