diff options
| author | Renato Westphal <renato@opensourcerouting.org> | 2017-10-03 16:11:07 -0300 | 
|---|---|---|
| committer | Renato Westphal <renato@opensourcerouting.org> | 2017-10-05 23:03:21 -0300 | 
| commit | b6c604315fa7402c21836240d34644fe96386e22 (patch) | |
| tree | 7cf9a0c2ddeeb63e6ac797d3261b24796659b5b5 /ldpd | |
| parent | 60b153acdf09032b83815873d7f10a1642148d29 (diff) | |
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 <mwinter@opensourcerouting.org>
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
Diffstat (limited to 'ldpd')
| -rw-r--r-- | ldpd/ldpd.c | 8 | 
1 files changed, 7 insertions, 1 deletions
diff --git a/ldpd/ldpd.c b/ldpd/ldpd.c index 303baf463b..e3510c210a 100644 --- a/ldpd/ldpd.c +++ b/ldpd/ldpd.c @@ -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)  | 
