summaryrefslogtreecommitdiffstats
path: root/ldpd
diff options
context:
space:
mode:
Diffstat (limited to 'ldpd')
-rw-r--r--ldpd/ldpd.c30
1 files changed, 23 insertions, 7 deletions
diff --git a/ldpd/ldpd.c b/ldpd/ldpd.c
index 255febeb6..b265c98da 100644
--- a/ldpd/ldpd.c
+++ b/ldpd/ldpd.c
@@ -406,16 +406,32 @@ ldpd_shutdown(void)
free(vty_conf);
log_debug("waiting for children to terminate");
- do {
+
+ while (true) {
+ /* Wait for child process. */
pid = wait(&status);
if (pid == -1) {
- if (errno != EINTR && errno != ECHILD)
- fatal("wait");
- } else if (WIFSIGNALED(status))
+ /* We got interrupted, try again. */
+ if (errno == EINTR)
+ continue;
+ /* No more processes were found. */
+ if (errno != ECHILD)
+ break;
+
+ /* Unhandled errno condition. */
+ fatal("wait");
+ /* UNREACHABLE */
+ }
+
+ /* We found something, lets announce it. */
+ if (WIFSIGNALED(status))
log_warnx("%s terminated; signal %d",
- (pid == lde_pid) ? "label decision engine" :
- "ldp engine", WTERMSIG(status));
- } while (pid != -1 || (pid == -1 && errno == EINTR));
+ (pid == lde_pid ? "label decision engine"
+ : "ldp engine"),
+ WTERMSIG(status));
+
+ /* Repeat until there are no more child processes. */
+ }
free(iev_ldpe);
free(iev_lde);