Browse Source

service: Fix retriggering of init.d-scripts.

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]
Markus Gothe 8 months ago
parent
commit
d852f87792
1 changed files with 7 additions and 4 deletions
  1. 7 4
      service/trigger.c

+ 7 - 4
service/trigger.c

@@ -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)