]> git.proxmox.com Git - mirror_frr.git/commitdiff
ldpd: detach stdin/stdout/stderr from the child processes
authorRenato Westphal <renato@opensourcerouting.org>
Tue, 3 Oct 2017 19:11:07 +0000 (16:11 -0300)
committerRenato Westphal <renato@opensourcerouting.org>
Fri, 6 Oct 2017 02:03:21 +0000 (23:03 -0300)
Doing a "ssh user@node 'ldpd -d'" was making the SSH session hang. In
the original OpenBSD's ldpd(8) daemon, the daemon function takes care
of connecting stdin/stdout/stderr to /dev/null. In the FRR port, this
only happens in the frr_run() function, after all children have been
forked. Ideally we could try to rearrange libfrr.c and ldpd.c in a way
that start_child() is called only after the parent connects the standard
I/O streams to /dev/null. But since this issue needs an immediate
fix, let's do this workaround for now. Note: even when running on the
foreground, all log messages from the child processes are sent to the
parent process, which then prints the messages to stdout/stderr and/or
to a log file.

Reported-by: Martin Winter <mwinter@opensourcerouting.org>
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
ldpd/ldpd.c

index 303baf463b43150bbaf26bb0f578edfef6e9a306..e3510c210a735d2c27c753c919bbb25c3a1de2ad 100644 (file)
@@ -450,7 +450,7 @@ static pid_t
 start_child(enum ldpd_process p, char *argv0, int fd_async, int fd_sync)
 {
        char    *argv[3];
-       int      argc = 0;
+       int      argc = 0, nullfd;
        pid_t    pid;
 
        switch (pid = fork()) {
@@ -464,6 +464,12 @@ start_child(enum ldpd_process p, char *argv0, int fd_async, int fd_sync)
                return (pid);
        }
 
+       nullfd = open("/dev/null", O_RDONLY | O_NOCTTY);
+       dup2(nullfd, 0);
+       dup2(nullfd, 1);
+       dup2(nullfd, 2);
+       close(nullfd);
+
        if (dup2(fd_async, LDPD_FD_ASYNC) == -1)
                fatal("cannot setup imsg async fd");
        if (dup2(fd_sync, LDPD_FD_SYNC) == -1)