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
};
struct eloop {
+ TAILQ_ENTRY(eloop) next;
TAILQ_HEAD(event_head, eloop_event) events;
size_t nevents;
struct event_head free_events;
bool events_invalid;
};
+TAILQ_HEAD(eloop_head, eloop) eloops = TAILQ_HEAD_INITIALIZER(eloops);
+
#ifdef HAVE_REALLOCARRAY
#define eloop_realloca reallocarray
#else
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)
#if defined(HAVE_KQUEUE1)
fd = kqueue1(O_CLOEXEC);
+#elif defined(KQUEUE_CLOEXEC)
+ fd = kqueuex(KQUEUE_CLOEXEC);
#elif defined(USE_KQUEUE)
int flags;
}
#endif
+ TAILQ_INSERT_TAIL(&eloops, eloop, next);
return eloop;
}
close(eloop->fd);
#endif
free(eloop->fds);
+ TAILQ_REMOVE(&eloops, eloop, next);
free(eloop);
}
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 *);