bb_daemonize_or_rexec(): add flag to double-fork; use it in start-stop-daemon
No binary (build failed)
—
(log yok)
| @@ -474,7 +474,7 @@ int start_stop_daemon_main(int argc UNUSED_PARAM, char **argv) | |
| *--argv = startas; | |
| if (opt & OPT_BACKGROUND) { | |
| #if BB_MMU | |
| - | bb_daemonize(DAEMON_DEVNULL_STDIO + DAEMON_CLOSE_EXTRA_FDS); |
| + | bb_daemonize(DAEMON_DEVNULL_STDIO + DAEMON_CLOSE_EXTRA_FDS + DAEMON_DOUBLE_FORK); |
| /* DAEMON_DEVNULL_STDIO is superfluous - | |
| * it's always done by bb_daemonize() */ | |
| #else | |
| @@ -966,6 +966,7 @@ enum { | |
| DAEMON_DEVNULL_STDIO = 2, | |
| DAEMON_CLOSE_EXTRA_FDS = 4, | |
| DAEMON_ONLY_SANITIZE = 8, /* internal use */ | |
| + | DAEMON_DOUBLE_FORK = 16, /* double fork to avoid controlling tty */ |
| }; | |
| #if BB_MMU | |
| enum { re_execed = 0 }; | |
| @@ -253,11 +253,19 @@ void FAST_FUNC bb_daemonize_or_rexec(int flags, char **argv) | |
| if (!(flags & DAEMON_ONLY_SANITIZE)) { | |
| if (fork_or_rexec(argv)) | |
| exit(EXIT_SUCCESS); /* parent */ | |
| - | /* if daemonizing, make sure we detach from stdio & ctty */ |
| + | /* if daemonizing, detach from stdio & ctty */ |
| setsid(); | |
| dup2(fd, 0); | |
| dup2(fd, 1); | |
| dup2(fd, 2); | |
| + | if (flags & DAEMON_DOUBLE_FORK) { |
| + | /* On Linux, session leader can acquire ctty |
| + | * unknowingly, by opening a tty. |
| + | * Prevent this: stop being a session leader. |
| + | */ |
| + | if (fork_or_rexec(argv)) |
| + | exit(EXIT_SUCCESS); /* parent */ |
| + | } |
| } | |
| while (fd > 2) { | |
| close(fd--); | |