From 547322cb0f19b37b1a584e9e6ee867e230c648d7 Mon Sep 17 00:00:00 2001 From: Renato Westphal Date: Tue, 3 Oct 2017 16:11:07 -0300 Subject: [PATCH] ldpd: detach stdin/stdout/stderr from the child processes 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 Signed-off-by: Renato Westphal --- ldpd/ldpd.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/ldpd/ldpd.c b/ldpd/ldpd.c index 95cd4ba366..a79e63229f 100644 --- a/ldpd/ldpd.c +++ b/ldpd/ldpd.c @@ -435,7 +435,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()) { @@ -449,6 +449,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) -- 2.39.5