From c32b5a749a0bff49ee8b760eed43140304be21e3 Mon Sep 17 00:00:00 2001 From: Joachim Wiberg Date: Sat, 30 Mar 2024 12:02:44 +0100 Subject: [PATCH] Refactor popen()/pclose() logic in ifupdown calls Currently no code checks the return code of ifupdown at runlevel changes, but for future reference this code has been refactored to match the changes made in cbdb949 to fix issue #400. Signed-off-by: Joachim Wiberg --- src/helpers.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/helpers.c b/src/helpers.c index af13a39b..8768de81 100644 --- a/src/helpers.c +++ b/src/helpers.c @@ -522,9 +522,10 @@ void networking(int updown) pid = fork(); if (pid == 0) { - int rc = EX_OSERR; const char *cmd; + char buf[256]; FILE *pp; + int rc; setsid(); sig_unblock(); @@ -539,16 +540,16 @@ void networking(int updown) cmd = "ifdown -a -f 2>&1"; pp = popen(cmd, "r"); - if (pp) { - char buf[256]; + if (!pp) + _exit(EX_OSERR); - while (fgets(buf, sizeof(buf), pp)) - logit(LOG_NOTICE, "network: %s", chomp(buf)); + while (fgets(buf, sizeof(buf), pp)) + logit(LOG_NOTICE, "network: %s", chomp(buf)); - rc = pclose(pp); - } - - _exit(rc); + rc = pclose(pp); + if (rc == -1) + _exit(EX_OSERR); + _exit(WEXITSTATUS(rc)); } cgroup_service("network", pid, NULL); print(pid > 0 ? 0 : 1, "%s network interfaces ...",