service: Fix retriggering of init.d-scripts.
authorMarkus Gothe <markus.gothe@genexis.eu>
Mon, 28 Aug 2023 14:12:01 +0000 (14:12 +0000)
committerFelix Fietkau <nbd@nbd.name>
Mon, 27 Nov 2023 15:55:12 +0000 (16:55 +0100)
Fix retriggering of init.d-scripts which calls
commands dependent on functional STDIN/STDOUT/STDERR.

If we just close these file descriptors those commands
will not work as expected leading to unwanted
consequences. If we instead redirect the file descriptors
to /dev/null, we will end up the same end-result and these
commands will work as expected.

Signed-off-by: Markus Gothe <markus.gothe@genexis.eu>
Signed-off-by: Felix Fietkau <nbd@nbd.name> [refactor]
service/trigger.c

index 4af1474ae5f0ee81e0bf56e34a68a9911658d358..86cbc0f257678c2c31a5d36c2af28f624bce0273 100644 (file)
@@ -105,6 +105,7 @@ static void trigger_command_run(struct runqueue *q, struct runqueue_task *t)
        pid_t pid;
        int n = 0;
        int rem;
+       int fd;
 
        pid = fork();
        if (pid < 0) {
@@ -117,10 +118,12 @@ static void trigger_command_run(struct runqueue *q, struct runqueue_task *t)
                return;
        }
 
-       if (debug < 3) {
-               close(STDIN_FILENO);
-               close(STDOUT_FILENO);
-               close(STDERR_FILENO);
+       if (debug < 3 && (fd = open("/dev/null", O_RDWR)) >= 0) {
+               dup2(fd, STDIN_FILENO);
+               dup2(fd, STDOUT_FILENO);
+               dup2(fd, STDERR_FILENO);
+               if (fd > STDERR_FILENO)
+                       close(fd);
        }
 
        blobmsg_for_each_attr(cur, cmd->data, rem)