Add a DAEMON_DOUBLE_FORK flag to make bb_daemonize double-fork so it isn't a
session leader, and hence doesn't get a controlling tty on Linux if a tty is
ever opened, similar to how libdaemon's daemon_fork or the big
start-stop-daemon does it - And use it in start-stop-daemon.

For details, see http://www.win.tue.nl/~aeb/linux/lk/lk-10.html#ss10.3

Signed-off-by: Peter Korsgaard <[email protected]>
---
 debianutils/start_stop_daemon.c |    2 +-
 include/libbb.h                 |    1 +
 libbb/vfork_daemon_rexec.c      |    7 +++++++
 3 files changed, 9 insertions(+), 1 deletions(-)

diff --git a/debianutils/start_stop_daemon.c b/debianutils/start_stop_daemon.c
index 02609c0..495ed0a 100644
--- a/debianutils/start_stop_daemon.c
+++ b/debianutils/start_stop_daemon.c
@@ -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
diff --git a/include/libbb.h b/include/libbb.h
index 53224fa..09e8d28 100644
--- a/include/libbb.h
+++ b/include/libbb.h
@@ -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 };
diff --git a/libbb/vfork_daemon_rexec.c b/libbb/vfork_daemon_rexec.c
index a75eafb..c7da675 100644
--- a/libbb/vfork_daemon_rexec.c
+++ b/libbb/vfork_daemon_rexec.c
@@ -258,6 +258,13 @@ void FAST_FUNC bb_daemonize_or_rexec(int flags, char 
**argv)
                dup2(fd, 0);
                dup2(fd, 1);
                dup2(fd, 2);
+
+               if (flags & DAEMON_DOUBLE_FORK) {
+                       /* double-fork to ensure child doesn't get controlling 
tty
+                          on Linux if a tty is opened */
+                       if (fork_or_rexec(argv))
+                               exit(EXIT_SUCCESS); /* parent */
+               }
        }
        while (fd > 2) {
                close(fd--);
-- 
1.7.6.3

_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to